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 @@ -1507,11 +1507,18 @@ static inline u8 page_kasan_tag(const struct page *page)
1507
1507
1508
1508
static inline void page_kasan_tag_set (struct page * page , u8 tag )
1509
1509
{
1510
- if (kasan_enabled ()) {
1511
- tag ^= 0xff ;
1512
- page -> flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT );
1513
- page -> flags |= (tag & KASAN_TAG_MASK ) << KASAN_TAG_PGSHIFT ;
1514
- }
1510
+ unsigned long old_flags , flags ;
1511
+
1512
+ if (!kasan_enabled ())
1513
+ return ;
1514
+
1515
+ tag ^= 0xff ;
1516
+ old_flags = READ_ONCE (page -> flags );
1517
+ do {
1518
+ flags = old_flags ;
1519
+ flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT );
1520
+ flags |= (tag & KASAN_TAG_MASK ) << KASAN_TAG_PGSHIFT ;
1521
+ } while (unlikely (!try_cmpxchg (& page -> flags , & old_flags , flags )));
1515
1522
}
1516
1523
1517
1524
static inline void page_kasan_tag_reset (struct page * page )
You can’t perform that action at this time.
0 commit comments