work_struct not getting scheduled
Hi, At my end I was using tasklets to do some handling. But while doing the handling the handler had to sleep, so I had to switch to workqueues. I am scheduling a work as follows: INIT_WORK(&event->work, do_handling_work); schedule_work(&event->work); flush_scheduled_work(); But the work never gets scheduled. I have put some printks in the do_handling_work() function. Creating workqueue and queueing the work to that workqueue doen't work either. I find this a very strange problem. Does anybody knows about this? FYI: my system has heavy IO load when I schedule the work. Thanks
Hi! On 17:44 Thu 21 Apr , Pankaj B wrote: ...
INIT_WORK(&event->work, do_handling_work); schedule_work(&event->work); flush_scheduled_work();
But the work never gets scheduled. I have put some printks in the do_handling_work() function. Creating workqueue and queueing the work to that workqueue doen't work either. I find this a very strange problem. Does anybody knows about this?
FYI: my system has heavy IO load when I schedule the work.
1) Why call flush_scheduled_work? This function will wait until do_handling_work is finished. You could just call do_handling_work directly... 2) If you have heavy IO load, it might will up the workqueues. It should not cause total starvation. But if (1) did not solve your problem, try reproducing it while the system is idle. -Michi -- programing a layer 3+4 network protocol for mesh networks see http://michaelblizek.twilightparadox.com
On Thu, Apr 21, 2011 at 9:02 PM, Michael Blizek < michi1@michaelblizek.twilightparadox.com> wrote:
Hi!
On 17:44 Thu 21 Apr , Pankaj B wrote: ...
INIT_WORK(&event->work, do_handling_work); schedule_work(&event->work); flush_scheduled_work();
But the work never gets scheduled. I have put some printks in the do_handling_work() function. Creating workqueue and queueing the work to that workqueue doen't work either. I find this a very strange problem. Does anybody knows about this?
FYI: my system has heavy IO load when I schedule the work.
1) Why call flush_scheduled_work? This function will wait until do_handling_work is finished. You could just call do_handling_work directly...
do_handling_work is to be called/scheduled from the interrupt context. Actually I was not calling flush_scheduled_work() initially(it sleeps), I tried it because work was not getting scheduled. I can not call do_handling_work() directly because it sleeps.
2) If you have heavy IO load, it might will up the workqueues. It should not cause total starvation. But if (1) did not solve your problem, try reproducing it while the system is idle.
Work get scheduled when the system is idle. Somehow the work is getting scheduled now. I doubt another thread which was causing system to become non-responsive for most of the time. @Dave: I am using linux kernel 2.6.30.2 @Himanshu: Good point. I checked return value of schedule_work(), I am getting non-zero value which is expected. Thank you all.
Hi Pankaj, On Thu, Apr 21, 2011 at 5:14 AM, Pankaj B <xpankajbx@gmail.com> wrote:
Hi, At my end I was using tasklets to do some handling. But while doing the handling the handler had to sleep, so I had to switch to workqueues. I am scheduling a work as follows: INIT_WORK(&event->work, do_handling_work); schedule_work(&event->work); flush_scheduled_work(); But the work never gets scheduled. I have put some printks in the do_handling_work() function. Creating workqueue and queueing the work to that workqueue doen't work either. I find this a very strange problem. Does anybody knows about this? FYI: my system has heavy IO load when I schedule the work.
Which version of linux are you using? -- Dave Hylands Shuswap, BC, Canada http://www.davehylands.com
On Thu, Apr 21, 2011 at 9:29 PM, Dave Hylands <dhylands@gmail.com> wrote:
Hi Pankaj,
On Thu, Apr 21, 2011 at 5:14 AM, Pankaj B <xpankajbx@gmail.com> wrote:
Hi, At my end I was using tasklets to do some handling. But while doing the handling the handler had to sleep, so I had to switch to workqueues. I am scheduling a work as follows: INIT_WORK(&event->work, do_handling_work); schedule_work(&event->work); flush_scheduled_work(); But the work never gets scheduled. I have put some printks in the do_handling_work() function. Creating workqueue and queueing the work to that workqueue doen't work either. I find this a very strange problem. Does anybody knows about this? FYI: my system has heavy IO load when I schedule the work.
<snip from lwn> It turned out these functions were used in ~800 places, and in ~90% of them the return value was ignored! This is perhaps understandble, because the only way these functions can fail is if their work_struct argument is uninitialized or already in use. (Whether it's robust for callers to depend on this behavior remaining unchanged into the indefinite future is more questionable.) </snip from lwn> For more read: http://lwn.net/Articles/197318/ This might help you. Regards Himanshu
participants (4)
-
Dave Hylands -
Himanshu Chauhan -
Michael Blizek -
Pankaj B