|
@@ -1789,6 +1789,7 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus,
|
|
struct hv_dr_state *dr;
|
|
struct hv_dr_state *dr;
|
|
struct hv_dr_work *dr_wrk;
|
|
struct hv_dr_work *dr_wrk;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
+ bool pending_dr;
|
|
|
|
|
|
dr_wrk = kzalloc(sizeof(*dr_wrk), GFP_NOWAIT);
|
|
dr_wrk = kzalloc(sizeof(*dr_wrk), GFP_NOWAIT);
|
|
if (!dr_wrk)
|
|
if (!dr_wrk)
|
|
@@ -1812,11 +1813,21 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus,
|
|
}
|
|
}
|
|
|
|
|
|
spin_lock_irqsave(&hbus->device_list_lock, flags);
|
|
spin_lock_irqsave(&hbus->device_list_lock, flags);
|
|
|
|
+ /*
|
|
|
|
+ * If pending_dr is true, we have already queued a work,
|
|
|
|
+ * which will see the new dr. Otherwise, we need to
|
|
|
|
+ * queue a new work.
|
|
|
|
+ */
|
|
|
|
+ pending_dr = !list_empty(&hbus->dr_list);
|
|
list_add_tail(&dr->list_entry, &hbus->dr_list);
|
|
list_add_tail(&dr->list_entry, &hbus->dr_list);
|
|
spin_unlock_irqrestore(&hbus->device_list_lock, flags);
|
|
spin_unlock_irqrestore(&hbus->device_list_lock, flags);
|
|
|
|
|
|
- get_hvpcibus(hbus);
|
|
|
|
- queue_work(hbus->wq, &dr_wrk->wrk);
|
|
|
|
|
|
+ if (pending_dr) {
|
|
|
|
+ kfree(dr_wrk);
|
|
|
|
+ } else {
|
|
|
|
+ get_hvpcibus(hbus);
|
|
|
|
+ queue_work(hbus->wq, &dr_wrk->wrk);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|