work queue

Arun KS getarunks at gmail.com
Tue Nov 25 07:22:28 EST 2014


Hello Jay,

On Thu, Nov 20, 2014 at 7:06 PM, 户户 <6563572 at 163.com> wrote:
> Thank you for reply,
>
> Isn't  this function 'create_workqueue("myfoo");' gonna create a new worker?

create_workqueue will not create a new worker. Workers are created and
destroyed dynamically, and is independent of the workqueue. The
implementation is changed.

You can start with this nice documentation of CMWQ,
Documentation/workqueue.txt

Thanks,
Arun

> it is expanded to "alloc_workqueue((name), WQ_MEM_RECLAIM, 1)" which means
> it is not a UNBOUND work queue. am I right?
> is "queue_work_on(get_cpu(), test_queue_ptr, &test_work);" gonna put the
> work(test_work) in workqueue pointed by "test_queue_ptr"?
>
> My Kernel release:
> Linux test 3.10.58 #2 SMP Sun Oct 19 23:29:54 CST 2014 x86_64 x86_64 x86_64
> GNU/Linux
>
> Thanks
> Jay
>
> At 2014-11-20 01:02:46, "Dave Tian" <dave.jing.tian at gmail.com> wrote:
>
> You were not creating a new worker but using the generic kernel worker
> (kworker) to handle your work. Besides, there is no CPU bound for this work,
> which means any CPU is able to run the work.
>
> Dave Tian
> dave.jing.tian at gmail.com
>
>
>
> On Nov 19, 2014, at 11:21 PM, 户户 <6563572 at 163.com> wrote:
>
> I'm playing around with work_queue in my VMware workstation. but I hit a
> problem that the work is processed by [kworker/3:1] other than my work
> queue.
>
> static int __init test_init(void)
> {
>     pr_info(" (*) test_init start - pid:%d. cpu:%d\n", current->pid,
> get_cpu());
>     int ret = 0;
>     test_queue_ptr = create_workqueue("myfoo");
>     // test_queue_ptr = create_singlethread_workqueue("test_workqueue");
>
>     if(!test_queue_ptr){
>         goto test_queue_ptr_error;
>     }
>     INIT_WORK(&test_work, test_cb);
>     // ret = queue_work(test_queue_ptr, &test_work);
>     ret = queue_work_on(get_cpu(), test_queue_ptr, &test_work);
>     // schedule_work(&test_work);
>     pr_info(" (*) test_init - queue_work_on return:%d. \n", ret);
>     return 0;
> test_queue_ptr_error:
>     destroy_workqueue(test_queue_ptr);
>     return 0;
> }
>
> static void test_cb(struct work_struct *work)
> {
>     pr_info(" (*) test_cb - pid:%d. cpu:%d\n", current->pid, get_cpu());
> }
>
> isnmod the module gives me the output :
>
> Nov 19 23:11:18 test kernel: [ 3031.766137]  (*) test_init start - pid:8594.
> cpu:3
> Nov 19 23:11:18 test kernel: [ 3031.766371]  (*) test_init - queue_work_on
> return:1.
> Nov 19 23:11:18 test kernel: [ 3031.766672]  (*) test_cb - pid:83. cpu:3
> <--- this line indicates "test_cb" function is running on process 83
> ([kworker/3:1]).
>
> ps aux
> ....
> root        82  0.0  0.0      0     0 ?        S<   22:20   0:00
> [charger_manager]
> root        83  0.0  0.0      0     0 ?        S    22:20   0:00
> [kworker/3:1]
> root        85  0.0  0.0      0     0 ?        S    22:20   0:00
> [kworker/0:2]
> root       217  0.0  0.0      0     0 ?        S<   22:20   0:00
> [mpt_poll_0]
>
> Thanks
> Jay
>
>
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
>
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>



More information about the Kernelnewbies mailing list