Thread (14 messages) 14 messages, 5 authors, 2025-12-09

Re: [PATCH net-next v7 3/5] net: devmem: implement autorelease token management

From: Simon Horman <horms@kernel.org>
Date: 2025-11-26 10:11:36
Also in: linux-arch, linux-doc, linux-kselftest, lkml

On Wed, Nov 19, 2025 at 07:37:10PM -0800, Bobby Eshleman wrote:

...
quoted hunk ↗ jump to hunk
@@ -292,25 +327,67 @@ net_devmem_bind_dmabuf(struct net_device *dev,
...
+	/* Enforce system-wide autorelease mode consistency for RX bindings.
+	 * TX bindings don't use autorelease (always false) since tokens aren't
+	 * leaked in TX path. Only RX bindings must all have the same
+	 * autorelease mode, never mixed.
+	 *
+	 * We use the xarray's lock to atomically check xa_empty() and toggle
+	 * the static key, avoiding the race where two new bindings may try to
+	 * set the static key to different states.
+	 */
+	xa_lock(&net_devmem_dmabuf_bindings);
+
+	if (direction == DMA_FROM_DEVICE) {
+		if (!xa_empty(&net_devmem_dmabuf_bindings)) {
+			bool mode;
+
+			mode = static_key_enabled(&tcp_devmem_ar_key);
+
+			/* When bindings exist, enforce that the mode does not
+			 * change.
+			 */
+			if (mode != autorelease) {
+				NL_SET_ERR_MSG_FMT(extack,
+						   "System already configured with autorelease=%d",
+						   mode);
+				err = -EINVAL;
+				goto err_unlock_xa;
+			}
+		} else {
+			/* First binding sets the mode for all subsequent
+			 * bindings.
+			 */
+			if (autorelease)
+				static_branch_enable(&tcp_devmem_ar_key);
+			else
+				static_branch_disable(&tcp_devmem_ar_key);
Hi Bobby,

This code runs inside xa_lock, which is a spinlock.

But static_branch_enable() and static_branch_disable()
may sleep due to some combination of taking a mutex
and cpu_read_lock.

Flagged by Claude Code with https://github.com/masoncl/review-prompts/
+		}
+	}
+
+	err = __xa_alloc_cyclic(&net_devmem_dmabuf_bindings, &binding->id,
+				binding, xa_limit_32b, &id_alloc_next,
+				GFP_KERNEL);
 	if (err < 0)
-		goto err_free_chunks;
+		goto err_unlock_xa;
+
+	xa_unlock(&net_devmem_dmabuf_bindings);
 
 	list_add(&binding->list, &priv->bindings);
 
 	return binding;
 
+err_unlock_xa:
+	xa_unlock(&net_devmem_dmabuf_bindings);
...
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help