Messages in this thread | | | From | Thomas Schlichter <> | Subject | Re: [PATCH][2.5] replace flush_map() in arch/i386/mm/pageattr.c w ith flush_tlb_all() | Date | Fri, 21 Feb 2003 15:25:01 +0100 |
| |
Yes, you are right. I was just looking for this preempt-problem where a flush_tlb* was done, but there are many other places where this problem occours, too... Nearly everywhere where smp_call_function() is used!
I found a function in the file mm/slab.c called smp_call_function_all_cpus() which tries to do the thing we want, but I think not even this function is preempt-safe...!
But here I think I better get off my fingers, I just wanted to help a bit with this issue, but I don't think I have the time and knowledge to solve it completely in the mentioned good way...
Perhaps even the semantic of the function smp_call_function() could be changed to call the function on every CPU? Just an idea...
Best regards Thomas Schlichter
On Fri, 21 Feb 2003 15:20, Dave Jones wrote: > On Fri, Feb 21, 2003 at 01:42:12PM +0100, Thomas Schlichter wrote: > > > No. All that does is make sure that the cpu you start out on is > > > flushed, once or twice, and the cpu you end up on may be missed. > > > Use preempt_disable and preempt_enable. > > > > Oh, you are right! I think I am totally stupid this morning...! > > Now finally I hope this is the correct patch... > > That would appear to do what you want, but its an ugly construct to > be repeating everywhere that wants to call a function on all CPUs. > It would probably clean things up a lot if we had a function to do.. > > static inline void on_each_cpu(void *func) > { > #ifdef CONFIG_SMP > preempt_disable(); > smp_call_function(func, NULL, 1, 1); > func(NULL); > preempt_enable(); > #else > func(NULL); > #endif > } > > Bluesmoke and agpgart could both use this to cleanup some mess, > and no doubt there are others > > Comments? > > Dave [unhandled content-type:application/pgp-signature] | |