workqueues - how to use them correctly
hi all, My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity. With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep. is this particular scenario considered bad or discouraged ? Thank you, -Roshan
On Tue, Feb 10, 2015 at 1:50 AM, Roshan A <roshan.len@gmail.com> wrote:
hi all,
My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity.
With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep.
You gain when most work items execute without contention. So perhaps you can redesign that your work handlers would execute most of the time without needing to lock. Perhaps you can send data to handler func exclusively from top-half. If you've anything global to maintain see if you can minimize the contention code.
is this particular scenario considered bad or discouraged ?
Thank you, -Roshan
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- ---P.K.S
On Feb 10, 2015, at 12:50 AM, Roshan A <roshan.len@gmail.com> wrote:
hi all,
My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity.
Post the code snippet and why are you using Mutex? If you want to synchronize between Interrupt handler and workqueue then you should use spinlocks.
With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep.
And precisely the reason not to use mutex locks.
is this particular scenario considered bad or discouraged ?
Now what do you think?
Thank you, -Roshan
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Tue, Feb 10, 2015 at 9:24 AM, Anish Kumar <anish198519851985@gmail.com> wrote:
On Feb 10, 2015, at 12:50 AM, Roshan A <roshan.len@gmail.com> wrote:
hi all,
My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity.
Post the code snippet and why are you using Mutex? If you want to synchronize between Interrupt handler and workqueue then you should use spinlocks.
To clarify : the critical section is in the workitem-function. There is no sharing between the interrupt handler and the bottom half.
With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep.
And precisely the reason not to use mutex locks.
is this particular scenario considered bad or discouraged ?
Now what do you think?
Thank you, -Roshan
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hello Roshan, On Tue, Feb 10, 2015 at 2:20 PM, Roshan A <roshan.len@gmail.com> wrote:
hi all,
My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity.
With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep.
is this particular scenario considered bad or discouraged ?
This should not happen if you are using the same work item. All workqueues are now non-reentrant - any work item is guaranteed to be executed by at most one worker system-wide at any given time. https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/kerne... Thanks, Arun
Thank you, -Roshan
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Thanks Arun for the link. This clears up things for me. On Wed, Feb 11, 2015 at 3:28 AM, Arun KS <getarunks@gmail.com> wrote:
Hello Roshan,
On Tue, Feb 10, 2015 at 2:20 PM, Roshan A <roshan.len@gmail.com> wrote:
hi all,
My question is regarding the correct use of workqueues. I have a driver which queues a work item in the interrupt handler. The bottom half function ( the workitem -function ) does have proper locking ( mutex ) in place for atomicity.
With this setup, since the interrupts are enabled, it's possible to have a scenario where, when one workitem is being executed, another can be queued up, which results in the workitems being executed in parallel, however since there is a mutex, one thread will sleep.
is this particular scenario considered bad or discouraged ?
This should not happen if you are using the same work item. All workqueues are now non-reentrant - any work item is guaranteed to be executed by at most one worker system-wide at any given time.
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/kerne...
Thanks, Arun
Thank you, -Roshan
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (4)
-
Anish Kumar -
Arun KS -
Pranay Srivastava -
Roshan A