Messages in this thread | | | Date | Sat, 25 Jan 2003 15:44:54 -0800 (PST) | From | Davide Libenzi <> | Subject | Re: [patch] epoll for 2.4.20 updated ... |
| |
On Sat, 25 Jan 2003, J.A. Magallon wrote:
> > On 2003.01.25 Davide Libenzi wrote: > > > > I updated the 2.4.20 patch with the changes posted today and I fixed a > > little error about the wait queue function prototype : > > > > http://www.xmailserver.org/linux-patches/sys_epoll-2.4.20-0.61.diff > > > > Mixing epoll ontop of current aa, I found this: > > #define add_wait_queue_cond(q, wait, cond) \ > ({ \ > unsigned long flags; \ > int _raced = 0; \ > wq_write_lock_irqsave(&(q)->lock, flags); \ > (wait)->flags = 0; \ > __add_wait_queue((q), (wait)); \ > mb(); \ > if (!(cond)) { \ > _raced = 1; \ > __remove_wait_queue((q), (wait)); \ > } \ > wq_write_unlock_irqrestore(&(q)->lock, flags); \ > _raced; \ > }) > > this is the -aa version. Version from epoll uses just a rmb() barrier > (afaik, just a _read_ barrier). In -aa they are just the same, but I also > use a patch that does this: > > > +#ifdef CONFIG_X86_MFENCE > +#define mb() __asm__ __volatile__ ("mfence": : :"memory") > +#else > #define mb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory") > +#endif > + > +#ifdef CONFIG_X86_LFENCE > +#define rmb() __asm__ __volatile__ ("lfence": : :"memory") > +#else > #define rmb() mb() > +#endif > > so for modern processors they are different, and can affect performance and > correctness. So which one it the correct one for the above code snipet ?
It depends on what "cond" does. Being it a macro I'd feel safer with an mb().
- Davide
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |