Created
May 20, 2019 18:20
-
-
Save davidlohr/ce002f8ff49ac5f9d8d4565d22049ce3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright (C) Davidlohr Bueso, 2018. | |
// | |
// Convert the infamous mmap_sem to a range lock. | |
// Usage within the kernel source: | |
// | |
// $ make coccicheck MODE=patch COCCI=/path/to/mmap_sem.cocci | |
virtual patch | |
virtual context | |
virtual org | |
virtual report | |
@r@ | |
identifier f; | |
expression mm; | |
@@ | |
f(...) | |
{ | |
+ DEFINE_RANGE_LOCK_FULL(mmrange); | |
<+... | |
- down_write_killable(&mm->mmap_sem) | |
+ mm_write_lock_killable(mm, &mmrange) | |
... | |
- up_write(&mm->mmap_sem) | |
+ mm_write_unlock(mm, &mmrange) | |
...+> | |
} | |
@r2@ | |
expression mm; | |
type T; | |
identifier i, fn; | |
@@ | |
T i; | |
+ DEFINE_RANGE_LOCK_FULL(mmrange); | |
... | |
\(down_write\|down_write_killable\|down_write_trylock\|down_read\|down_read_trylock\)(&mm->mmap_sem) | |
... | |
\(up_write\|up_read\)(&mm->mmap_sem) | |
... | |
// Raw wrapper conversions. | |
// | |
// After applying this rule, changes that break build | |
// due to not having 'mmrange' is because it doesn't | |
// fit the model for the rule above. Thus range needs | |
// to be passed via function argument, etc by manual | |
// inspection. | |
@r3@ | |
expression mm; | |
@@ | |
( | |
- down_write(&mm->mmap_sem) | |
+ mm_write_lock(mm, &mmrange) | |
| | |
- down_write_killable(&mm->mmap_sem) | |
+ mm_write_lock_killable(mm, &mmrange) | |
| | |
- down_write_trylock(&mm->mmap_sem) | |
+ mm_write_trylock(mm, &mmrange) | |
| | |
- downgrade_write(&mm->mmap_sem) | |
+ mm_downgrade_write(mm, &mmrange) | |
| | |
- up_write(&mm->mmap_sem) | |
+ mm_write_unlock(mm, &mmrange) | |
| | |
- down_read_trylock(&mm->mmap_sem) | |
+ mm_read_trylock(mm, &mmrange) | |
| | |
- down_read(&mm->mmap_sem) | |
+ mm_read_lock(mm, &mmrange) | |
| | |
- up_read(&mm->mmap_sem) | |
+ mm_read_unlock(mm, &mmrange) | |
| | |
- down_write_nested(&mm->mmap_sem, extra) | |
+ mm_write_lock_nested(mm, &mmrange, extra) | |
| | |
- down_write_nest_lock(&mm->mmap_sem, extra) | |
+ mm_write_nest_lock(mm, &mmrange, extra) | |
| | |
- rwsem_is_locked(&mm->mmap_sem) | |
+ mm_is_locked(mm, &mmrange) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment