From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3648C349CC9 for ; Tue, 12 May 2026 10:25:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778581535; cv=none; b=FdObPlzPVRb+1lqF1pOzkhgkDSIoZAyRTgBoFsyuSQ2zozhowAteyqHWxiLoskbPu4/9PiwKfLy9VUt5hpC9v3TQBhpBf7yOpdNBLUChKExFCtTJhiJIvZsyB8fZ46RNiuWjKTxzG0Xo+pYqRPUynnPU+OSSuE3mRctSHPYDj2o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778581535; c=relaxed/simple; bh=QQZD5rgSKCz52tDI8pqPd/M30enC3uroMaaCE0+aGlQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F5Xf4UO9vntPoLkCX5LoLMgd341BF6ty3x8+ISC0gKcys25OeuQWMQs0wBOqkQ6m8pLkiuDmdyqJZPowptVm073J3z7nPSitmXNE8DPxepvcrFYnm5caVQL2g09gYsDB17mlEPdAxwUaHEYkF7agsxxJqSaDxzMJOSM0iAgL8dk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kZ6n3SIL; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kZ6n3SIL" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-488a9033b2cso49044605e9.2 for ; Tue, 12 May 2026 03:25:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778581533; x=1779186333; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xJ/pPOW6DLk5fsFIOdFk0JDGjREEIe88CQ9E+zou+G4=; b=kZ6n3SILwF47qcG5vjpYMCFoD1h5t4PZBazxIqDvqzpt3hT3nN2pgzgPYt9Z4k7shK WxQpcmyOtKneFY9siHZN/yHUyCbsTzIBzl1D9WquSN7acWwnafxVTSXA5x1V9ihPA76I WU8q6yqTKZ5p3gfRu/Tbdn0iL2ANpH8N1NGadRIUTBSLanip7jlXH3olU7Pe+VF5G/wd ysNoG7yMpStTXIIv5NW0jZc7NMKJfuGipnvHP/S/Xzbi0JYt5+n+L/B63Fiywy1l52qw XngR6t8wGbb01+j0wtrIQyBrxcOqLkBAOSmyGMoaAhl2/2QN8yrg4ZLLwaEjFhe/4o25 /sXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778581533; x=1779186333; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xJ/pPOW6DLk5fsFIOdFk0JDGjREEIe88CQ9E+zou+G4=; b=Fg2nA4S0qnlV0ZyRkIQS2KKQaUxXCyA25yXxRZyZ7dkS1xp5VFmDbOAtMkGGLhSDbq RJBOm3X3oFSHTtCMAw9udBt8IAJhuRdCJq7ZJI/fvNpaBaC01BVHMDuif/2AXX3F4kGn TysPliMxYAlIHLJELUblsTSFZfJafDyRCYBkZdqVFJW1L/t0jAPtfV6u4UavkWewdVsH p5IBs7OcYyCaE0UkZdrxVhBItMGJHNGxH+aN/aV1fl4PmSGzGexTdtNQY3BnAVN1E7Xr GPpyJlza5TroNL+B00RlBNgDmf52vGJfNo8f5aEqZwFbVCTrceE95hxO+f99WCQ9i8ac vqRQ== X-Forwarded-Encrypted: i=1; AFNElJ9jDBA/NGbrIy83tvL2PjmNiR9UCaBU/Yx7K/IUwj35Ns3SwtyKT009ADmGt38gyi7av1b+CYQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzyrRj1OLjzwQrUNffVPEMfeg0hAnAFl6i9lbL17KQDG/D7/mZW 1h5kXQFamLV5FKgc2QqB2mwLsAur1oIgK9gWImJ7FlXWfYDnyamLonfGUrp+Sw== X-Gm-Gg: Acq92OHl5FeoglBzn/qArm8rEhAYlA6h8I2bdcem1DxT4FrzscwZ5G3BGzexq57EIbj EEeFFVmO2giw9AK+m1hYK/LEFTbajmWeebPpiSltMT+NjdfnLHYQSBSXAqQVkncoSxfuUPJI2ul M3+yEgkPF8EHiJEh0rjorehlGZR9EoAte5YF4Vk4Sy2N2f9XPevKnoEEoilDG82RnainIUjlMUZ omW1aTgRmk/0DVzPNV978ad8cVCKBpDGFbCrQBTdpPiIIHazlWelnzLzD5sAGbycHzbEwRHM+7L TLUQMiqqJq3SyR73YN4+ZtFI6M/P9r2UM08Q2AWyrVdDElS33I3UKkrTRIkoATsyDlvT0NiCaSb GfcmAxzhSGoKJUaaumKi2c6GhraTfbmt/f1Yf+DdBibPZ5QVjZQ5SZdEGvVks8ATDluP4fOLEbV rg791H1fV086gCzZ7CWgocmqe+3kmeP27Lm77QTByELLD7bZW0HiVlVX4faJPp4iTZ2QkXZ+DMS n6vNtgRKt0J1u79NZ5u X-Received: by 2002:a05:600c:8b65:b0:488:a824:fdff with SMTP id 5b1f17b1804b1-48e706c7e20mr219541165e9.22.1778581532697; Tue, 12 May 2026 03:25:32 -0700 (PDT) Received: from 127.net ([2620:10d:c092:600::1:8c90]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48e9052c9fesm74352255e9.1.2026.05.12.03.25.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 03:25:32 -0700 (PDT) From: Pavel Begunkov To: io-uring@vger.kernel.org Cc: asml.silence@gmail.com, netdev@vger.kernel.org Subject: [RFC 6/6] io_uring/zcrx: add dynamic area creation Date: Tue, 12 May 2026 11:25:06 +0100 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit It's not always possible for the user to predict during registration how much memory zcrx will need to sustain the traffic. Allow to dynamically add more areas with a new ctrl code ZCRX_CTRL_ADD_AREA. Signed-off-by: Pavel Begunkov --- include/uapi/linux/io_uring/zcrx.h | 7 ++++++ io_uring/zcrx.c | 39 +++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/io_uring/zcrx.h b/include/uapi/linux/io_uring/zcrx.h index 5ce02c7a6096..de696eb10db4 100644 --- a/include/uapi/linux/io_uring/zcrx.h +++ b/include/uapi/linux/io_uring/zcrx.h @@ -88,6 +88,7 @@ struct io_uring_zcrx_ifq_reg { enum zcrx_ctrl_op { ZCRX_CTRL_FLUSH_RQ, ZCRX_CTRL_EXPORT, + ZCRX_CTRL_ADD_AREA, __ZCRX_CTRL_LAST, }; @@ -101,6 +102,11 @@ struct zcrx_ctrl_export { __u32 __resv1[11]; }; +struct zcrx_ctrl_add_area { + __u64 area_ptr; /* pointer to struct io_uring_zcrx_area_reg */ + __u64 __resv[5]; +}; + struct zcrx_ctrl { __u32 zcrx_id; __u32 op; /* see enum zcrx_ctrl_op */ @@ -109,6 +115,7 @@ struct zcrx_ctrl { union { struct zcrx_ctrl_export zc_export; struct zcrx_ctrl_flush_rq zc_flush; + struct zcrx_ctrl_add_area zc_area; }; }; diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 5fb81bb6f819..4bcf68b8d682 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -481,7 +481,7 @@ static int __zcrx_create_area(struct io_zcrx_ifq *ifq, return -EINVAL; buf_size_shift = ilog2(rx_buf_len); } - if (WARN_ON_ONCE(ifq->niov_shift)) + if (ifq->niov_shift && ifq->niov_shift != buf_size_shift) return -EINVAL; if (!ifq->dev && buf_size_shift != PAGE_SHIFT) return -EOPNOTSUPP; @@ -967,6 +967,8 @@ int io_register_zcrx(struct io_ring_ctx *ctx, goto err; } + WARN_ON_ONCE(!ifq->niov_shift); + reg.zcrx_id = id; scoped_guard(mutex, &ctx->mmap_lock) { @@ -1325,6 +1327,39 @@ static int zcrx_flush_rq(struct io_ring_ctx *ctx, struct io_zcrx_ifq *zcrx, return 0; } +static int zcrx_ctrl_add_area(struct io_ring_ctx *ctx, struct io_zcrx_ifq *ifq, + struct zcrx_ctrl *ctrl) +{ + struct zcrx_ctrl_add_area *ctrl_add = &ctrl->zc_area; + struct io_uring_zcrx_area_reg __user *area_uptr; + struct io_uring_zcrx_area_reg area_reg; + struct io_zcrx_area *area; + int ret; + + area_uptr = u64_to_user_ptr(ctrl_add->area_ptr); + + if (!mem_is_zero(&ctrl_add->__resv, sizeof(ctrl_add->__resv))) + return -EINVAL; + if (copy_from_user(&area_reg, area_uptr, sizeof(area_reg))) + return -EFAULT; + + ret = __zcrx_create_area(ifq, &area_reg, &area, 0); + if (ret) + return ret; + + if (copy_to_user(area_uptr, &area_reg, sizeof(area_reg))) { + io_zcrx_free_area(ifq, area); + return -EFAULT; + } + + ret = io_zcrx_append_area(ifq, area); + if (ret) { + io_zcrx_free_area(ifq, area); + return ret; + } + return 0; +} + int io_zcrx_ctrl(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_args) { struct zcrx_ctrl ctrl; @@ -1348,6 +1383,8 @@ int io_zcrx_ctrl(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_args) return zcrx_flush_rq(ctx, zcrx, &ctrl); case ZCRX_CTRL_EXPORT: return zcrx_export(ctx, zcrx, &ctrl, arg); + case ZCRX_CTRL_ADD_AREA: + return zcrx_ctrl_add_area(ctx, zcrx, &ctrl); } return -EOPNOTSUPP; -- 2.53.0