Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753806AbdG2REK (ORCPT ); Sat, 29 Jul 2017 13:04:10 -0400 Received: from mga14.intel.com ([192.55.52.115]:37434 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752854AbdG2REJ (ORCPT ); Sat, 29 Jul 2017 13:04:09 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,431,1496127600"; d="scan'208";a="113394547" From: Liu Shuo To: linux-kernel@vger.kernel.org Cc: Liu Shuo , Boris Ostrovsky , Juergen Gross , Thomas Gleixner , David Vrabel , Ingo Molnar , Anoob Soman , Vitaly Kuznetsov , Len Brown , KarimAllah Ahmed , xen-devel@lists.xenproject.org (moderated list:XEN HYPERVISOR INTERFACE) Subject: [PATCH] xen/events: Fix interrupt lost during irq_disable and irq_enable Date: Sun, 30 Jul 2017 00:59:57 +0800 Message-Id: <1501347598-15084-1-git-send-email-shuo.a.liu@intel.com> X-Mailer: git-send-email 1.9.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1164 Lines: 33 Here is a device has xen-pirq-MSI interrupt. Dom0 might lost interrupt during driver irq_disable/irq_enable. Here is the scenario, 1. irq_disable -> disable_dynirq -> mask_evtchn(irq channel) 2. dev interrupt raised by HW and Xen mark its evtchn as pending 3. irq_enable -> startup_pirq -> eoi_pirq -> clear_evtchn(channel of irq) -> clear pending status 4. consume_one_event process the irq event without pending bit assert which result in interrupt lost once 5. No HW interrupt raising anymore. Now use enable_dynirq for enable_pirq of xen_pirq_chip to remove eoi_pirq when irq_enable. Signed-off-by: Liu Shuo --- drivers/xen/events/events_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c index bae1f5d3..2d43118 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c @@ -574,7 +574,7 @@ static void shutdown_pirq(struct irq_data *data) static void enable_pirq(struct irq_data *data) { - startup_pirq(data); + enable_dynirq(data); } static void disable_pirq(struct irq_data *data) -- 1.9.4