lkml.org 
[lkml]   [2021]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectCalling queue_work() multiple times with the same work_struct
    Hi,

    I'm looking for clarification of the behavior of queue_work(). From
    the header description, I'm not sure if I need additional complexity
    for re-queuing work.

    I want to ensure the following cases all occur when calling queue_work().
    1) work_struct not queued -> work_struct queued
    2) work_struct queued -> work_struct queued (no change)
    3) work_struct running -> work_struct queued (so it will run again)

    1 & 2 look supported from workqueue.h. Is the 3rd case true and
    guaranteed? Is it okay to re-use the same work_struct in that case
    while it's being executed? A work_struct function can re-queue
    itself, so I hope #3 is supported.

    The virtual device I'm working on has a single interrupt shared for
    multiple rings. So whenever an interrupt occurs, I need to re-queue
    the single work_struct on the workqueue to ensure we don't miss an
    event. That is, we need to re-iterate all the rings if the interrupt
    comes halfway through processing the list of rings. If multiple
    interrupts come through while running, we only need to re-queue a
    single work item for all of them.

    Below is what I hope works for the code to give something tangible.

    Thank you,
    Jason

    DECLARE_WORK(argo_work, argo_work_fn);
    static struct workqueue_struct *argo_wq = alloc_workqueue("argo_wq",
    WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE | WQ_SYSFS, 1);

    static void argo_work_fn(struct work_struct *work)
    {
    argo_interrupt_rx(); /* iterates multiple "rings" */
    argo_notify();
    }

    static irqreturn_t argo_interrupt(int irq, void *dev_id)
    {
    queue_work(argo_wq, &argo_work);

    return IRQ_HANDLED;
    }

    \
     
     \ /
      Last update: 2021-05-20 15:04    [W:4.494 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site