isci: make sgl explicit/aligned request object member
authorDan Williams <dan.j.williams@intel.com>
Sun, 8 May 2011 08:56:57 +0000 (01:56 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 11:04:47 +0000 (04:04 -0700)
Towards unifying request objects we need all members to be defined in the
object and not carved out of anonymous buffer space.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/scsi/isci/core/scic_sds_request.c
drivers/scsi/isci/core/scic_sds_request.h
drivers/scsi/isci/core/scic_sds_smp_request.c
drivers/scsi/isci/core/scic_sds_stp_request.c
drivers/scsi/isci/request.c
drivers/scsi/isci/request.h
drivers/scsi/isci/task.c

index fd7bd334fa4b27b64c5fe24f4fd5fe2bb9196401..189a7999726cd6666258f454f1299c19a9f32d3c 100644 (file)
@@ -212,8 +212,7 @@ static u32 scic_sds_ssp_request_get_object_size(void)
        return sizeof(struct scic_sds_request)
               + scic_ssp_io_request_get_object_size()
               + sizeof(struct scu_task_context)
-              + SMP_CACHE_BYTES
-              + sizeof(struct scu_sgl_element_pair) * SCU_MAX_SGL_ELEMENT_PAIRS;
+              + SMP_CACHE_BYTES;
 }
 
 /**
@@ -239,7 +238,7 @@ static struct scu_sgl_element_pair *scic_sds_request_get_sgl_element_pair(
                return &task_context->sgl_pair_cd;
        }
 
-       return &sci_req->sgl_element_pair_buffer[sgl_pair_index - 2];
+       return &sci_req->sg_table[sgl_pair_index - 2];
 }
 
 /**
@@ -328,11 +327,6 @@ static void scic_sds_ssp_io_request_assign_buffers(
                scic_sds_ssp_request_get_command_buffer(sci_req);
        sci_req->response_buffer =
                scic_sds_ssp_request_get_response_buffer(sci_req);
-       sci_req->sgl_element_pair_buffer =
-               scic_sds_ssp_request_get_sgl_element_buffer(sci_req);
-       sci_req->sgl_element_pair_buffer =
-               PTR_ALIGN(sci_req->sgl_element_pair_buffer,
-                         sizeof(struct scu_sgl_element_pair));
 
        if (sci_req->was_tag_assigned_by_user == false) {
                sci_req->task_context_buffer =
@@ -535,7 +529,6 @@ static void scic_sds_ssp_task_request_assign_buffers(
                scic_sds_ssp_task_request_get_command_buffer(sci_req);
        sci_req->response_buffer =
                scic_sds_ssp_task_request_get_response_buffer(sci_req);
-       sci_req->sgl_element_pair_buffer = NULL;
 
        if (sci_req->was_tag_assigned_by_user == false) {
                sci_req->task_context_buffer =
index c93f3ed8946da554e115cd7fdcff693f997d637e..83d737adbc4894511fe595c7dd8a3adaf0de0f1c 100644 (file)
@@ -60,6 +60,7 @@
 #include "sci_base_state_machine.h"
 #include "scu_task_context.h"
 #include "scic_sds_stp_request.h"
+#include "scu_constants.h"
 
 struct scic_sds_controller;
 struct scic_sds_remote_device;
@@ -183,7 +184,10 @@ struct scic_sds_request {
        void *command_buffer;
        void *response_buffer;
        struct scu_task_context *task_context_buffer;
-       struct scu_sgl_element_pair *sgl_element_pair_buffer;
+
+       /* could be larger with sg chaining */
+       #define SCU_SGL_SIZE ((SCU_IO_REQUEST_SGE_COUNT + 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
@@ -327,14 +331,6 @@ struct scic_sds_io_request_state_handler {
 
 extern const struct sci_base_state scic_sds_io_request_started_task_mgmt_substate_table[];
 
-/**
- *
- *
- * This macro returns the maximum number of SGL element paris that we will
- * support in a single IO request.
- */
-#define SCU_MAX_SGL_ELEMENT_PAIRS ((SCU_IO_REQUEST_SGE_COUNT + 1) / 2)
-
 /**
  * scic_sds_request_get_controller() -
  *
index 1f8773d3b79352d5fee50f4261161858988c5c34..cb1adef1d559f6c11af7c6ef0278731c59ddf852 100644 (file)
@@ -131,7 +131,6 @@ void scic_sds_smp_request_assign_buffers(
                scic_sds_smp_request_get_command_buffer(sci_req);
        sci_req->response_buffer =
                scic_sds_smp_request_get_response_buffer(sci_req);
-       sci_req->sgl_element_pair_buffer = NULL;
 
        if (sci_req->was_tag_assigned_by_user == false) {
                sci_req->task_context_buffer =
index 7dba40fc25853cd38f0662d36d22576f69198906..013af11df62bc8b387509dbe8a8a17c02a3576f4 100644 (file)
                 + SSP_RESP_IU_MAX_SIZE \
                 ))
 
-/**
- * scic_sds_stp_request_get_sgl_element_buffer() -
- *
- * This macro returns the address of the sgl elment pairs in the io request
- * memory buffer
- */
-#define scic_sds_stp_request_get_sgl_element_buffer(memory) \
-       ((struct scu_sgl_element_pair *)(\
-                ((char *)(scic_sds_stp_request_get_task_context_buffer(memory))) \
-                + sizeof(struct scu_task_context) \
-                ))
-
 /**
  *
  *
@@ -128,8 +116,7 @@ u32 scic_sds_stp_request_get_object_size(void)
               + sizeof(struct host_to_dev_fis)
               + sizeof(struct dev_to_host_fis)
               + sizeof(struct scu_task_context)
-              + SMP_CACHE_BYTES
-              + sizeof(struct scu_sgl_element_pair) * SCU_MAX_SGL_ELEMENT_PAIRS;
+              + SMP_CACHE_BYTES;
 }
 
 void scic_sds_stp_request_assign_buffers(struct scic_sds_request *sci_req)
@@ -138,9 +125,6 @@ void scic_sds_stp_request_assign_buffers(struct scic_sds_request *sci_req)
 
        sci_req->command_buffer = scic_sds_stp_request_get_h2d_reg_buffer(stp_req);
        sci_req->response_buffer = scic_sds_stp_request_get_response_buffer(stp_req);
-       sci_req->sgl_element_pair_buffer = scic_sds_stp_request_get_sgl_element_buffer(stp_req);
-       sci_req->sgl_element_pair_buffer = PTR_ALIGN(sci_req->sgl_element_pair_buffer,
-                                                    sizeof(struct scu_sgl_element_pair));
 
        if (sci_req->was_tag_assigned_by_user == false) {
                sci_req->task_context_buffer =
index e01c2c98f4e9c28f609836b5ed63c1bd182044bf..9dd971a3fbb290f874108d1164d69db127b6c64f 100644 (file)
@@ -200,14 +200,10 @@ static enum sci_status isci_io_request_build(
        /* build the common request object. For now,
         * we will let the core allocate the IO tag.
         */
-       status = scic_io_request_construct(
-               &isci_host->sci,
-               sci_device,
-               SCI_CONTROLLER_INVALID_IO_TAG,
-               request,
-               request->sci_request_mem_ptr,
-               (struct scic_sds_request **)&request->sci_request_handle
-               );
+       status = scic_io_request_construct(&isci_host->sci, sci_device,
+                                          SCI_CONTROLLER_INVALID_IO_TAG,
+                                          request, request->sci_req,
+                                          &request->sci_request_handle);
 
        if (status != SCI_SUCCESS) {
                dev_warn(&isci_host->pdev->dev,
@@ -277,8 +273,6 @@ static int isci_request_alloc_core(
 
        /* initialize the request object.       */
        spin_lock_init(&request->state_lock);
-       request->sci_request_mem_ptr = ((u8 *)request) +
-                                      sizeof(struct isci_request);
        request->request_daddr = handle;
        request->isci_host = isci_host;
        request->isci_device = isci_device;
index 9c97715e54d8c904292e999b15fc31aad6137de5..ddfbf71c97e53c80af70011de0bfd9017cc3ce7e 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#if !defined(_ISCI_REQUEST_H_)
+#ifndef _ISCI_REQUEST_H_
 #define _ISCI_REQUEST_H_
 
 #include "isci.h"
+#include "scic_sds_request.h"
 
 /**
  * struct isci_request_status - This enum defines the possible states of an I/O
@@ -80,16 +81,8 @@ enum task_type {
        tmf_task = 1
 };
 
-/**
- * struct isci_request - This class represents the request object used to track
- *    IO, smp and TMF request internal. It wraps the SCIC request object.
- *
- *
- */
 struct isci_request {
-
        struct scic_sds_request *sci_request_handle;
-
        enum isci_request_status status;
        enum task_type ttype;
        unsigned short io_tag;
@@ -105,7 +98,6 @@ struct isci_request {
        struct list_head completed_node;
        /* For use in the reqs_in_process list: */
        struct list_head dev_node;
-       void *sci_request_mem_ptr;
        spinlock_t state_lock;
        dma_addr_t request_daddr;
        dma_addr_t zero_scatter_daddr;
@@ -123,6 +115,7 @@ struct isci_request {
         * TMF was aborting is guaranteed to have completed.
         */
        struct completion *io_request_completion;
+       struct scic_sds_request sci_req[0] ____cacheline_aligned;
 };
 
 /**
index 12f2df947362601729038af50dcdf536775a98d2..7d5f7937845255341378cb79b4afd471b7065aad 100644 (file)
@@ -298,14 +298,10 @@ static enum sci_status isci_task_request_build(
                goto out;
 
        /* let the core do it's construct. */
-       status = scic_task_request_construct(
-               &isci_host->sci,
-               sci_device,
-               SCI_CONTROLLER_INVALID_IO_TAG,
-               request,
-               request->sci_request_mem_ptr,
-               &request->sci_request_handle
-               );
+       status = scic_task_request_construct(&isci_host->sci, sci_device,
+                                            SCI_CONTROLLER_INVALID_IO_TAG,
+                                            request, &request->sci_req,
+                                            &request->sci_request_handle);
 
        if (status != SCI_SUCCESS) {
                dev_warn(&isci_host->pdev->dev,