Ordering / preemption of work in a workqueue preempt?
Hi, I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context. I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected. Questions: 1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible? 2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function? Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue. Thanks, Rajat
Hi Rajat, On Fri, Nov 15, 2013 at 7:16 AM, Rajat Jain <rajatjain@juniper.net> wrote:
Hi,
I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context.
I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected.
Questions:
1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible?
It is unlikely as workqueue would have internal queing of tasks.
2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function?
Do you mean the system has just one CPU, then there would be just one worker thread in the workqueue which will pick up requests one by one. Do you see multiple threads?
Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue.
Thanks,
Rajat
Rajat
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Fri, Nov 15, 2013 at 5:01 PM, Rajat Sharma <fs.rajat@gmail.com> wrote:
Hi Rajat,
On Fri, Nov 15, 2013 at 7:16 AM, Rajat Jain <rajatjain@juniper.net> wrote:
Hi,
I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context.
I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected.
Questions:
1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible?
It is unlikely as workqueue would have internal queing of tasks. And where is the code to back that up?
2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function?
What do you mean by 'one running instance of the function', did you mean workqueue function?AFAIK same instance of the work queue can't run on different CPU.You should write code such that it can be preempted by another instanceof the same workqueue but I think if you don't want that then you should call workqueue API with proper input parameters. Have a look at Documentation/workqueue.txt
Do you mean the system has just one CPU, then there would be just one worker thread in the workqueue which will pick up requests one by one. Do you see multiple threads?
Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue.
Thanks,
Rajat
Rajat
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Fri, Nov 15, 2013 at 5:01 PM, Rajat Sharma <fs.rajat@gmail.com> wrote:
Hi Rajat,
On Fri, Nov 15, 2013 at 7:16 AM, Rajat Jain <rajatjain@juniper.net> wrote:
Hi,
I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context.
I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected.
Questions:
1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible?
use alloc_ordered_workqueue: only one workqueue will be active at a time and it will execute in the queued sequence.
It is unlikely as workqueue would have internal queing of tasks.
2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function?
Do you mean the system has just one CPU, then there would be just one worker thread in the workqueue which will pick up requests one by one. Do you see multiple threads?
Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue.
Thanks,
Rajat
Rajat
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hi Rajat, On Fri, Nov 15, 2013 at 8:46 PM, Rajat Jain <rajatjain@juniper.net> wrote:
Hi,
I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context.
I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected.
You got it wrong here. bool queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) { bool ret = false; unsigned long flags; local_irq_save(flags); if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { __queue_work(cpu, wq, work); ret = true; } local_irq_restore(flags); return ret; } EXPORT_SYMBOL(queue_work_on); If you look at function queue_work_on, the function returns immediately if WORK_STRUCT_PENDING_BIT was already set. So in effect your second call to queue_work will just return. HTH Thanks, Arun
Questions:
1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible?
2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function?
Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue.
Thanks,
Rajat
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Mon, Nov 18, 2013 at 10:20 PM, Arun KS <getarunks@gmail.com> wrote:
Hi Rajat,
On Fri, Nov 15, 2013 at 8:46 PM, Rajat Jain <rajatjain@juniper.net> wrote:
Hi,
I have a single work queue, on which I have scheduled a worker function [using queue_work(wq, fn)] in interrupt context.
I get the interrupt twice before the work queue gets a chance to run, and hence the same function will get queued twice (with different private context - arguments etc) which is fine and expected.
You got it wrong here.
bool queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) { bool ret = false; unsigned long flags;
local_irq_save(flags);
if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { __queue_work(cpu, wq, work); ret = true; }
local_irq_restore(flags); return ret; } EXPORT_SYMBOL(queue_work_on);
If you look at function queue_work_on, the function returns immediately if WORK_STRUCT_PENDING_BIT was already set. So in effect your second call to queue_work will just return. Best thing to do is just disable interrupt as soon as you receive first interrupt and re-enable it when you think you can handle it.I hope you are not writing network driver where this sequence would cause unacceptable delays.
HTH
Thanks, Arun
Questions:
1) Is it possible that the instance that was queued by 2nd interrupt, can get to run BEFORE the instance that was queued by 1st interrupt? In other words, is reordering possible?
2) Is it possible that one running instance of the function, can get preempted by second instance of the same work queue? I read through http://lwn.net/Articles/511421/ and it talks about same work queue cannot run on different CPU, but I have doubt about single CPU. If If I am writing a worker function, does my code have to be ready that it can be preempted by another instance of the same function?
Please note that I understand that my worker function can preempted by other processes, my doubts are related to the same workqueue.
Thanks,
Rajat
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (4)
-
anish singh -
Arun KS -
Rajat Jain -
Rajat Sharma