On Wed, Feb 05 2025 at 21:46, Waiman Long wrote:
On 2/5/25 4:20 AM, Thomas Gleixner wrote:There are two ways to get there:
It is because I am not sure if there can only be one instance of+int set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler)What's the point of this cmpxchg()? What's the concurrency problem this
+{
+ struct nmi_desc *desc = nmi_to_desc(type);
+ nmi_handler_t orig = NULL;
+
+ if (!handler) {
+ orig = READ_ONCE(desc->emerg_handler);
+ WARN_ON_ONCE(!orig);
+ }
+
+ if (try_cmpxchg(&desc->emerg_handler, &orig, handler))
+ return 0;
tries to address?
nmi_shootdown_cpus() at any time. If there can't be more than one
instance, I can remove the atomic instruction.
1) crash(), which installs a handler
2) emergency_reboot(), which sets the handler to NULL
If they interfere, then the callback is the least of your
worries. That's already broken today in so many other ways.