Page MenuHomeFreeBSD

D59495.id186164.diff
No OneTemporary

D59495.id186164.diff

diff --git a/share/man/man9/buf_ring.9 b/share/man/man9/buf_ring.9
--- a/share/man/man9/buf_ring.9
+++ b/share/man/man9/buf_ring.9
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd September 27, 2012
+.Dd August 5, 2026
.Dt BUF_RING 9
.Os
.Sh NAME
@@ -36,7 +36,8 @@
.Nm buf_ring_count ,
.Nm buf_ring_empty ,
.Nm buf_ring_full ,
-.Nm buf_ring_peek
+.Nm buf_ring_peek ,
+.Nm buf_ring_drops
.Nd multi-producer, {single, multi}-consumer lock-less ring buffer
.Sh SYNOPSIS
.In sys/param.h
@@ -59,6 +60,8 @@
.Fn buf_ring_full "struct buf_ring *br"
.Ft void *
.Fn buf_ring_peek "struct buf_ring *br"
+.Ft uint64_t
+.Fn buf_ring_drops "struct buf_ring *br"
.Sh DESCRIPTION
The
.Nm
@@ -125,6 +128,12 @@
buf_ring is not empty,
.Dv NULL
otherwise.
+.Pp
+The
+.Fn buf_ring_drops
+functions returns how many times the
+.Fn buf_ring_enqueue
+was not able to queue an element due to no available slots.
.Sh RETURN VALUES
The
.Fn buf_ring_enqueue
diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c
--- a/sys/dev/cxgb/cxgb_main.c
+++ b/sys/dev/cxgb/cxgb_main.c
@@ -2201,7 +2201,7 @@
drops = 0;
if (sc->flags & FULL_INIT_DONE) {
for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++)
- drops += sc->sge.qs[i].txq[TXQ_ETH].txq_mr->br_drops;
+ drops += buf_ring_drops(sc->sge.qs[i].txq[TXQ_ETH].txq_mr);
}
return (drops);
diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c
--- a/sys/dev/cxgb/cxgb_sge.c
+++ b/sys/dev/cxgb/cxgb_sge.c
@@ -3512,7 +3512,7 @@
&qs->rspq, 0, t3_dump_rspq, "A",
"dump of the response queue");
- SYSCTL_ADD_UQUAD(ctx, txqpoidlist, OID_AUTO, "dropped",
+ SYSCTL_ADD_COUNTER_U64(ctx, txqpoidlist, OID_AUTO, "dropped",
CTLFLAG_RD, &qs->txq[TXQ_ETH].txq_mr->br_drops,
"#tunneled packets dropped");
SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "sendqlen",
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -3872,7 +3872,7 @@
return (rv);
case IFCOUNTER_OQDROPS:
for (int s = 0; s < sc->num_slices; s++)
- rv += sc->ss[s].tx.br->br_drops;
+ rv += buf_ring_drops(sc->ss[s].tx.br);
return (rv);
default:
return (if_get_counter_default(ifp, cnt));
diff --git a/sys/kern/subr_bufring.c b/sys/kern/subr_bufring.c
--- a/sys/kern/subr_bufring.c
+++ b/sys/kern/subr_bufring.c
@@ -30,6 +30,7 @@
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
+#include <sys/counter.h>
#include <sys/buf_ring.h>
struct buf_ring *
@@ -44,6 +45,11 @@
type, flags | M_ZERO);
if (br == NULL)
return (NULL);
+ br->br_drops = counter_u64_alloc(flags);
+ if (br->br_drops == NULL) {
+ free(br, type);
+ return (NULL);
+ }
br->br_lock = lo;
br->br_prod_size = br->br_cons_size = count;
br->br_prod_mask = br->br_cons_mask = count-1;
@@ -56,5 +62,6 @@
void
buf_ring_free(struct buf_ring *br, struct malloc_type *type)
{
+ counter_u64_free(br->br_drops);
free(br, type);
}
diff --git a/sys/sys/buf_ring.h b/sys/sys/buf_ring.h
--- a/sys/sys/buf_ring.h
+++ b/sys/sys/buf_ring.h
@@ -38,6 +38,10 @@
#if defined(_KERNEL)
#include <sys/lock.h>
+#include <sys/counter.h>
+#else
+typedef uint64_t counter_u64_t;
+#define counter_u64_add(c,v) do { (c) += (v); } while (0)
#endif
/*
@@ -54,7 +58,7 @@
uint32_t br_prod_tail;
int br_prod_size;
int br_prod_mask;
- uint64_t br_drops;
+ counter_u64_t br_drops;
uint32_t br_cons_head __aligned(CACHE_LINE_SIZE);
uint32_t br_cons_tail;
int br_cons_size;
@@ -112,8 +116,8 @@
if ((int32_t)(cons_tail + br->br_prod_size - prod_next) < 1) {
if (prod_head == atomic_load_32(&br->br_prod_head) &&
cons_tail == atomic_load_32(&br->br_cons_tail)) {
- br->br_drops++;
critical_exit();
+ counter_u64_add(br->br_drops, 1);
return (ENOBUFS);
}
continue;
@@ -362,8 +366,14 @@
struct rwlock *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk)), \
struct rmlock *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk)))
void buf_ring_free(struct buf_ring *br, struct malloc_type *type);
-#else
+static inline uint64_t
+buf_ring_drops(struct buf_ring *br)
+{
+ return (counter_u64_fetch(br->br_drops));
+}
+
+#else /* !_KERNEL */
#include <stdlib.h>
static inline struct buf_ring *
@@ -389,5 +399,11 @@
free(br);
}
+static inline uint64_t
+buf_ring_drops(struct buf_ring *br)
+{
+ return (br->br_drops);
+}
+
#endif /* !_KERNEL */
#endif /* _SYS_BUF_RING_H_ */

File Metadata

Mime Type
text/plain
Expires
Thu, Sep 10, 10:23 PM (15 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38670450
Default Alt Text
D59495.id186164.diff (4 KB)

Event Timeline