>
> 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/