bus_managers/scsi: Use kernel mutex API directly and not through a wrapper.

No functional change intended.
This commit is contained in:
Augustin Cavalier
2022-02-11 15:06:41 -05:00
parent 8016cfee1a
commit b4f4368b2b
7 changed files with 44 additions and 58 deletions
@@ -132,11 +132,7 @@ scsi_create_bus(device_node *node, uint8 path_id)
goto err4;
}
res = INIT_BEN(&bus->mutex, "scsi_bus_mutex");
if (res < B_OK)
goto err3;
mutex_init(&bus->mutex, "scsi_bus_mutex");
spinlock_irq_init(&bus->dpc_lock);
res = scsi_init_ccb_alloc(bus);
@@ -158,8 +154,7 @@ scsi_create_bus(device_node *node, uint8 path_id)
err1:
scsi_uninit_ccb_alloc(bus);
err2:
DELETE_BEN(&bus->mutex);
err3:
mutex_destroy(&bus->mutex);
delete_sem(bus->start_service);
err4:
delete_sem(bus->scan_lun_lock);
@@ -181,7 +176,7 @@ scsi_destroy_bus(scsi_bus_info *bus)
wait_for_thread(bus->service_thread, &retcode);
delete_sem(bus->start_service);
DELETE_BEN(&bus->mutex);
mutex_destroy(&bus->mutex);
delete_sem(bus->scan_lun_lock);
scsi_uninit_ccb_alloc(bus);
@@ -55,7 +55,7 @@ scsi_free_device(scsi_device_info *device)
scsi_dma_buffer_free(&device->dma_buffer);
DELETE_BEN(&device->dma_buffer_lock);
mutex_destroy(&device->dma_buffer_lock);
delete_sem(device->dma_buffer_owner);
free(device);
@@ -178,20 +178,18 @@ scsi_create_device(device_node *node, scsi_bus_info *bus,
scsi_dma_buffer_init(&device->dma_buffer);
if (INIT_BEN(&device->dma_buffer_lock, "dma_buffer") < 0)
goto err;
mutex_init(&device->dma_buffer_lock, "dma_buffer");
device->dma_buffer_owner = create_sem(1, "dma_buffer");
if (device->dma_buffer_owner < 0)
goto err2;
goto err;
register_kernel_daemon(scsi_dma_buffer_daemon, device, 5 * 10);
return device;
err2:
DELETE_BEN(&device->dma_buffer_lock);
err:
mutex_destroy(&device->dma_buffer_lock);
free(device);
return NULL;
}
@@ -364,14 +364,14 @@ scsi_get_dma_buffer(scsi_ccb *request)
acquire_sem(device->dma_buffer_owner);
// make sure, clean-up daemon doesn't bother us
ACQUIRE_BEN(&device->dma_buffer_lock);
mutex_lock(&device->dma_buffer_lock);
// there is only one buffer, so no further management
buffer = &device->dma_buffer;
buffer->inuse = true;
RELEASE_BEN(&device->dma_buffer_lock);
mutex_unlock(&device->dma_buffer_lock);
// memorize buffer for cleanup
request->dma_buffer = buffer;
@@ -412,12 +412,12 @@ scsi_get_dma_buffer(scsi_ccb *request)
err:
SHOW_INFO0(3, "error setting up DMA buffer");
ACQUIRE_BEN(&device->dma_buffer_lock);
mutex_lock(&device->dma_buffer_lock);
// some of this is probably not required, but I'm paranoid
buffer->inuse = false;
RELEASE_BEN(&device->dma_buffer_lock);
mutex_unlock(&device->dma_buffer_lock);
release_sem(device->dma_buffer_owner);
return false;
@@ -448,12 +448,12 @@ scsi_release_dma_buffer(scsi_ccb *request)
request->sg_count = buffer->orig_sg_count;
// free buffer
ACQUIRE_BEN(&device->dma_buffer_lock);
mutex_lock(&device->dma_buffer_lock);
buffer->last_use = system_time();
buffer->inuse = false;
RELEASE_BEN(&device->dma_buffer_lock);
mutex_unlock(&device->dma_buffer_lock);
release_sem(device->dma_buffer_owner);
@@ -469,7 +469,7 @@ scsi_dma_buffer_daemon(void *dev, int counter)
scsi_device_info *device = (scsi_device_info*)dev;
dma_buffer *buffer;
ACQUIRE_BEN(&device->dma_buffer_lock);
mutex_lock(&device->dma_buffer_lock);
buffer = &device->dma_buffer;
@@ -479,7 +479,7 @@ scsi_dma_buffer_daemon(void *dev, int counter)
scsi_free_dma_buffer_sg_orig(buffer);
}
RELEASE_BEN(&device->dma_buffer_lock);
mutex_unlock(&device->dma_buffer_lock);
}
@@ -235,7 +235,7 @@ static void scsi_unblock_bus_int( scsi_bus_info *bus, bool by_SIM )
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
was_servicable = scsi_can_service_bus( bus );
@@ -243,7 +243,7 @@ static void scsi_unblock_bus_int( scsi_bus_info *bus, bool by_SIM )
start_retry = !was_servicable && scsi_can_service_bus( bus );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
if( start_retry )
release_sem( bus->start_service );
@@ -265,7 +265,7 @@ static void scsi_unblock_device_int( scsi_device_info *device, bool by_SIM )
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
was_servicable = scsi_can_service_bus( bus );
@@ -277,7 +277,7 @@ static void scsi_unblock_device_int( scsi_device_info *device, bool by_SIM )
start_retry = !was_servicable && scsi_can_service_bus( bus );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
if( start_retry )
release_sem( bus->start_service );
@@ -298,7 +298,7 @@ void scsi_cont_send_bus( scsi_bus_info *bus )
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
was_servicable = scsi_can_service_bus( bus );
@@ -306,7 +306,7 @@ void scsi_cont_send_bus( scsi_bus_info *bus )
start_retry = !was_servicable && scsi_can_service_bus( bus );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
if( start_retry )
release_sem_etc( bus->start_service, 1, 0/*B_DO_NOT_RESCHEDULE*/ );
@@ -321,7 +321,7 @@ void scsi_cont_send_device( scsi_device_info *device )
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
was_servicable = scsi_can_service_bus( bus );
@@ -340,7 +340,7 @@ void scsi_cont_send_device( scsi_device_info *device )
start_retry = !was_servicable && scsi_can_service_bus( bus );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
// tell service thread if there are pending requests which
// weren't pending before
@@ -354,11 +354,11 @@ static void scsi_block_bus_int( scsi_bus_info *bus, bool by_SIM )
{
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
scsi_block_bus_nolock( bus, by_SIM );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
}
@@ -376,14 +376,14 @@ static void scsi_block_device_int( scsi_device_info *device, bool by_SIM )
SHOW_FLOW0( 3, "" );
ACQUIRE_BEN( &bus->mutex );
mutex_lock( &bus->mutex );
scsi_block_device_nolock( device, by_SIM );
// remove device from bus queue as it cannot be processed anymore
scsi_remove_device_queue( device );
RELEASE_BEN( &bus->mutex );
mutex_unlock( &bus->mutex );
}
@@ -13,6 +13,7 @@
#include <scsi_cmds.h>
#include <locked_pool.h>
#include <device_manager.h>
#include <lock.h>
#define debug_level_error 4
#define debug_level_info 4
@@ -34,7 +34,7 @@ scsi_requeue_request(scsi_ccb *request, bool bus_overflow)
request->state = SCSI_STATE_QUEUED;
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
was_servicable = scsi_can_service_bus(bus);
@@ -70,7 +70,7 @@ scsi_requeue_request(scsi_ccb *request, bool bus_overflow)
start_retry = !was_servicable && scsi_can_service_bus(bus);
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
// submit requests to other devices in case bus was overloaded
if (start_retry)
@@ -96,7 +96,7 @@ scsi_resubmit_request(scsi_ccb *request)
request->state = SCSI_STATE_QUEUED;
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
was_servicable = scsi_can_service_bus(bus);
@@ -126,7 +126,7 @@ scsi_resubmit_request(scsi_ccb *request)
start_retry = !was_servicable && scsi_can_service_bus(bus);
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
// let the service thread do the resubmit
if (start_retry)
@@ -219,13 +219,13 @@ scsi_device_queue_overflow(scsi_ccb *request, uint num_requests)
SHOW_INFO(2, "Restricting device queue to %d requests", num_requests);
// update slot count
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
diff_max_slots = device->total_slots - num_requests;
device->total_slots = num_requests;
device->left_slots -= diff_max_slots;
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
// requeue request, blocking further device requests
scsi_requeue_request(request, false);
@@ -263,7 +263,7 @@ scsi_request_finished(scsi_ccb *request, uint num_requests)
request->state = SCSI_STATE_FINISHED;
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
was_servicable = scsi_can_service_bus(bus);
@@ -305,7 +305,7 @@ scsi_request_finished(scsi_ccb *request, uint num_requests)
start_service = !was_servicable && scsi_can_service_bus(bus);
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
// tell service thread to submit new requests to SIM
// (do this ASAP to keep bus/device busy)
@@ -342,7 +342,7 @@ scsi_check_enqueue_request(scsi_ccb *request)
scsi_device_info *device = request->device;
bool execute;
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
// if device/bus is locked, or there are waiting requests
// or waiting devices (last condition makes sure we don't overtake
@@ -373,7 +373,7 @@ scsi_check_enqueue_request(scsi_ccb *request)
execute = true;
}
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
return execute;
}
@@ -539,12 +539,12 @@ scsi_abort(scsi_ccb *req_to_abort)
return SCSI_REQ_INVALID;
}
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
switch (req_to_abort->state) {
case SCSI_STATE_FINISHED:
case SCSI_STATE_SENT:
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
break;
case SCSI_STATE_QUEUED: {
@@ -557,7 +557,7 @@ scsi_abort(scsi_ccb *req_to_abort)
start_retry = scsi_can_service_bus(bus) && !was_servicable;
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
req_to_abort->subsys_status = SCSI_REQ_ABORTED;
@@ -589,7 +589,7 @@ bool
scsi_check_exec_service(scsi_bus_info *bus)
{
SHOW_FLOW0(3, "");
ACQUIRE_BEN(&bus->mutex);
mutex_lock(&bus->mutex);
if (scsi_can_service_bus(bus)) {
scsi_ccb *request;
@@ -623,7 +623,7 @@ scsi_check_exec_service(scsi_bus_info *bus)
SHOW_FLOW(1, "%" B_PRId64, device->last_sort);
}
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
request->state = SCSI_STATE_SENT;
bus->interface->scsi_io(bus->sim_cookie, request);
@@ -631,7 +631,7 @@ scsi_check_exec_service(scsi_bus_info *bus)
return true;
}
RELEASE_BEN(&bus->mutex);
mutex_unlock(&bus->mutex);
return false;
}
@@ -5,14 +5,6 @@
#include <lock.h>
// benaphores
#define INIT_BEN(x, prefix) (mutex_init_etc(x, prefix, MUTEX_FLAG_CLONE_NAME), \
B_OK)
#define DELETE_BEN(x) mutex_destroy(x)
#define ACQUIRE_BEN(x) mutex_lock(x)
#define RELEASE_BEN(x) mutex_unlock(x)
// debug output
#ifdef DEBUG_WAIT_ON_MSG