Messages in this thread | | | Date | Mon, 16 Sep 2013 07:59:29 -0400 | Subject | Re: Why does test_bit() take a volatile addr? | From | Linus Torvalds <> |
| |
On Mon, Sep 16, 2013 at 12:08 AM, Rusty Russell <rusty@rustcorp.com.au> wrote: > Predates git, does anyone remember the rationale? > > ie: > int test_bit(int nr, const volatile unsigned long *addr)
Both of Stephen Rothwell's guesses are correct.
One reason is that we used to use "volatile" a lot more than we do now, and "const volatile *" is the most permissive pointer that allows any use without warnings.
We've largely stopped using "volatile" in favor of explicit barriers and locks (ie "cpu_relax()" and "barrier()") and explicit volatility in code (ACCESS_ONCE() and "rcu_access_pointer()" etc).
The other reasons is for fear of having some old code that does effectively
while (condition) /* nothing */
using "test_bit()", and forcing a reload. They used to happen. They were rare even before, and I'd hope they are nonexistent now, but they were real.
We could try to see what happens if we remove "volatile" from the bitops these days. But the scary part is all the random drivers potentially doing that second thing. So it's not exactly easily testable. It would need to be worth it to bother.
Linus
| |