--- /dev/null
+From b7363e67b23e04c23c2a99437feefac7292a88bc Mon Sep 17 00:00:00 2001
+From: Sagi Grimberg <sagi@grimberg.me>
+Date: Wed, 8 Mar 2017 22:03:17 +0200
+Subject: IB/device: Convert ib-comp-wq to be CPU-bound
+
+From: Sagi Grimberg <sagi@grimberg.me>
+
+commit b7363e67b23e04c23c2a99437feefac7292a88bc upstream.
+
+This workqueue is used by our storage target mode ULPs
+via the new CQ API. Recent observations when working
+with very high-end flash storage devices reveal that
+UNBOUND workqueue threads can migrate between cpu cores
+and even numa nodes (although some numa locality is accounted
+for).
+
+While this attribute can be useful in some workloads,
+it does not fit in very nicely with the normal
+run-to-completion model we usually use in our target-mode
+ULPs and the block-mq irq<->cpu affinity facilities.
+
+The whole block-mq concept is that the completion will
+land on the same cpu where the submission was performed.
+The fact that our submitter thread is migrating cpus
+can break this locality.
+
+We assume that as a target mode ULP, we will serve multiple
+initiators/clients and we can spread the load enough without
+having to use unbound kworkers.
+
+Also, while we're at it, expose this workqueue via sysfs which
+is harmless and can be useful for debug.
+
+Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
+Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com>--
+Signed-off-by: Doug Ledford <dledford@redhat.com>
+Cc: Raju Rangoju <rajur@chelsio.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/infiniband/core/device.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/infiniband/core/device.c
++++ b/drivers/infiniband/core/device.c
+@@ -999,8 +999,7 @@ static int __init ib_core_init(void)
+ return -ENOMEM;
+
+ ib_comp_wq = alloc_workqueue("ib-comp-wq",
+- WQ_UNBOUND | WQ_HIGHPRI | WQ_MEM_RECLAIM,
+- WQ_UNBOUND_MAX_ACTIVE);
++ WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
+ if (!ib_comp_wq) {
+ ret = -ENOMEM;
+ goto err;