[openib-general] [PATCH] RDMA/iwcm: Get rid of extra call to list_empty()
Krishna Kumar2
krkumar2 at in.ibm.com
Sun Nov 12 21:30:46 PST 2006
Hi Tom & Sean,
> >
> > There may be a race here, but... Why wouldn't the second call into
> > cm_work_handler simply find the list empty on entry into the call?
>
> Basically, you've got a free work queue element sitting on the iwcm_wq.
What
> typically would happen is you'd end up corrupting the list because the
> cm_event_handler would enqueue the element, it would get freed in
> cm_work_handler with put_work, then cm_event_handler would call get_work
> (getting the one just freed that's also sitting on the iwcm_wq list) and
...
> bad things happen.
Actually I had anticipated this possible problem when I submitted the
patch, and I
have explained (given below) why it is not a problem :
"Doing the redundant queue_work() (if cm_work_handler is already running
processing the last entry) will not result in another call to
cm_work_handler
(run_workqueue) where no entry is found, since cm_work_handler will remove
all entries from the list, even ones that are added late".
Isn't that correct ? So if cm_work_handler() is already running and
processing
the LAST entry (anything but the last entry will not have an issue as a
new
queue_work would not be done by iwcm), it will next find this new entry in
it's
current run iteration, and process it. Meanwhile iwcm had done a redundant
"queue_work()" on this queue, which, besides adding the new entry to the
workqueue, also does a wakeup of "worker_thread" (which is still running
the
previous iteration of run_workqueue -> cm_work_handler). When
cm_work_handler finishes removing this new entry, it returns to
worker_thread,
which will do a schedule() which gets woken up again immediately due to
the
redundant "queue_work" done earlier, but then it checks whether the list
is empty
and since it is empty, it does another "schedule()" call. So that is what
I meant by
saying that another call to cm_work_handler() will NOT result (and where
that
redundant call would find no entry to process).
So I feel this patch is correct in it's original form. Comments or did I
misunderstand
the kernel code completely ?
Thanks,
- KK
>
> > As an
> > alternative, could you defer the list_del_init() call to the end of
the loop,
> > which would avoid scheduling cm_work_handler while it's running?
>
> Yeah, that's a good idea.
>
> >
> > - Sean
>
>
More information about the general
mailing list