megaraid_sas: Fastpath region lock bypass
authorSumit Saxena <sumit.saxena@avagotech.com>
Thu, 28 Jan 2016 15:34:27 +0000 (21:04 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 24 Feb 2016 02:27:02 +0000 (21:27 -0500)
Firmware will fill out per-LD data to tell driver whether a particular
LD supports region lock bypass. If yes, then driver will send non-FP
LDIO to region lock bypass FIFO. With this change in driver, firmware
will optimize certain code to improve performance.

Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_fp.c
drivers/scsi/megaraid/megaraid_sas_fusion.c
drivers/scsi/megaraid/megaraid_sas_fusion.h

index 773fc545d5809d43fe0c270a1d73f640a1655c48..01135be41751262eb3914f6f42c55b94be0b27f2 100644 (file)
@@ -1528,7 +1528,9 @@ union megasas_sgl_frame {
 typedef union _MFI_CAPABILITIES {
        struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-               u32     reserved:23;
+               u32     reserved:21;
+               u32     support_fp_rlbypass:1;
+               u32     support_vfid_in_ioframe:1;
                u32     support_ext_io_size:1;
                u32     support_ext_queue_depth:1;
                u32     security_protocol_cmds_fw:1;
@@ -1548,7 +1550,9 @@ typedef union _MFI_CAPABILITIES {
                u32     security_protocol_cmds_fw:1;
                u32     support_ext_queue_depth:1;
                u32     support_ext_io_size:1;
-               u32     reserved:23;
+               u32     support_vfid_in_ioframe:1;
+               u32     support_fp_rlbypass:1;
+               u32     reserved:21;
 #endif
        } mfi_capabilities;
        __le32          reg;
index 741509b3561776a874189ad1613984df86129ffe..e413113c86ac17924ae6cd7bce872444c217843a 100644 (file)
@@ -1020,6 +1020,8 @@ MR_BuildRaidContext(struct megasas_instance *instance,
        /* assume this IO needs the full row - we'll adjust if not true */
        regSize             = stripSize;
 
+       io_info->do_fp_rlbypass = raid->capability.fpBypassRegionLock;
+
        /* Check if we can send this I/O via FastPath */
        if (raid->capability.fpCapable) {
                if (isRead)
index 4b0c86c2fd3f5360be1b3ab82479f9972b535a67..518b48838cb4b3d04afe84f775fbd5a7666c12e5 100644 (file)
@@ -666,6 +666,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
        if (instance->max_chain_frame_sz > MEGASAS_CHAIN_FRAME_SZ_MIN)
                drv_ops->mfi_capabilities.support_ext_io_size = 1;
 
+       drv_ops->mfi_capabilities.support_fp_rlbypass = 1;
+
        /* Convert capability to LE32 */
        cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities);
 
@@ -1710,8 +1712,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
                        (MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
                         << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
                if (fusion->adapter_type == INVADER_SERIES) {
-                       if (io_request->RaidContext.regLockFlags ==
-                           REGION_TYPE_UNUSED)
+                       if (io_info.do_fp_rlbypass ||
+                               (io_request->RaidContext.regLockFlags == REGION_TYPE_UNUSED))
                                cmd->request_desc->SCSIIO.RequestFlags =
                                        (MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
                                        MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
index a1f1c0b8400c761d37650b0756a69ec8bc819a2c..db0978d0fc88829af72a51b7d3dc659cd5f8c1d4 100644 (file)
@@ -643,7 +643,8 @@ struct MR_SPAN_BLOCK_INFO {
 struct MR_LD_RAID {
        struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-               u32     reserved4:6;
+               u32     reserved4:5;
+               u32     fpBypassRegionLock:1;
                u32     tmCapable:1;
                u32     fpNonRWCapable:1;
                u32     fpReadAcrossStripe:1;
@@ -667,7 +668,8 @@ struct MR_LD_RAID {
                u32     fpReadAcrossStripe:1;
                u32     fpNonRWCapable:1;
                u32     tmCapable:1;
-               u32     reserved4:6;
+               u32     fpBypassRegionLock:1;
+               u32     reserved4:5;
 #endif
        } capability;
        __le32     reserved6;
@@ -737,7 +739,7 @@ struct IO_REQUEST_INFO {
        u8 fpOkForIo;
        u8 IoforUnevenSpan;
        u8 start_span;
-       u8 reserved;
+       u8 do_fp_rlbypass;
        u64 start_row;
        u8  span_arm;   /* span[7:5], arm[4:0] */
        u8  pd_after_lb;