From patchwork Wed Oct 12 07:58:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "lan,Tianyu" X-Patchwork-Id: 9372201 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 33D2960772 for ; Wed, 12 Oct 2016 08:01:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 267CA28E78 for ; Wed, 12 Oct 2016 08:01:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A6F729D02; Wed, 12 Oct 2016 08:01:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 35BCF29378 for ; Wed, 12 Oct 2016 08:01:27 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1buERV-0003lJ-8A; Wed, 12 Oct 2016 07:59:13 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1buERS-0003kM-4s for xen-devel@lists.xen.org; Wed, 12 Oct 2016 07:59:10 +0000 Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id 77/55-16745-D4DEDF75; Wed, 12 Oct 2016 07:59:09 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLLMWRWlGSWpSXmKPExsXS1taRouvz9m+ 4weQrRhZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa0b/7teMBetkKl5NfsPewNgg3sXIySEkUCGx b+U1NhBbQoBX4siyGawQtp9E36+3QHEuoJp+RokFLy6wgCTYBNQlTiyeyAhiiwjYSHx8PBesi FngOqNE07XTYJOEBbwlPt99DDaJRUBV4l7je6AGDg5eAReJrlYWEFNCQEFiziQbkApOAVeJqY f+sEPc4yLRtLODbQIj7wJGhlWMGsWpRWWpRbqGZnpJRZnpGSW5iZk5uoYGpnq5qcXFiempOYl JxXrJ+bmbGIHBwAAEOxjPn/Y8xCjJwaQkypvL9zdciC8pP6UyI7E4I76oNCe1+BCjDAeHkgRv 3BugnGBRanpqRVpmDjAsYdISHDxKIrwVIGne4oLE3OLMdIjUKUZFKXFefZCEAEgiozQPrg0WC 5cYZaWEeRmBDhHiKUgtys0sQZV/xSjOwagkzFsHMoUnM68EbvoroMVMQIttJv0BWVySiJCSam CMSzfqcrZmtxUtm5k0Y6rwJJYfr9JMZhte0fkTOmGX83qRGwolBQ/zo3zmn227qO+9sl/7lW+ 1WX7IZy+mpTHx13pE1I62HVJg6W0vsD+6ZubO2Qkvv5ycpN2Vda5W/Omv5I1fJ/J2CKTve7n1 1qN7b3aw6ll865xQdHBqcJBNqT2To+6kxMtKLMUZiYZazEXFiQCrjPl+gAIAAA== X-Env-Sender: tianyu.lan@intel.com X-Msg-Ref: server-12.tower-206.messagelabs.com!1476259143!28082247!2 X-Originating-IP: [134.134.136.100] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 7763 invoked from network); 12 Oct 2016 07:59:08 -0000 Received: from mga07.intel.com (HELO mga07.intel.com) (134.134.136.100) by server-12.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 12 Oct 2016 07:59:08 -0000 Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga105.jf.intel.com with ESMTP; 12 Oct 2016 00:59:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,333,1473145200"; d="scan'208";a="18813335" Received: from lantianyu-ws.sh.intel.com (HELO localhost) ([10.239.159.159]) by orsmga005.jf.intel.com with ESMTP; 12 Oct 2016 00:59:05 -0700 From: Lan Tianyu To: xen-devel@lists.xenproject.org, xen-devel@lists.xen.org Date: Wed, 12 Oct 2016 15:58:23 +0800 Message-Id: <1476259105-16448-2-git-send-email-tianyu.lan@intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1476259105-16448-1-git-send-email-tianyu.lan@intel.com> References: <1476259105-16448-1-git-send-email-tianyu.lan@intel.com> Cc: Lan Tianyu , sstabellini@kernel.org, wei.liu2@citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, jbeulich@suse.com Subject: [Xen-devel] [PATCH v2 1/2] Xen/Keyhandler: Rework process of nonirq keyhandler X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Keyhandler may run for a long time in serial port driver's timer handler on the large machine with a lot of physical cpus(e,g dump_timerq()) when serial port driver works in the poll mode(via the exception mechanism). If a timer handler runs a long time, it will block nmi_timer_fn() to feed NMI watchdog and cause Xen hypervisor panic. Inserting process_pending_softirqs() in timer handler will not help. when timer interrupt arrives, timer subsystem calls all expired timer handlers before programming next timer interrupt. There is no timer interrupt arriving to trigger timer softirq during run a timer handler. This patch is to fix the issue to make nonirq keyhandler run in tasklet when receive debug key from serial port. Signed-off-by: Lan Tianyu --- xen/common/keyhandler.c | 8 +++++--- xen/common/sysctl.c | 2 +- xen/drivers/char/console.c | 2 +- xen/include/xen/keyhandler.h | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 16de6e8..3d50041 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -75,19 +75,21 @@ static struct keyhandler { static void keypress_action(unsigned long unused) { - handle_keypress(keypress_key, NULL); + console_start_log_everything(); + key_table[keypress_key].fn(keypress_key); + console_end_log_everything(); } static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0); -void handle_keypress(unsigned char key, struct cpu_user_regs *regs) +void handle_keypress(unsigned char key, struct cpu_user_regs *regs, bool async) { struct keyhandler *h; if ( key >= ARRAY_SIZE(key_table) || !(h = &key_table[key])->fn ) return; - if ( !in_irq() || h->irq_callback ) + if ( h->irq_callback || !async ) { console_start_log_everything(); h->irq_callback ? h->irq_fn(key, regs) : h->fn(key); diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 8aea6ef..1eb7bad 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -136,7 +136,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { if ( copy_from_guest_offset(&c, op->u.debug_keys.keys, i, 1) ) goto out; - handle_keypress(c, guest_cpu_user_regs()); + handle_keypress(c, guest_cpu_user_regs(), false); } ret = 0; copyback = 0; diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 55ae31a..184b523 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -347,7 +347,7 @@ static void switch_serial_input(void) static void __serial_rx(char c, struct cpu_user_regs *regs) { if ( xen_rx ) - return handle_keypress(c, regs); + return handle_keypress(c, regs, true); /* Deliver input to guest buffer, unless it is already full. */ if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE ) diff --git a/xen/include/xen/keyhandler.h b/xen/include/xen/keyhandler.h index 06c05c8..e9595bd 100644 --- a/xen/include/xen/keyhandler.h +++ b/xen/include/xen/keyhandler.h @@ -46,7 +46,9 @@ void register_irq_keyhandler(unsigned char key, bool_t diagnostic); /* Inject a keypress into the key-handling subsystem. */ -extern void handle_keypress(unsigned char key, struct cpu_user_regs *regs); +extern void handle_keypress(unsigned char key, + struct cpu_user_regs *regs, + bool async); /* Scratch space is available for use of any keyhandler. */ extern char keyhandler_scratch[1024];