Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1980403imm; Sat, 23 Jun 2018 06:56:23 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI+DdPS7JO7v3CH1L6Ag6CyjWSB0L+1SzX6xGaairz994/aKe2Es5XpIBEEbAJYB3T3K/53 X-Received: by 2002:a62:e506:: with SMTP id n6-v6mr5952151pff.116.1529762183755; Sat, 23 Jun 2018 06:56:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529762183; cv=none; d=google.com; s=arc-20160816; b=RiLgUQwua80BTnnLyvc6y6wbxWj2MOG635RsjoAHv0Yjef/V9ZJYjoFecUknpxDlEa VZ0E6mA/zBD0xfJ+GWyV8RbQ8fRyIUNxsYAJMwBPN5Gm6qrBSGpHDZromDx2hB0QVtbg mRuw4wwTfDSFQG+J6+/ZocQsxa6CAWKSsMJOmgn9bEuJ8SnmG7iVk+sJZRuohr46L853 ii49jdfAO+w3zq9yvlWaCM7X19lHdPXtjTuEgCy8bjv0QTp3XWfM+W3nv7dK3CfTyvS1 q/LN1XRGkrdnXxCW/Gq31rXMryJdU//GJugy7FRUAEmIP5wGxPMFkr+6xjowIIe6WtlX K1gA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=cdlVcYNnuG+EMg4TGkWXZqroXKV0Gf9FTd5LMFbXKAM=; b=jPPTahP9voNUWeTkvn+B2iX5DAgCdSvH+ZTmJfKxCeYWxBb3TDBy9H23oJTD+lyclv p3yiitIbsHJFAU0CGMZSlXbGUFTPppLzfIDgxmSYj5PcWr22VL7ATuwjbxre6P9L+iPS YVrGyvdVV8JZ3hoRclW2+FKkCTB5XtGfM/K70mY4DVuyWan1GcvTiFJLAHAGVmRof6PS xqgPzkxOzZ19PtUmQJel9nWfQnv9yDKiDihsLuRz9LVc+qZvgZvaChkjZzE+RskUeyS8 uv5iUPY74ZV1mCg3iLPwdcX4tf06W6sq+a5MEl6pRxylrxnu3fY0Bp653ov43G2ORx0w cKdA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1-v6si9519947plo.20.2018.06.23.06.56.09; Sat, 23 Jun 2018 06:56:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751901AbeFWNvv (ORCPT + 99 others); Sat, 23 Jun 2018 09:51:51 -0400 Received: from mga12.intel.com ([192.55.52.136]:51087 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751389AbeFWNvu (ORCPT ); Sat, 23 Jun 2018 09:51:50 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Jun 2018 06:51:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,261,1526367600"; d="scan'208";a="69390223" Received: from dpdk-haiyue-s2600wfp.sh.intel.com ([10.67.111.114]) by orsmga002.jf.intel.com with ESMTP; 23 Jun 2018 06:51:47 -0700 From: Haiyue Wang To: minyard@acm.org, arnd@arndb.de, gregkh@linuxfoundation.org, openipmi-developer@lists.sourceforge.net, linux-kernel@vger.kernel.org Cc: Haiyue Wang , luis.a.silva@dell.com, avi.fishman@nuvoton.com, openbmc@lists.ozlabs.org Subject: [PATCH v2] ipmi: kcs_bmc: fix IRQ exception if the channel is not open Date: Sat, 23 Jun 2018 21:51:13 +0800 Message-Id: <1529761873-323254-1-git-send-email-haiyue.wang@linux.intel.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When kcs_bmc_handle_event calls kcs_force_abort function to handle the not open (no user running) KCS channel transaction, the returned status value -ENODEV causes the low level IRQ handler indicating that the irq was not for him by returning IRQ_NONE. After some time, this IRQ will be treated to be spurious one, and the exception dump happens. irq 30: nobody cared (try booting with the "irqpoll" option) CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.10.15-npcm750 #1 Hardware name: NPCMX50 Chip family [] (unwind_backtrace) from [] (show_stack+0x20/0x24) [] (show_stack) from [] (dump_stack+0x8c/0xa0) [] (dump_stack) from [] (__report_bad_irq+0x3c/0xdc) [] (__report_bad_irq) from [] (note_interrupt+0x29c/0x2ec) [] (note_interrupt) from [] (handle_irq_event_percpu+0x5c/0x68) [] (handle_irq_event_percpu) from [] (handle_irq_event+0x48/0x6c) [] (handle_irq_event) from [] (handle_fasteoi_irq+0xc8/0x198) [] (handle_fasteoi_irq) from [] (__handle_domain_irq+0x90/0xe8) [] (__handle_domain_irq) from [] (gic_handle_irq+0x58/0x9c) [] (gic_handle_irq) from [] (__irq_svc+0x6c/0x90) Exception stack(0xc0a01de8 to 0xc0a01e30) 1de0: 00002080 c0a6fbc0 00000000 00000000 00000000 c096d294 1e00: 00000000 00000001 dc406400 f03ff100 00000082 c0a01e94 c0a6fbc0 c0a01e38 1e20: 00200102 c01015bc 60000113 ffffffff [] (__irq_svc) from [] (__do_softirq+0xbc/0x358) [] (__do_softirq) from [] (irq_exit+0xb8/0xec) [] (irq_exit) from [] (__handle_domain_irq+0x94/0xe8) [] (__handle_domain_irq) from [] (gic_handle_irq+0x58/0x9c) [] (gic_handle_irq) from [] (__irq_svc+0x6c/0x90) Exception stack(0xc0a01ef8 to 0xc0a01f40) 1ee0: 00000000 000003ae 1f00: dcc0f338 c0111060 c0a00000 c0a0cc44 c0a0cbe4 c0a1c22b c07bc218 00000001 1f20: dcffca40 c0a01f54 c0a01f58 c0a01f48 c0103524 c0103528 60000013 ffffffff [] (__irq_svc) from [] (arch_cpu_idle+0x48/0x4c) [] (arch_cpu_idle) from [] (default_idle_call+0x30/0x3c) [] (default_idle_call) from [] (do_idle+0xc8/0x134) [] (do_idle) from [] (cpu_startup_entry+0x28/0x2c) [] (cpu_startup_entry) from [] (rest_init+0x84/0x88) [] (rest_init) from [] (start_kernel+0x388/0x394) [] (start_kernel) from [<0000807c>] (0x807c) handlers: [] npcm7xx_kcs_irq Disabling IRQ #30 It needs to change the returned status from -ENODEV to 0. The -ENODEV was originally used to tell the low level IRQ handler that no user was running, but not consider the IRQ handling desgin. And multiple KCS channels share one IRQ handler, it needs to check the IBF flag before doing force abort. If the IBF is set, after handling, return 0 to low level IRQ handler to indicate that the IRQ is handled. Signed-off-by: Haiyue Wang --- v1 -> v2: - Change the commit message to be more understandable. --- drivers/char/ipmi/kcs_bmc.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/drivers/char/ipmi/kcs_bmc.c b/drivers/char/ipmi/kcs_bmc.c index fbfc05e..bb882ab1 100644 --- a/drivers/char/ipmi/kcs_bmc.c +++ b/drivers/char/ipmi/kcs_bmc.c @@ -210,34 +210,23 @@ static void kcs_bmc_handle_cmd(struct kcs_bmc *kcs_bmc) int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc) { unsigned long flags; - int ret = 0; + int ret = -ENODATA; u8 status; spin_lock_irqsave(&kcs_bmc->lock, flags); - if (!kcs_bmc->running) { - kcs_force_abort(kcs_bmc); - ret = -ENODEV; - goto out_unlock; - } - - status = read_status(kcs_bmc) & (KCS_STATUS_IBF | KCS_STATUS_CMD_DAT); - - switch (status) { - case KCS_STATUS_IBF | KCS_STATUS_CMD_DAT: - kcs_bmc_handle_cmd(kcs_bmc); - break; - - case KCS_STATUS_IBF: - kcs_bmc_handle_data(kcs_bmc); - break; + status = read_status(kcs_bmc); + if (status & KCS_STATUS_IBF) { + if (!kcs_bmc->running) + kcs_force_abort(kcs_bmc); + else if (status & KCS_STATUS_CMD_DAT) + kcs_bmc_handle_cmd(kcs_bmc); + else + kcs_bmc_handle_data(kcs_bmc); - default: - ret = -ENODATA; - break; + ret = 0; } -out_unlock: spin_unlock_irqrestore(&kcs_bmc->lock, flags); return ret; -- 2.7.4