aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2022-08-26 17:07:51 +0200
committerMarco Elver <elver@google.com>2022-08-29 14:15:36 +0200
commit91b713acf127ca9c543d2acedcc2a99cb57efca8 (patch)
tree9e19bcf616f4bdf1ea317b023ce01b2a00b8b991
parent7e7eba051cb7ccd0e6e7f225b27e41253a7be9a7 (diff)
downloadlinux-91b713acf127ca9c543d2acedcc2a99cb57efca8.tar.gz
kmsan: disable physical page merging in biovec
KMSAN metadata for adjacent physical pages may not be adjacent, therefore accessing such pages together may lead to metadata corruption. We disable merging pages in biovec to prevent such corruptions. Signed-off-by: Alexander Potapenko <glider@google.com> Signed-off-by: Marco Elver <elver@google.com>
-rw-r--r--block/blk.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/block/blk.h b/block/blk.h
index d7142c4d2fefb4..af02b93c1dba5a 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -88,6 +88,13 @@ static inline bool biovec_phys_mergeable(struct request_queue *q,
phys_addr_t addr1 = page_to_phys(vec1->bv_page) + vec1->bv_offset;
phys_addr_t addr2 = page_to_phys(vec2->bv_page) + vec2->bv_offset;
+ /*
+ * Merging adjacent physical pages may not work correctly under KMSAN
+ * if their metadata pages aren't adjacent. Just disable merging.
+ */
+ if (IS_ENABLED(CONFIG_KMSAN))
+ return false;
+
if (addr1 + vec1->bv_len != addr2)
return false;
if (xen_domain() && !xen_biovec_phys_mergeable(vec1, vec2->bv_page))