From af37e98979a1b162f82df7b5db8e4c6cda9bf4b2 Mon Sep 17 00:00:00 2001 From: DaJiYuQia <88259094+DaJiYuQia@users.noreply.github.com> Date: Sat, 15 Oct 2022 20:50:47 +0800 Subject: [PATCH] Patch in kfifo add lock (#60) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 对加锁进行了修改 * bugfix: 解决指针错误的问题 Co-authored-by: longjin --- kernel/common/kfifo.h | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/kernel/common/kfifo.h b/kernel/common/kfifo.h index 63a7b566..1c9c7778 100644 --- a/kernel/common/kfifo.h +++ b/kernel/common/kfifo.h @@ -1,6 +1,7 @@ #pragma once #include +#include struct kfifo_t { @@ -73,10 +74,10 @@ int kfifo_alloc(struct kfifo_t *fifo, uint32_t size, uint64_t reserved); /** * @brief 释放通过kfifo_alloc创建的fifo缓冲区 - * + * * @param fifo fifo队列结构体 */ -void kfifo_free_alloc(struct kfifo_t* fifo); +void kfifo_free_alloc(struct kfifo_t *fifo); /** * @brief 使用指定的缓冲区来初始化kfifo缓冲队列 @@ -116,3 +117,37 @@ uint32_t kfifo_out(struct kfifo_t *fifo, void *to, uint32_t size); * @return uint32_t 取出的数据大小 */ uint32_t kfifo_out_peek(struct kfifo_t *fifo, void *to, uint32_t size); + +/** + * @brief 向kfifo缓冲区推入指定大小的数据并在过程加锁 + * + * @param fifo 队列结构体 + * @param from 来源数据地址 + * @param size 数据大小(字节数) + * @param lock 自旋锁 + * @return uint32_t 推入的数据大小 + */ +uint32_t __always_inline kfifo_in_lockd(struct kfifo_t *fifo, const void *from, uint32_t size, spinlock_t *lock) +{ + spin_lock(lock); + uint32_t retval = kfifo_in(&fifo, &from, size); + spin_unlock(lock); + return retval; +} + +/** + * @brief 从kfifo缓冲区取出数据,并从队列中删除数据,并在过程加锁 + * + * @param fifo 队列结构体 + * @param to 拷贝目标地址 + * @param size 数据大小(字节数) + * @param lock 自旋锁 + * @return uint32_t 取出的数据大小 + */ +uint32_t __always_inline kfifo_out_lockd(struct kfifo_t *fifo, void *to, uint32_t size, spinlock_t *lock) +{ + spin_lock(lock); + uint32_t retval = kfifo_out(&fifo, &to, size); + spin_unlock(lock); + return retval; +}