Skip to content

Instantly share code, notes, and snippets.

@davidlohr
Created May 20, 2019 18:20
Show Gist options
  • Save davidlohr/ce002f8ff49ac5f9d8d4565d22049ce3 to your computer and use it in GitHub Desktop.
Save davidlohr/ce002f8ff49ac5f9d8d4565d22049ce3 to your computer and use it in GitHub Desktop.
// 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