diff -r 1edfea26a2a9 drivers/xen/netfront/accel.c --- a/drivers/xen/netfront/accel.c +++ b/drivers/xen/netfront/accel.c @@ -60,6 +60,9 @@ static struct list_head accelerators_lis /* Lock to protect access to accelerators_list */ static spinlock_t accelerators_lock; +/* Workqueue to process acceleration configuration changes */ +struct workqueue_struct *accel_watch_workqueue; + /* Mutex to prevent concurrent loads and suspends, etc. */ DEFINE_MUTEX(accelerator_mutex); @@ -67,12 +70,17 @@ void netif_init_accel(void) { INIT_LIST_HEAD(&accelerators_list); spin_lock_init(&accelerators_lock); + + accel_watch_workqueue = create_workqueue("accel_watch"); } void netif_exit_accel(void) { struct netfront_accelerator *accelerator, *tmp; unsigned long flags; + + flush_workqueue(accel_watch_workqueue); + destroy_workqueue(accel_watch_workqueue); spin_lock_irqsave(&accelerators_lock, flags); @@ -156,7 +164,7 @@ static void accel_watch_changed(struct x struct netfront_accel_vif_state *vif_state = container_of(watch, struct netfront_accel_vif_state, accel_watch); - schedule_work(&vif_state->accel_work); + queue_work(accel_watch_workqueue, &vif_state->accel_work); } @@ -191,7 +199,7 @@ void netfront_accelerator_remove_watch(s kfree(vif_state->accel_watch.node); vif_state->accel_watch.node = NULL; - flush_scheduled_work(); + flush_workqueue(accel_watch_workqueue); /* Clean up any state left from watch */ if (vif_state->accel_frontend != NULL) {