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.