nvme-tcp: Set SO_PRIORITY for all host sockets
authorWunderlich, Mark <mark.wunderlich@intel.com>
Thu, 16 Jan 2020 00:46:12 +0000 (00:46 +0000)
committerKeith Busch <kbusch@kernel.org>
Wed, 4 Mar 2020 17:09:08 +0000 (09:09 -0800)
Enable ability to associate all sockets related to NVMf TCP traffic
to a priority group that will perform optimized network processing for
this traffic class. Maintain initial default behavior of using priority
of zero.

Signed-off-by: Kiran Patil <kiran.patil@intel.com>
Signed-off-by: Mark Wunderlich <mark.wunderlich@intel.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/tcp.c

index 49d4373b84eb392531d7ce6f60099a41c042907d..e384239af880a6d7bd08780db4edc0efa31f1fb7 100644 (file)
 
 struct nvme_tcp_queue;
 
+/* Define the socket priority to use for connections were it is desirable
+ * that the NIC consider performing optimized packet processing or filtering.
+ * A non-zero value being sufficient to indicate general consideration of any
+ * possible optimization.  Making it a module param allows for alternative
+ * values that may be unique for some NIC implementations.
+ */
+static int so_priority;
+module_param(so_priority, int, 0644);
+MODULE_PARM_DESC(so_priority, "nvme tcp socket optimize priority");
+
 enum nvme_tcp_send_state {
        NVME_TCP_SEND_CMD_PDU = 0,
        NVME_TCP_SEND_H2C_PDU,
@@ -1309,6 +1319,17 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl,
                goto err_sock;
        }
 
+       if (so_priority > 0) {
+               ret = kernel_setsockopt(queue->sock, SOL_SOCKET, SO_PRIORITY,
+                               (char *)&so_priority, sizeof(so_priority));
+               if (ret) {
+                       dev_err(ctrl->ctrl.device,
+                               "failed to set SO_PRIORITY sock opt, ret %d\n",
+                               ret);
+                       goto err_sock;
+               }
+       }
+
        /* Set socket type of service */
        if (nctrl->opts->tos >= 0) {
                opt = nctrl->opts->tos;