All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomasz Nowicki <tomasz.nowicki@linaro.org>
To: Borislav Petkov <bp@alien8.de>
Cc: rjw@rjwysocki.net, lenb@kernel.org, tony.luck@intel.com,
	bp@suse.de, m.chehab@samsung.com, linux-edac@vger.kernel.org,
	x86@kernel.org, linux-acpi@vger.kernel.org,
	linux-kernel@vger.kernel.org, linaro-acpi@lists.linaro.org
Subject: Re: [PATCH 4/7] acpi, apei, ghes: Factor out NMI error notification context.
Date: Mon, 26 May 2014 15:26:06 +0200	[thread overview]
Message-ID: <538340EE.7070408@linaro.org> (raw)
In-Reply-To: <20140523164824.GG21332@pd.tnic>

On 23.05.2014 18:48, Borislav Petkov wrote:
> On Fri, May 23, 2014 at 02:06:47PM +0200, Tomasz Nowicki wrote:
>> I had that thoughts too. Looking at simple MCE calls, yes, it does
>> make sense to create corresponding arch-specific version and provide
>> logic as needed. I think that NMI is much more complicated....
>
> How about this ontop of your patches. It builds here but it is not
> trivial for me to try it on !X86. Maybe you can test it quicker than me
> finding some other arch box first... :)
>

Now I do follow :) Nicely done, I have applied your patch and indeed 
there are more arch dependencies for !X86. I created another patch (it 
can be applied on top of last patch set). Does it look reasonable?


diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h
index 86f9301..0f03ab6 100644
--- a/arch/x86/include/asm/nmi.h
+++ b/arch/x86/include/asm/nmi.h
@@ -54,7 +54,18 @@ struct nmiaction {

  int __register_nmi_handler(unsigned int, struct nmiaction *);

-void unregister_nmi_handler(unsigned int, const char *);
+void unregister_nmi_handler(unsigned int type, const char *name);
+
+static inline int arch_apei_register_nmi(nmi_handler_t fn,
+					 const char *name)
+{
+	return register_nmi_handler(NMI_LOCAL, fn, 0, name);
+}
+
+static inline void arch_apei_unregister_nmi(const char *name)
+{
+	unregister_nmi_handler(NMI_LOCAL, name);
+}

  void stop_nmi(void);
  void restart_nmi(void);
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 35a44d9..84c79af 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -47,13 +47,11 @@
  #include <linux/genalloc.h>
  #include <linux/pci.h>
  #include <linux/aer.h>
+#include <linux/nmi.h>

  #include <acpi/ghes.h>
  #include <asm/apei.h>
  #include <asm/tlbflush.h>
-#ifdef CONFIG_ACPI_APEI_NMI
-#include <asm/nmi.h>
-#endif

  #include "apei-internal.h"

@@ -718,7 +716,6 @@ static int ghes_notify_sci(struct notifier_block *this,
  	return ret;
  }

-#ifdef CONFIG_ACPI_APEI_NMI
  /*
   * printk is not safe in NMI context.  So in NMI handler, we allocate
   * required memory from lock-less memory allocator
@@ -817,7 +814,7 @@ static int ghes_notify_nmi(unsigned int cmd, struct 
pt_regs *regs)
  {
  	struct ghes *ghes, *ghes_global = NULL;
  	int sev, sev_global = -1;
-	int ret = NMI_DONE;
+	int ret = APEI_NMI_DONE;

  	BUG_ON(!IS_ENABLED(CONFIG_ACPI_APEI_NMI));

@@ -832,14 +829,14 @@ static int ghes_notify_nmi(unsigned int cmd, 
struct pt_regs *regs)
  			sev_global = sev;
  			ghes_global = ghes;
  		}
-		ret = NMI_HANDLED;
+		ret = APEI_NMI_HANDLED;
  	}

-	if (ret == NMI_DONE)
+	if (ret == APEI_NMI_DONE)
  		goto out;

  	if (sev_global >= GHES_SEV_PANIC) {
-		oops_begin();
+		arch_apei_nmi_oops_begin();
  		ghes_print_queued_estatus();
  		__ghes_print_estatus(KERN_EMERG, ghes_global->generic,
  				     ghes_global->estatus);
@@ -914,7 +911,7 @@ static int ghes_notify_init_nmi(struct ghes *ghes)
  	ghes_estatus_pool_expand(len);
  	mutex_lock(&ghes_list_mutex);
  	if (list_empty(&ghes_nmi))
-		status = register_nmi_handler(NMI_LOCAL, ghes_notify_nmi, 0, "ghes");
+		status = arch_apei_register_nmi(ghes_notify_nmi, "ghes");
  	list_add_rcu(&ghes->list, &ghes_nmi);
  	mutex_unlock(&ghes_list_mutex);

@@ -928,7 +925,7 @@ static void ghes_notify_remove_nmi(struct ghes *ghes)
  	mutex_lock(&ghes_list_mutex);
  	list_del_rcu(&ghes->list);
  	if (list_empty(&ghes_nmi))
-		unregister_nmi_handler(NMI_LOCAL, "ghes");
+		arch_apei_unregister_nmi("ghes");
  	mutex_unlock(&ghes_list_mutex);
  	/*
  	 * To synchronize with NMI handler, ghes can only be
@@ -941,17 +938,14 @@ static void ghes_notify_remove_nmi(struct ghes *ghes)

  static void ghes_init_nmi(void)
  {
+	if (!IS_ENABLED(CONFIG_ACPI_APEI_NMI))
+		return;
+
  	init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
  	ghes_notify_tab[ACPI_HEST_NOTIFY_NMI].init_call = ghes_notify_init_nmi;
  	ghes_notify_tab[ACPI_HEST_NOTIFY_NMI].remove_call =
  							ghes_notify_remove_nmi;
  }
-#else
-static inline void ghes_init_nmi(void)
-{
-
-}
-#endif

  static int ghes_notify_init_polled(struct ghes *ghes)
  {
diff --git a/include/linux/nmi.h b/include/linux/nmi.h
index 084b4c5..1aa351c 100644
--- a/include/linux/nmi.h
+++ b/include/linux/nmi.h
@@ -56,4 +56,19 @@ extern int proc_dowatchdog(struct ctl_table *, int ,
  			   void __user *, size_t *, loff_t *);
  #endif

+#define APEI_NMI_DONE		0
+#define APEI_NMI_HANDLED	1
+
+#ifdef CONFIG_ACPI_APEI_NMI
+#include <asm/nmi.h>
+#define arch_apei_nmi_oops_begin()	oops_begin()
+#else
+#define arch_apei_register_nmi(fn, n) ({		\
+	void __attribute__((unused)) *dummy = fn;	\
+	(-ENOSYS);					\
+});
+#define arch_apei_unregister_nmi(n)
+#define arch_apei_nmi_oops_begin()
+#endif /* CONFIG_ACPI_APEI_NMI */
+
  #endif

Regards,
Tomasz

  reply	other threads:[~2014-05-26 13:25 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-09 15:14 [PATCH 0/7] APEI: Make APEI architecture independent Tomasz Nowicki
2014-04-09 15:14 ` [PATCH 1/7] apei, mce: Call MCE-specific code only for X86 architecture Tomasz Nowicki
2014-05-05 11:44   ` Borislav Petkov
2014-05-05 14:34     ` Tomasz Nowicki
2014-05-05 14:53       ` Borislav Petkov
2014-05-05 15:32         ` Tomasz Nowicki
2014-05-05 15:33           ` Borislav Petkov
2014-05-05 15:36             ` Tomasz Nowicki
2014-04-09 15:14 ` [PATCH 2/7] acpi, apei, ghes: Introduce more generic mechanism to init/deinit GHES error notifications Tomasz Nowicki
2014-05-13 18:13   ` Borislav Petkov
2014-05-15 14:31     ` Tomasz Nowicki
2014-05-21 18:11       ` Borislav Petkov
2014-04-09 15:14 ` [PATCH 3/7] ACPI, APEI, GHES: Introduce ACPI_APEI_NMI to make NMI error notification a GHES feature Tomasz Nowicki
2014-04-09 15:14 ` [PATCH 4/7] acpi, apei, ghes: Factor out NMI error notification context Tomasz Nowicki
2014-05-13 19:41   ` Borislav Petkov
2014-05-23 12:06     ` Tomasz Nowicki
2014-05-23 16:48       ` Borislav Petkov
2014-05-26 13:26         ` Tomasz Nowicki [this message]
2014-05-26 13:45           ` Borislav Petkov
2014-05-26 14:02             ` Tomasz Nowicki
2014-04-09 15:14 ` [PATCH 5/7] acpi, apei, ghes: Attach NMI init/deinit functions while CONFIG_ACPI_APEI_NMI is enabled Tomasz Nowicki
2014-05-13 19:49   ` Borislav Petkov
2014-04-09 15:14 ` [PATCH 6/7] acpi, apei, ghes: Make unmapping functionality independent from architecture Tomasz Nowicki
2014-05-13 20:11   ` Borislav Petkov
2014-05-14 12:32     ` Tomasz Nowicki
2014-05-14 12:35       ` Will Deacon
2014-05-14 12:45         ` Catalin Marinas
2014-05-14 12:48           ` Will Deacon
2014-05-14 12:52             ` Tomasz Nowicki
2014-05-14 13:21               ` Borislav Petkov
2014-04-09 15:14 ` [PATCH 7/7] acpi, apei, ghes: Factor out ioremap virtual memory for IRQ and NMI context Tomasz Nowicki
2014-05-14 17:13   ` Borislav Petkov
2014-05-05  9:25 ` [PATCH 0/7] APEI: Make APEI architecture independent Tomasz Nowicki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=538340EE.7070408@linaro.org \
    --to=tomasz.nowicki@linaro.org \
    --cc=bp@alien8.de \
    --cc=bp@suse.de \
    --cc=lenb@kernel.org \
    --cc=linaro-acpi@lists.linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-edac@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.chehab@samsung.com \
    --cc=rjw@rjwysocki.net \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.