File tree Expand file tree Collapse file tree 1 file changed +12
-5
lines changed Expand file tree Collapse file tree 1 file changed +12
-5
lines changed Original file line number Diff line number Diff line change @@ -1506,11 +1506,18 @@ static inline u8 page_kasan_tag(const struct page *page)
1506
1506
1507
1507
static inline void page_kasan_tag_set (struct page * page , u8 tag )
1508
1508
{
1509
- if (kasan_enabled ()) {
1510
- tag ^= 0xff ;
1511
- page -> flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT );
1512
- page -> flags |= (tag & KASAN_TAG_MASK ) << KASAN_TAG_PGSHIFT ;
1513
- }
1509
+ unsigned long old_flags , flags ;
1510
+
1511
+ if (!kasan_enabled ())
1512
+ return ;
1513
+
1514
+ tag ^= 0xff ;
1515
+ old_flags = READ_ONCE (page -> flags );
1516
+ do {
1517
+ flags = old_flags ;
1518
+ flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT );
1519
+ flags |= (tag & KASAN_TAG_MASK ) << KASAN_TAG_PGSHIFT ;
1520
+ } while (unlikely (!try_cmpxchg (& page -> flags , & old_flags , flags )));
1514
1521
}
1515
1522
1516
1523
static inline void page_kasan_tag_reset (struct page * page )
You can’t perform that action at this time.
0 commit comments