···165165extern void put_page_bootmem(struct page *page);166166#endif167167168168+/*169169+ * Lock for memory hotplug guarantees 1) all callbacks for memory hotplug170170+ * notifier will be called under this. 2) offline/online/add/remove memory171171+ * will not run simultaneously.172172+ */173173+168174void lock_memory_hotplug(void);169175void unlock_memory_hotplug(void);170176
+4
mm/memory_hotplug.c
···409409 int ret;410410 struct memory_notify arg;411411412412+ lock_memory_hotplug();412413 arg.start_pfn = pfn;413414 arg.nr_pages = nr_pages;414415 arg.status_change_nid = -1;···422421 ret = notifier_to_errno(ret);423422 if (ret) {424423 memory_notify(MEM_CANCEL_ONLINE, &arg);424424+ unlock_memory_hotplug();425425 return ret;426426 }427427 /*···447445 printk(KERN_DEBUG "online_pages %lx at %lx failed\n",448446 nr_pages, pfn);449447 memory_notify(MEM_CANCEL_ONLINE, &arg);448448+ unlock_memory_hotplug();450449 return ret;451450 }452451···472469473470 if (onlined_pages)474471 memory_notify(MEM_ONLINE, &arg);472472+ unlock_memory_hotplug();475473476474 return 0;477475}