Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0f4e013 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'ras-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull RAS fix from Thomas Gleixner:
 "The MCE atomic notifier callchain invokes callbacks which might sleep.

  Convert it to a blocking notifier and prevent calls from atomic
  context"

* 'ras-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/mce: Make the MCE notifier a blocking one
parents fa8d7cdc 0dc9c639
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -85,7 +85,7 @@ void mce_gen_pool_process(struct work_struct *__unused)
	head = llist_reverse_order(head);
	head = llist_reverse_order(head);
	llist_for_each_entry_safe(node, tmp, head, llnode) {
	llist_for_each_entry_safe(node, tmp, head, llnode) {
		mce = &node->mce;
		mce = &node->mce;
		atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, mce);
		blocking_notifier_call_chain(&x86_mce_decoder_chain, 0, mce);
		gen_pool_free(mce_evt_pool, (unsigned long)node, sizeof(*node));
		gen_pool_free(mce_evt_pool, (unsigned long)node, sizeof(*node));
	}
	}
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -13,7 +13,7 @@ enum severity_level {
	MCE_PANIC_SEVERITY,
	MCE_PANIC_SEVERITY,
};
};


extern struct atomic_notifier_head x86_mce_decoder_chain;
extern struct blocking_notifier_head x86_mce_decoder_chain;


#define ATTR_LEN		16
#define ATTR_LEN		16
#define INITIAL_CHECK_INTERVAL	5 * 60 /* 5 minutes */
#define INITIAL_CHECK_INTERVAL	5 * 60 /* 5 minutes */
+3 −14
Original line number Original line Diff line number Diff line
@@ -123,7 +123,7 @@ static void (*quirk_no_way_out)(int bank, struct mce *m, struct pt_regs *regs);
 * CPU/chipset specific EDAC code can register a notifier call here to print
 * CPU/chipset specific EDAC code can register a notifier call here to print
 * MCE errors in a human-readable form.
 * MCE errors in a human-readable form.
 */
 */
ATOMIC_NOTIFIER_HEAD(x86_mce_decoder_chain);
BLOCKING_NOTIFIER_HEAD(x86_mce_decoder_chain);


/* Do initial initialization of a struct mce */
/* Do initial initialization of a struct mce */
void mce_setup(struct mce *m)
void mce_setup(struct mce *m)
@@ -220,7 +220,7 @@ void mce_register_decode_chain(struct notifier_block *nb)


	WARN_ON(nb->priority > MCE_PRIO_LOWEST && nb->priority < MCE_PRIO_EDAC);
	WARN_ON(nb->priority > MCE_PRIO_LOWEST && nb->priority < MCE_PRIO_EDAC);


	atomic_notifier_chain_register(&x86_mce_decoder_chain, nb);
	blocking_notifier_chain_register(&x86_mce_decoder_chain, nb);
}
}
EXPORT_SYMBOL_GPL(mce_register_decode_chain);
EXPORT_SYMBOL_GPL(mce_register_decode_chain);


@@ -228,7 +228,7 @@ void mce_unregister_decode_chain(struct notifier_block *nb)
{
{
	atomic_dec(&num_notifiers);
	atomic_dec(&num_notifiers);


	atomic_notifier_chain_unregister(&x86_mce_decoder_chain, nb);
	blocking_notifier_chain_unregister(&x86_mce_decoder_chain, nb);
}
}
EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);
EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);


@@ -321,18 +321,7 @@ static void __print_mce(struct mce *m)


static void print_mce(struct mce *m)
static void print_mce(struct mce *m)
{
{
	int ret = 0;

	__print_mce(m);
	__print_mce(m);

	/*
	 * Print out human-readable details about the MCE error,
	 * (if the CPU has an implementation for that)
	 */
	ret = atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, m);
	if (ret == NOTIFY_STOP)
		return;

	pr_emerg_ratelimited(HW_ERR "Run the above through 'mcelog --ascii'\n");
	pr_emerg_ratelimited(HW_ERR "Run the above through 'mcelog --ascii'\n");
}
}