On 11/20, Oleg Nesterov wrote: > > So, if we have global A == B == 0, > > CPU_0 CPU_1 > > A = 1; B = 2; > mb(); mb(); > b = B; a = A; > > It could happen that a == b == 0, yes? Isn't this contradicts with definition > of mb?
I still can't relax, another attempt to "prove" this should not be possible on CPUs supported by Linux :) Let's suppose it is possible, then it should also be possible if CPU_1 does spin_lock() instead of mb() (spin_lock can't be "stronger"), yes? Now, int COND; wait_queue_head_t wq; my_wait() { add_wait_queue(&wq); for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); if (COND) break; schedule(); } remove_wait_queue(&wq); } my_wake() { COND = 1; wake_up(&wq); } this should be correct, but it is not! my_wait: task->state = TASK_UNINTERRUPTIBLE; // STORE mb(); if (COND) break; // LOAD my_wake: COND = 1; // STORE spin_lock(WQ.lock); spin_lock(runqueue.lock); // try_to_wake_up() if (!(task->state & TASK_UNINTERRUPTIBLE)) // LOAD goto out; So, my_wait() gets COND == 0, and goes to schedule in 'D' state. try_to_wake_up() reads ->state == TASK_RUNNING, and does nothing. Oleg. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/