Re: [patch] epoll for 2.4.20 updated ...

Davide Libenzi (davidel@xmailserver.org)
Sat, 25 Jan 2003 15:44:54 -0800 (PST)


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/