lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 1/7] kfifo: provide noirqsave variants of spinlocked in and out helpers
    Date
    From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

    Provide variants of spinlocked kfifo_in() and kfifo_out() routines which
    don't disable interrupts.

    Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Acked-by: Stefani Seibold <stefani@seibold.net>
    ---
    include/linux/kfifo.h | 42 ++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 42 insertions(+)

    diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h
    index fc4b0b10210f..123c200ed7cb 100644
    --- a/include/linux/kfifo.h
    +++ b/include/linux/kfifo.h
    @@ -517,6 +517,26 @@ __kfifo_uint_must_check_helper( \
    __ret; \
    })

    +/**
    + * kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for
    + * locking, don't disable interrupts
    + * @fifo: address of the fifo to be used
    + * @buf: the data to be added
    + * @n: number of elements to be added
    + * @lock: pointer to the spinlock to use for locking
    + *
    + * This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock()
    + * for locking and doesn't disable interrupts.
    + */
    +#define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \
    +({ \
    + unsigned int __ret; \
    + spin_lock(lock); \
    + __ret = kfifo_in(fifo, buf, n); \
    + spin_unlock(lock); \
    + __ret; \
    +})
    +
    /* alias for kfifo_in_spinlocked, will be removed in a future release */
    #define kfifo_in_locked(fifo, buf, n, lock) \
    kfifo_in_spinlocked(fifo, buf, n, lock)
    @@ -569,6 +589,28 @@ __kfifo_uint_must_check_helper( \
    }) \
    )

    +/**
    + * kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock
    + * for locking, don't disable interrupts
    + * @fifo: address of the fifo to be used
    + * @buf: pointer to the storage buffer
    + * @n: max. number of elements to get
    + * @lock: pointer to the spinlock to use for locking
    + *
    + * This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock()
    + * for locking and doesn't disable interrupts.
    + */
    +#define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \
    +__kfifo_uint_must_check_helper( \
    +({ \
    + unsigned int __ret; \
    + spin_lock(lock); \
    + __ret = kfifo_out(fifo, buf, n); \
    + spin_unlock(lock); \
    + __ret; \
    +}) \
    +)
    +
    /* alias for kfifo_out_spinlocked, will be removed in a future release */
    #define kfifo_out_locked(fifo, buf, n, lock) \
    kfifo_out_spinlocked(fifo, buf, n, lock)
    --
    2.23.0
    \
     
     \ /
      Last update: 2020-01-24 18:28    [W:9.171 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site