On Thu, Dec 10, 2020 at 11:55:21AM +0800, Muchun Song wrote: > +static inline void subpage_hwpoison_deliver(struct hstate *h, struct page *head) > +{ > + struct page *page = head; > + > + if (!free_vmemmap_pages_per_hpage(h)) > + return; > + > + if (PageHWPoison(head)) > + page = head + page_private(head + 4); > + > + /* > + * Move PageHWPoison flag from head page to the raw error page, > + * which makes any subpages rather than the error page reusable. > + */ > + if (page != head) { > + SetPageHWPoison(page); > + ClearPageHWPoison(head); > + } > +} I would make the names coherent. I am not definitely goot at names, but something like: hwpoison_subpage_{foo,bar} looks better. Also, could not subpage_hwpoison_deliver be rewritten like: static inline void subpage_hwpoison_deliver(struct hstate *h, struct page *head) { struct page *page; if (!PageHWPoison(head) || !free_vmemmap_pages_per_hpage(h)) return; page = head + page_private(head + 4); /* * Move PageHWPoison flag from head page to the raw error page, * which makes any subpages rather than the error page reusable. */ if (page != head) { SetPageHWPoison(page); ClearPageHWPoison(head); } } I think it is better code-wise. > + * Move PageHWPoison flag from head page to the raw error page, > + * which makes any subpages rather than the error page reusable. > + */ > + if (page != head) { > + SetPageHWPoison(page); > + ClearPageHWPoison(head); > + } I would put this in an else-if above: if (free_vmemmap_pages_per_hpage(h)) { set_page_private(head + 4, page - head); return; } else if (page != head) { SetPageHWPoison(page); ClearPageHWPoison(head); } or will we lose the optimization in case free_vmemmap_pages_per_hpage gets compiled out? -- Oscar Salvador SUSE L3