• NeilBrown's avatar
    lib: add light-weight queuing mechanism. · de9e82c3
    NeilBrown authored
    lwq is a FIFO single-linked queue that only requires a spinlock
    for dequeueing, which happens in process context.  Enqueueing is atomic
    with no spinlock and can happen in any context.
    
    This is particularly useful when work items are queued from BH or IRQ
    context, and when they are handled one at a time by dedicated threads.
    
    Avoiding any locking when enqueueing means there is no need to disable
    BH or interrupts, which is generally best avoided (particularly when
    there are any RT tasks on the machine).
    
    This solution is superior to using "list_head" links because we need
    half as many pointers in the data structures, and because list_head
    lists would need locking to add items to the queue.
    
    This solution is superior to a bespoke solution as all locking and
    container_of casting is integrated, so the interface is simple.
    
    Despite the similar name, this solution meets a distinctly different
    need to kfifo.  kfifo provides a fixed sized circular buffer to which
    data can be added at one end and removed at the other, and does not
    provide any locking.  lwq does not have any size limit and works with
    data structures (objects?) rather than data (bytes).
    
    A unit test for basic functionality, which runs at boot time, is included.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: David Gow <davidgow@google.com>
    Cc: linux-kernel@vger.kernel.org
    Message-Id: <20230911111333.4d1a872330e924a00acb905b@linux-foundation.org>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    de9e82c3
lwq.c 3.61 KB