]> git.karo-electronics.de Git - linux-beck.git/commitdiff
IB/iser: Introduce pi_enable, pi_guard module parameters
authorAlex Tabachnik <alext@mellanox.com>
Wed, 5 Mar 2014 17:43:46 +0000 (19:43 +0200)
committerRoland Dreier <roland@purestorage.com>
Tue, 18 Mar 2014 05:33:58 +0000 (22:33 -0700)
Use modparams to activate protection information support.

pi_enable bool: Based on this parameter iSER will know if it should
support T10-PI.  We don't want to do this by default as it requires to
allocate and initialize extra resources.  In case pi_enable=N, iSER
won't publish to SCSI midlayer any DIF capabilities.

pi_guard int: Based on this parameter iSER will publish DIX guard type
support to SCSI midlayer.  0 means CRC is allowed to be passed in DIX
buffers, 1 (or non-zero) means IP-CSUM is allowed to be passed in DIX
buffers.  Note that over the wire, only CRC is allowed.

In the next phase, it is worth considering passing these parameters
from iscsid via nlmsg.  This will allow these parameters to be
connection based rather than global.

Signed-off-by: Alex Tabachnik <alext@mellanox.com>
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/infiniband/ulp/iser/iser_verbs.c

index dd03cfe596d6b5c25364c357e99fd967cf55bda6..cfa952e9ac9009bcb75203438c563b6249b24444 100644 (file)
@@ -82,6 +82,8 @@ static unsigned int iscsi_max_lun = 512;
 module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
 
 int iser_debug_level = 0;
+bool iser_pi_enable = false;
+int iser_pi_guard = 0;
 
 MODULE_DESCRIPTION("iSER (iSCSI Extensions for RDMA) Datamover");
 MODULE_LICENSE("Dual BSD/GPL");
@@ -91,6 +93,12 @@ MODULE_VERSION(DRV_VER);
 module_param_named(debug_level, iser_debug_level, int, 0644);
 MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0 (default:disabled)");
 
+module_param_named(pi_enable, iser_pi_enable, bool, 0644);
+MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)");
+
+module_param_named(pi_guard, iser_pi_guard, int, 0644);
+MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:CRC)");
+
 struct iser_global ig;
 
 void
index 623defa187b252c833cf7641210e715c2865a343..011003f042534f6b961d0beb48287efe0fbbf008 100644 (file)
@@ -317,6 +317,7 @@ struct iser_conn {
        unsigned int                 rx_desc_head;
        struct iser_rx_desc          *rx_descs;
        struct ib_recv_wr            rx_wr[ISER_MIN_POSTED_RX];
+       bool                         pi_support;
 
        /* Connection memory registration pool */
        union {
@@ -371,6 +372,8 @@ struct iser_global {
 
 extern struct iser_global ig;
 extern int iser_debug_level;
+extern bool iser_pi_enable;
+extern int iser_pi_guard;
 
 /* allocate connection resources needed for rdma functionality */
 int iser_conn_set_full_featured_mode(struct iscsi_conn *conn);
index 6a5f4245182abafb0c4a98346ec3ab6e273e40cf..4c27f553df39115bb6361dcdb544cab1bc5b21a5 100644 (file)
@@ -607,6 +607,19 @@ static int iser_addr_handler(struct rdma_cm_id *cma_id)
        ib_conn = (struct iser_conn *)cma_id->context;
        ib_conn->device = device;
 
+       /* connection T10-PI support */
+       if (iser_pi_enable) {
+               if (!(device->dev_attr.device_cap_flags &
+                     IB_DEVICE_SIGNATURE_HANDOVER)) {
+                       iser_warn("T10-PI requested but not supported on %s, "
+                                 "continue without T10-PI\n",
+                                 ib_conn->device->ib_device->name);
+                       ib_conn->pi_support = false;
+               } else {
+                       ib_conn->pi_support = true;
+               }
+       }
+
        ret = rdma_resolve_route(cma_id, 1000);
        if (ret) {
                iser_err("resolve route failed: %d\n", ret);