This is delta to confirm before posting next revision.
Are you okay with this one?
diff --git a/include/linux/mm.h b/include/linux/mm.h
index cbf79eb790e0..7b2df6780552 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1626,14 +1626,14 @@ static inline bool page_needs_cow_for_dma(struct vm_area_struct *vma,
static inline bool is_pinnable_page(struct page *page)
{
#ifdef CONFIG_CMA
+ int mt = get_pageblock_migratetype(page);
+
/*
- * use volatile to use local variable mt instead of
- * refetching mt value.
+ * "&" operation would prevent compiler split up
+ * get_pageblock_migratetype two times for each
+ * condition check: refetching mt value two times.
*/
- int __mt = get_pageblock_migratetype(page);
- int mt = __READ_ONCE(__mt);
-
- if (mt == MIGRATE_CMA || mt == MIGRATE_ISOLATE)
+ if (mt & (MIGRATE_ISOLATE | MIGRATE_CMA))
return false;
#endif