* Peter Zijlstra (peterz@infradead.org) wrote:Hrm, you are right, the implementation I just proposed is bogus. (but so was yours) ;) func is an iterator on the funcs array. My typing of func is thus wrong, it should be void **. Otherwise I'm just incrementing the function address which is plain wrong. The read barrier is included in rcu_dereference() now. But given that we have to take a pointer to the array as an iterator, we would have to rcu_dereference() our iterator multiple times and then have many read barrier depends, which we don't need. This is why I would go back to a smp_read_barrier_depends(). Also, I use a NULL entry at the end of the funcs array as an end of array identifier. However, I cannot use this in the for loop both as a check for NULL array and check for NULL array element. This is why a if () test is needed in addition to the for loop test. (this is actually what is wrong in the implementation you proposed : you treat func both as a pointer to the function pointer array and as a function pointer) Something like this seems better : #define __DO_TRACE(tp, proto, args) \ do { \ void **it_func; \ \ preempt_disable(); \ it_func = (tp)->funcs; \ if (it_func) { \ smp_read_barrier_depends(); \ for (; *it_func; it_func++) \ ((void(*)(proto))(*it_func))(args); \ } \ preempt_enable(); \ } while (0) What do you think ? Mathieu -- Mathieu Desnoyers OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 --
| Hiten Pandya | Re: up? (emacs docbook xml ide) |
| Martin Michlmayr | Network slowdown due to CFS |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
git: | |
| Christos Zoulas | Re: Boot device confusion |
| Manuel Bouyer | Re: NFSv3 bug |
| Anders Magnusson | Re: setsockopt() compat issue |
| Martin Husemann | Re: Compressed vnd handling tested successfully |
