]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
xen: xen-pciback: Remove create_workqueue
authorBhaktipriya Shridhar <bhaktipriya96@gmail.com>
Wed, 1 Jun 2016 14:15:08 +0000 (19:45 +0530)
committerBob Liu <bob.liu@oracle.com>
Thu, 20 Oct 2016 07:57:16 +0000 (03:57 -0400)
System workqueues have been able to handle high level of concurrency
for a long time now and there's no reason to use dedicated workqueues
just to gain concurrency.  Replace dedicated xen_pcibk_wq with the
use of system_wq.

Unlike a dedicated per-cpu workqueue created with create_workqueue(),
system_wq allows multiple work items to overlap executions even on
the same CPU; however, a per-cpu workqueue doesn't have any CPU
locality or global ordering guarantees unless the target CPU is
explicitly specified and thus the increase of local concurrency shouldn't
make any difference.

Since the work items could be pending, flush_work() has been used in
xen_pcibk_disconnect(). xen_pcibk_xenbus_remove() calls free_pdev()
which in turn calls xen_pcibk_disconnect() for every pdev to ensure that
there is no pending task while disconnecting the driver.

Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
(cherry picked from commit 429eafe60943bdfa33b15540ab2db5642a1f8c3c)
Signed-off-by: Bob Liu <bob.liu@oracle.com>
Orabug: 24820937

drivers/xen/xen-pciback/pciback.h
drivers/xen/xen-pciback/pciback_ops.c
drivers/xen/xen-pciback/xenbus.c

index 4d529f3e40df93941c99f6fffee06da540f28ca2..7af369b6aaa29dda1b14b504d31cdb5d0b4b98f6 100644 (file)
@@ -55,7 +55,6 @@ struct xen_pcibk_dev_data {
 
 /* Used by XenBus and xen_pcibk_ops.c */
 extern wait_queue_head_t xen_pcibk_aer_wait_queue;
-extern struct workqueue_struct *xen_pcibk_wq;
 /* Used by pcistub.c and conf_space_quirks.c */
 extern struct list_head xen_pcibk_quirks;
 
index fb0221434f814aa49eef41f6aea7a60c86a4c817..c3cc79886fcd9fe26e55076cdd11a9ad44e6db5a 100644 (file)
@@ -310,7 +310,7 @@ void xen_pcibk_test_and_schedule_op(struct xen_pcibk_device *pdev)
         * already processing a request */
        if (test_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags)
            && !test_and_set_bit(_PDEVF_op_active, &pdev->flags)) {
-               queue_work(xen_pcibk_wq, &pdev->op_work);
+               schedule_work(&pdev->op_work);
        }
        /*_XEN_PCIB_active should have been cleared by pcifront. And also make
        sure xen_pcibk is waiting for ack by checking _PCIB_op_pending*/
index 4843741e703a336da72162af91165392f0560490..0a04e76de585f0e9fe33e0a4905fac91f229f0f0 100644 (file)
@@ -17,7 +17,6 @@
 #include "pciback.h"
 
 #define INVALID_EVTCHN_IRQ  (-1)
-struct workqueue_struct *xen_pcibk_wq;
 
 static bool __read_mostly passthrough;
 module_param(passthrough, bool, S_IRUGO);
@@ -76,8 +75,7 @@ static void xen_pcibk_disconnect(struct xen_pcibk_device *pdev)
        /* If the driver domain started an op, make sure we complete it
         * before releasing the shared memory */
 
-       /* Note, the workqueue does not use spinlocks at all.*/
-       flush_workqueue(xen_pcibk_wq);
+       flush_work(&pdev->op_work);
 
        if (pdev->sh_info != NULL) {
                xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_info);
@@ -733,11 +731,6 @@ const struct xen_pcibk_backend *__read_mostly xen_pcibk_backend;
 
 int __init xen_pcibk_xenbus_register(void)
 {
-       xen_pcibk_wq = create_workqueue("xen_pciback_workqueue");
-       if (!xen_pcibk_wq) {
-               pr_err("%s: create xen_pciback_workqueue failed\n", __func__);
-               return -EFAULT;
-       }
        xen_pcibk_backend = &xen_pcibk_vpci_backend;
        if (passthrough)
                xen_pcibk_backend = &xen_pcibk_passthrough_backend;
@@ -747,6 +740,5 @@ int __init xen_pcibk_xenbus_register(void)
 
 void __exit xen_pcibk_xenbus_unregister(void)
 {
-       destroy_workqueue(xen_pcibk_wq);
        xenbus_unregister_driver(&xen_pcibk_driver);
 }