On 05/31, Tejun Heo wrote:
On 05/31/2010 04:39 PM, Oleg Nesterov wrote:
quoted
What I can't understand is why we do have ->queue_seq and ->done_seq.
Isn't the single "bool poll->active" enough? vhost_poll_queue() sets
->active == T, vhost_poller() clears it before wake_up_all(poll->done).
I might have slightly over engineered this part not knowing the
expected workload. ->queue_seq/->done_seq pair is to guarantee that
flushers never get starved.
Ah, indeed.
Well, afaics we do not need 2 counters anyway, both vhost_poll_queue()
and vhost_poller() could increment the single counter and the flusher
can take bit 0 into account. But I agree 2 counters are much more clean.
quoted
quoted
+static int vhost_poller(void *data)
+{
+ struct vhost_dev *dev = data;
+ struct vhost_poll *poll;
+
+repeat:
+ set_current_state(TASK_INTERRUPTIBLE); /* mb paired w/ kthread_stop */
I don't understand the comment... why do we need this barrier?
So that either kthread_stop()'s should_stop = 1 in kthread_stop() is
visible to kthread_should_stop() or task state is set to RUNNING.
Of course, you are right. I am really surprized I asked this question ;)
Thanks,
Oleg.