|
@@ -50,6 +50,7 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/pci.h>
|
|
|
|
+#include <linux/delay.h>
|
|
#include <linux/semaphore.h>
|
|
#include <linux/semaphore.h>
|
|
#include <linux/irqdomain.h>
|
|
#include <linux/irqdomain.h>
|
|
#include <asm/irqdomain.h>
|
|
#include <asm/irqdomain.h>
|
|
@@ -1159,7 +1160,12 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
|
|
goto free_int_desc;
|
|
goto free_int_desc;
|
|
}
|
|
}
|
|
|
|
|
|
- wait_for_completion(&comp.comp_pkt.host_event);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Since this function is called with IRQ locks held, can't
|
|
|
|
+ * do normal wait for completion; instead poll.
|
|
|
|
+ */
|
|
|
|
+ while (!try_wait_for_completion(&comp.comp_pkt.host_event))
|
|
|
|
+ udelay(100);
|
|
|
|
|
|
if (comp.comp_pkt.completion_status < 0) {
|
|
if (comp.comp_pkt.completion_status < 0) {
|
|
dev_err(&hbus->hdev->device,
|
|
dev_err(&hbus->hdev->device,
|