On Thu, Aug 6, 2009 at 5:32 PM, Mike Christie <micha...@cs.wisc.edu> wrote: > > On 08/06/2009 05:26 AM, Erez Zilber wrote: >> On Wed, Aug 5, 2009 at 10:22 PM, Mike Christie<micha...@cs.wisc.edu> wrote: >>> On 08/05/2009 12:34 PM, Erez Zilber wrote: >>>>> I found it. The problem is that we will send the signal if the xmit >>>>> thread is running or not. If it is not running the workqueue code will >>>>> keep getting woken up to handle the signal, but because we have not >>>>> called queue_work the workqueue code will not let the thread run so we >>>>> never get to flush the signal until we reconnect and send down a login >>>>> pdu (the login pdu does a queue_work finally). >>>>> >>>> When you say "the xmit thread is running", I guess that you mean that >>>> the xmit thread is busy with IO, right? Note that I said that this >>> No. workqueue.c:worker_thread() is spinning. It is looping because there >>> is a signal pending, but the iscsi work code which has the flush_signals >>> is not getting run because there is no work queued. >>> >>> So you could add a >>> >>> if (signal_pending(current)) >>> flush_signals(current) >>> >>> to worker_thread() "for" loop and I think this will fix the problem. >>> >> >> Looks like this solves the problem. I've added the following patch to >> the centos 5.3 kernel (2.6.18-128.1.6.el5): >> >> diff --git a/kernel/workqueue.c b/kernel/workqueue.c >> index 8594efb..e148ed8 100644 >> --- a/kernel/workqueue.c >> +++ b/kernel/workqueue.c >> @@ -253,6 +253,9 @@ static int worker_thread(void *__cwq) >> >> set_current_state(TASK_INTERRUPTIBLE); >> while (!kthread_should_stop()) { >> + if (signal_pending(current)) >> + flush_signals(current); >> + >> add_wait_queue(&cwq->more_work,&wait); >> if (list_empty(&cwq->worklist)) >> schedule(); >> >> I'm running with open-iscsi.git + 2 commits from linux-2.6-iscsi.git >> (9c302cc45b70ecc4b606d65a445902381066061b& >> 75be23dc40ba2f215779d5ba60fda9a762271bbe). >> >> Will you push it upstream& into the RHEL kernel? >> > > I am not sure. I was thinking that switching from a workqueue to a > thread is the right thing to do. The drawback is that the workqueue is > nice when there are multiple sessions for a host like is done with > bnx2i, cxgb3i and be_iscsi. I can just queue_work and pass the > connection to send on. If I switch to a work_queue I have to add my own > code to do that. > > I am going to post a patch like you did to linux-kernel and see what > people say is best. If it goes in then I will port to RHEL. > > --~--~---------~--~----~------------~-------~--~----~ > You received this message because you are subscribed to the Google Groups > "open-iscsi" group. > To post to this group, send email to open-iscsi@googlegroups.com > To unsubscribe from this group, send email to > open-iscsi+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/open-iscsi > -~----------~----~----~----~------~----~------~--~--- > >
Mike, We had this discussion a long time ago. I don't remember what eventually happened with it. Did you push the workqueue patch to the kernel? What about the suspend-and-wake patch? Thanks, Erez -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To post to this group, send email to open-is...@googlegroups.com. To unsubscribe from this group, send email to open-iscsi+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/open-iscsi?hl=en.