Skip to content

Commit

Permalink
isci: combine request flags
Browse files Browse the repository at this point in the history
Combine three bools into one unsigned long 'flags'.  Doesn't increase the
request size due to packing. (to do: optimize the structure layout).

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Dan Williams committed Jul 3, 2011
1 parent 312e0c2 commit 38d8879
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 47 deletions.
48 changes: 21 additions & 27 deletions drivers/scsi/isci/request.c
Original file line number Diff line number Diff line change
Expand Up @@ -2183,7 +2183,7 @@ static void isci_request_set_open_reject_status(
enum sas_open_rej_reason open_rej_reason)
{
/* Task in the target is done. */
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
*response_ptr = SAS_TASK_UNDELIVERED;
*status_ptr = SAS_OPEN_REJECT;
*complete_to_host_ptr = isci_perform_normal_io_completion;
Expand Down Expand Up @@ -2248,7 +2248,7 @@ static void isci_request_handle_controller_specific_errors(
else
*status_ptr = SAS_ABORTED_TASK;

request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

*complete_to_host_ptr =
isci_perform_normal_io_completion;
Expand All @@ -2261,7 +2261,7 @@ static void isci_request_handle_controller_specific_errors(
else
*status_ptr = SAM_STAT_TASK_ABORTED;

request->complete_in_target = false;
clear_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

*complete_to_host_ptr =
isci_perform_error_io_completion;
Expand Down Expand Up @@ -2292,7 +2292,7 @@ static void isci_request_handle_controller_specific_errors(
else
*status_ptr = SAS_ABORTED_TASK;

request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

*complete_to_host_ptr = isci_perform_normal_io_completion;
break;
Expand Down Expand Up @@ -2397,11 +2397,11 @@ static void isci_request_handle_controller_specific_errors(
*status_ptr = SAM_STAT_TASK_ABORTED;

if (task->task_proto == SAS_PROTOCOL_SMP) {
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

*complete_to_host_ptr = isci_perform_normal_io_completion;
} else {
request->complete_in_target = false;
clear_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

*complete_to_host_ptr = isci_perform_error_io_completion;
}
Expand Down Expand Up @@ -2552,7 +2552,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
*
* The target is still there (since the TMF was successful).
*/
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
response = SAS_TASK_COMPLETE;

/* See if the device has been/is being stopped. Note
Expand All @@ -2579,7 +2579,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
* Aborting also means an external thread is explicitly managing
* this request, so that we do not complete it up the stack.
*/
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
response = SAS_TASK_UNDELIVERED;

if (!idev)
Expand All @@ -2605,7 +2605,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
* the device (reset, tear down, etc.), and the I/O needs
* to be completed up the stack.
*/
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
response = SAS_TASK_UNDELIVERED;

/* See if the device has been/is being stopped. Note
Expand Down Expand Up @@ -2675,7 +2675,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
/* use the task status set in the task struct by the
* isci_request_process_response_iu call.
*/
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
response = task->task_status.resp;
status = task->task_status.stat;
break;
Expand All @@ -2685,7 +2685,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,

response = SAS_TASK_COMPLETE;
status = SAM_STAT_GOOD;
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);

if (task->task_proto == SAS_PROTOCOL_SMP) {
void *rsp = &request->sci.smp.rsp;
Expand Down Expand Up @@ -2737,7 +2737,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
/* The request was terminated explicitly. No handling
* is needed in the SCSI error handler path.
*/
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
response = SAS_TASK_UNDELIVERED;

/* See if the device has been/is being stopped. Note
Expand Down Expand Up @@ -2777,7 +2777,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
status = SAM_STAT_TASK_ABORTED;

complete_to_host = isci_perform_error_io_completion;
request->complete_in_target = false;
clear_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
break;

case SCI_FAILURE_RETRY_REQUIRED:
Expand All @@ -2790,7 +2790,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
status = SAS_ABORTED_TASK;

complete_to_host = isci_perform_normal_io_completion;
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
break;


Expand All @@ -2813,10 +2813,10 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
status = SAS_ABORTED_TASK;

if (SAS_PROTOCOL_SMP == task->task_proto) {
request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
complete_to_host = isci_perform_normal_io_completion;
} else {
request->complete_in_target = false;
clear_bit(IREQ_COMPLETE_IN_TARGET, &request->flags);
complete_to_host = isci_perform_error_io_completion;
}
break;
Expand Down Expand Up @@ -2870,7 +2870,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host,
* terminated again, and to cause any calls into abort
* task to recognize the already completed case.
*/
request->terminated = true;
set_bit(IREQ_TERMINATED, &request->flags);
}

static void scic_sds_request_started_state_enter(struct sci_base_state_machine *sm)
Expand Down Expand Up @@ -2919,7 +2919,7 @@ static void scic_sds_request_completed_state_enter(struct sci_base_state_machine
struct isci_request *ireq = sci_req_to_ireq(sci_req);

/* Tell the SCI_USER that the IO request is complete */
if (sci_req->is_task_management_request == false)
if (!test_bit(IREQ_TMF, &ireq->flags))
isci_request_io_request_complete(ihost, ireq,
sci_req->sci_status);
else
Expand Down Expand Up @@ -3032,8 +3032,6 @@ scic_sds_general_request_construct(struct scic_sds_controller *scic,
sci_req->scu_status = 0;
sci_req->post_context = 0xFFFFFFFF;
sci_req->tc = &scic->task_context_table[ISCI_TAG_TCI(io_tag)];

sci_req->is_task_management_request = false;
WARN_ONCE(io_tag == SCI_CONTROLLER_INVALID_IO_TAG, "straggling invalid tag usage\n");
}

Expand Down Expand Up @@ -3077,7 +3075,7 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic,

if (dev->dev_type == SAS_END_DEV ||
dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) {
sci_req->is_task_management_request = true;
set_bit(IREQ_TMF, &sci_req_to_ireq(sci_req)->flags);
memset(sci_req->tc, 0, sizeof(struct scu_task_context));
} else
status = SCI_FAILURE_UNSUPPORTED_PROTOCOL;
Expand Down Expand Up @@ -3379,12 +3377,8 @@ static struct isci_request *isci_request_alloc_core(struct isci_host *ihost,
ireq->request_daddr = handle;
ireq->isci_host = ihost;
ireq->io_request_completion = NULL;
ireq->terminated = false;

ireq->flags = 0;
ireq->num_sg_entries = 0;

ireq->complete_in_target = false;

INIT_LIST_HEAD(&ireq->completed_node);
INIT_LIST_HEAD(&ireq->dev_node);

Expand Down Expand Up @@ -3496,7 +3490,7 @@ int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *ide
* hardware, so clear the request handle
* here so no terminations will be done.
*/
ireq->terminated = true;
set_bit(IREQ_TERMINATED, &ireq->flags);
isci_request_change_state(ireq, completed);
}
spin_unlock_irqrestore(&ihost->scic_lock, flags);
Expand Down
12 changes: 4 additions & 8 deletions drivers/scsi/isci/request.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,12 +209,6 @@ struct scic_sds_request {
#define SCU_SGL_SIZE ((SCI_MAX_SCATTER_GATHER_ELEMENTS + 1) / 2)
struct scu_sgl_element_pair sg_table[SCU_SGL_SIZE] __attribute__ ((aligned(32)));

/*
* This field indicates if this request is a task management request or
* normal IO request.
*/
bool is_task_management_request;

/*
* This field is a pointer to the stored rx frame data. It is used in
* STP internal requests and SMP response frames. If this field is
Expand Down Expand Up @@ -260,8 +254,10 @@ struct isci_request {
enum isci_request_status status;
enum task_type ttype;
unsigned short io_tag;
bool complete_in_target;
bool terminated;
#define IREQ_COMPLETE_IN_TARGET 0
#define IREQ_TERMINATED 1
#define IREQ_TMF 2
unsigned long flags;

union ttype_ptr_union {
struct sas_task *io_task_ptr; /* When ttype==io_task */
Expand Down
23 changes: 11 additions & 12 deletions drivers/scsi/isci/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,15 +558,15 @@ static void isci_terminate_request_core(
: NULL;

/* Note that we are not going to control
* the target to abort the request.
*/
isci_request->complete_in_target = true;
* the target to abort the request.
*/
set_bit(IREQ_COMPLETE_IN_TARGET, &isci_request->flags);

/* Make sure the request wasn't just sitting around signalling
* device condition (if the request handle is NULL, then the
* request completed but needed additional handling here).
*/
if (!isci_request->terminated) {
if (!test_bit(IREQ_TERMINATED, &isci_request->flags)) {
was_terminated = true;
needs_cleanup_handling = true;
status = scic_controller_terminate_request(
Expand Down Expand Up @@ -609,7 +609,7 @@ static void isci_terminate_request_core(
flags);

/* Check for state changes. */
if (!isci_request->terminated) {
if (!test_bit(IREQ_TERMINATED, &isci_request->flags)) {

/* The best we can do is to have the
* request die a silent death if it
Expand Down Expand Up @@ -1098,17 +1098,16 @@ int isci_task_abort_task(struct sas_task *task)
ret = TMF_RESP_FUNC_COMPLETE;
goto out;
}
if ((task->task_proto == SAS_PROTOCOL_SMP)
|| old_request->complete_in_target
) {
if (task->task_proto == SAS_PROTOCOL_SMP ||
test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags)) {

spin_unlock_irqrestore(&isci_host->scic_lock, flags);

dev_dbg(&isci_host->pdev->dev,
"%s: SMP request (%d)"
" or complete_in_target (%d), thus no TMF\n",
__func__, (task->task_proto == SAS_PROTOCOL_SMP),
old_request->complete_in_target);
test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags));

/* Set the state on the task. */
isci_task_all_done(task);
Expand Down Expand Up @@ -1136,7 +1135,7 @@ int isci_task_abort_task(struct sas_task *task)
__func__);
}
if (ret == TMF_RESP_FUNC_COMPLETE) {
old_request->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags);

/* Clean up the request on our side, and wait for the aborted
* I/O to complete.
Expand Down Expand Up @@ -1252,7 +1251,7 @@ isci_task_request_complete(struct isci_host *ihost,
isci_request_change_state(ireq, completed);

tmf->status = completion_status;
ireq->complete_in_target = true;
set_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags);

if (tmf->proto == SAS_PROTOCOL_SSP) {
memcpy(&tmf->resp.resp_iu,
Expand All @@ -1271,7 +1270,7 @@ isci_task_request_complete(struct isci_host *ihost,
/* set the 'terminated' flag handle to make sure it cannot be terminated
* or completed again.
*/
ireq->terminated = true;;
set_bit(IREQ_TERMINATED, &ireq->flags);

isci_request_change_state(ireq, unallocated);
list_del_init(&ireq->dev_node);
Expand Down

0 comments on commit 38d8879

Please sign in to comment.