git: a161269b2451 - main - buf_ring: Make buf_ring.h amenable to userspace compilation

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Thu, 11 Jul 2024 19:31:07 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=a161269b2451140a45de2d0cae0dad84f9e7b439

commit a161269b2451140a45de2d0cae0dad84f9e7b439
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-07-11 18:55:11 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-07-11 18:55:44 +0000

    buf_ring: Make buf_ring.h amenable to userspace compilation
    
    This will be useful for adding test cases.
    
    Reviewed by:    andrew
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D45869
---
 sys/sys/buf_ring.h | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/sys/sys/buf_ring.h b/sys/sys/buf_ring.h
index 32c9f5b15f22..cb18175c3a75 100644
--- a/sys/sys/buf_ring.h
+++ b/sys/sys/buf_ring.h
@@ -30,11 +30,18 @@
 #ifndef	_SYS_BUF_RING_H_
 #define	_SYS_BUF_RING_H_
 
+#include <sys/param.h>
+#include <sys/kassert.h>
+#include <machine/atomic.h>
 #include <machine/cpu.h>
 
 #ifdef DEBUG_BUFRING
+#ifdef _KERNEL
 #include <sys/lock.h>
 #include <sys/mutex.h>
+#else
+#error "DEBUG_BUFRING is only supported in kernel"
+#endif
 #endif
 
 struct buf_ring {
@@ -361,8 +368,36 @@ buf_ring_count(struct buf_ring *br)
 	    & br->br_prod_mask);
 }
 
+#ifdef _KERNEL
 struct buf_ring *buf_ring_alloc(int count, struct malloc_type *type, int flags,
     struct mtx *);
 void buf_ring_free(struct buf_ring *br, struct malloc_type *type);
+#else
 
-#endif
+#include <stdlib.h>
+
+static inline struct buf_ring *
+buf_ring_alloc(int count)
+{
+	struct buf_ring *br;
+
+	KASSERT(powerof2(count), ("buf ring must be size power of 2"));
+
+	br = calloc(1, sizeof(struct buf_ring) + count * sizeof(void *));
+	if (br == NULL)
+		return (NULL);
+	br->br_prod_size = br->br_cons_size = count;
+	br->br_prod_mask = br->br_cons_mask = count - 1;
+	br->br_prod_head = br->br_cons_head = 0;
+	br->br_prod_tail = br->br_cons_tail = 0;
+	return (br);
+}
+
+static inline void
+buf_ring_free(struct buf_ring *br)
+{
+	free(br);
+}
+
+#endif /* !_KERNEL */
+#endif /* _SYS_BUF_RING_H_ */