{"id":2235032,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2235032/?format=json","web_url":"http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20260508124208.11622-14-przemyslaw.kitszel@intel.com/","project":{"id":46,"url":"http://patchwork.ozlabs.org/api/1.2/projects/46/?format=json","name":"Intel Wired Ethernet development","link_name":"intel-wired-lan","list_id":"intel-wired-lan.osuosl.org","list_email":"intel-wired-lan@osuosl.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260508124208.11622-14-przemyslaw.kitszel@intel.com>","list_archive_url":null,"date":"2026-05-08T12:42:06","name":"[iwl-next,v1,13/15] devlink: give user option to allocate resources","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"be05383c2fd5f872c69c54249ffb30a76ab5fe40","submitter":{"id":85252,"url":"http://patchwork.ozlabs.org/api/1.2/people/85252/?format=json","name":"Przemek Kitszel","email":"przemyslaw.kitszel@intel.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20260508124208.11622-14-przemyslaw.kitszel@intel.com/mbox/","series":[{"id":503388,"url":"http://patchwork.ozlabs.org/api/1.2/series/503388/?format=json","web_url":"http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=503388","date":"2026-05-08T12:41:53","name":"devlink, mlx5, iavf, ice: XLVF for iavf","version":1,"mbox":"http://patchwork.ozlabs.org/series/503388/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2235032/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2235032/checks/","tags":{},"related":[],"headers":{"Return-Path":"<intel-wired-lan-bounces@osuosl.org>","X-Original-To":["incoming@patchwork.ozlabs.org","intel-wired-lan@lists.osuosl.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","intel-wired-lan@lists.osuosl.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=osuosl.org header.i=@osuosl.org header.a=rsa-sha256\n header.s=default header.b=tRyjt9qL;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=osuosl.org\n (client-ip=140.211.166.138; helo=smtp1.osuosl.org;\n envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gBq3F5h2bz1yKm\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 08 May 2026 23:00:09 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id E298482C21;\n\tFri,  8 May 2026 13:00:07 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id Gz7FSlc4KDsx; Fri,  8 May 2026 13:00:07 +0000 (UTC)","from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 6A0D4830AB;\n\tFri,  8 May 2026 13:00:06 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists1.osuosl.org (Postfix) with ESMTP id 1D5E4358\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2026 13:00:04 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 7BE0040F70\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2026 13:00:03 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id 0qgBovQiHFiU for <intel-wired-lan@lists.osuosl.org>;\n Fri,  8 May 2026 13:00:02 +0000 (UTC)","from mgamail.intel.com (mgamail.intel.com [198.175.65.17])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 8FA5540F54\n for <intel-wired-lan@lists.osuosl.org>; Fri,  8 May 2026 13:00:02 +0000 (UTC)","from fmviesa005.fm.intel.com ([10.60.135.145])\n by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 May 2026 06:00:03 -0700","from irvmail002.ir.intel.com ([10.43.11.120])\n by fmviesa005.fm.intel.com with ESMTP; 08 May 2026 05:59:57 -0700","from vecna.igk.intel.com (vecna.igk.intel.com [10.123.220.17])\n by irvmail002.ir.intel.com (Postfix) with ESMTP id 904462FC44;\n Fri,  8 May 2026 13:59:55 +0100 (IST)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.166.142;\n helo=lists1.osuosl.org; envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp1.osuosl.org 6A0D4830AB","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8FA5540F54"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=osuosl.org;\n\ts=default; t=1778245206;\n\tbh=V/IYc/IvSd/fLqcdKvCHfQX92+D9DOd/x/2G+t1cspg=;\n\th=From:To:Cc:Date:In-Reply-To:References:Subject:List-Id:\n\t List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe:\n\t From;\n\tb=tRyjt9qLRRQLbM3zaOafzxH8Sm7HBovxnD9/g2ypTW0QAPcSddVzj2LR3vVS0zeha\n\t h89I/y5ajLBwgYjm4VLP/sjs6r7y8zUV05FxDQNuF8xOeQLm00LfNCID/i25YBmhsP\n\t WqTTcDLZ50dZbTtnLZI5I5n/l0fITbFaBhRLMTwr394d+3JFPTNQrmCeCs5qpX5NE8\n\t 8JgQOMjVH710oqPyvFrIoL4g2Nh2KHiPbaZyqxc35xk4oasqQpRB/B2V3kFpdS+p6i\n\t n+HN3NfLcWzySkYtZOEqqILPaakZt2IxSse0eg1kTAekXyBY1QEcrv14pYm5rBNUqS\n\t J7PAyGPooC29g==","Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=198.175.65.17;\n helo=mgamail.intel.com; envelope-from=przemyslaw.kitszel@intel.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 8FA5540F54","X-CSE-ConnectionGUID":["Ve33xJc7Q+CF+NrlmuIuAw==","K6FcwD4nRSKd5a8e+aoWBw=="],"X-CSE-MsgGUID":["6ZFjDWSESzGJigYbLqrF6g==","mFhI437QSkmor8bFyqD6Eg=="],"X-IronPort-AV":["E=McAfee;i=\"6800,10657,11779\"; a=\"79199991\"","E=Sophos;i=\"6.23,223,1770624000\"; d=\"scan'208\";a=\"79199991\"","E=Sophos;i=\"6.23,223,1770624000\"; d=\"scan'208\";a=\"241730183\""],"X-ExtLoop1":"1","From":"Przemek Kitszel <przemyslaw.kitszel@intel.com>","To":"intel-wired-lan@lists.osuosl.org, Michal Schmidt <mschmidt@redhat.com>,\n Jakub Kicinski <kuba@kernel.org>, Jiri Pirko <jiri@resnulli.us>","Cc":"netdev@vger.kernel.org, Simon Horman <horms@kernel.org>,\n Tony Nguyen <anthony.l.nguyen@intel.com>,\n Michal Swiatkowski <michal.swiatkowski@linux.intel.com>,\n bruce.richardson@intel.com,\n Vladimir Medvedkin <vladimir.medvedkin@intel.com>,\n padraig.j.connolly@intel.com, ananth.s@intel.com,\n timothy.miskell@intel.com, Jacob Keller <jacob.e.keller@intel.com>,\n Lukasz Czapnik <lukasz.czapnik@intel.com>,\n Aleksandr Loktionov <aleksandr.loktionov@intel.com>,\n Andrew Lunn <andrew+netdev@lunn.ch>,\n \"David S. Miller\" <davem@davemloft.net>,\n Eric Dumazet <edumazet@google.com>, Paolo Abeni <pabeni@redhat.com>,\n Saeed Mahameed <saeedm@nvidia.com>, Leon Romanovsky <leon@kernel.org>,\n Tariq Toukan <tariqt@nvidia.com>, Mark Bloch <mbloch@nvidia.com>,\n Przemek Kitszel <przemyslaw.kitszel@intel.com>","Date":"Fri,  8 May 2026 14:42:06 +0200","Message-Id":"<20260508124208.11622-14-przemyslaw.kitszel@intel.com>","X-Mailer":"git-send-email 2.39.3","In-Reply-To":"<20260508124208.11622-1-przemyslaw.kitszel@intel.com>","References":"<20260508124208.11622-1-przemyslaw.kitszel@intel.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Mailman-Original-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1778245203; x=1809781203;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=NlcT9xFh6hWCogshEOFokLhWIlFsDsMi1nuEY7HZ7iw=;\n b=PiS4o07zMxu3LiT1h/yC9BA4g2QUTC5Y/RfOdeONnrX6vUsg2s6H8Oz3\n TqiKL9o9Sumnc7iYglOj7RcEXdV40KvKKH+rJRqKYUKpvDYuO7AmH1wia\n irtf73DHLmQVUy49TdSE+l1rdhjTbFdaGdKyFW3XHkn7sH1kqiFuwewy6\n eful6PXDXYCxAex1130sD/WCa7NNvbO84Yi3kbk1KYektvyN4MFHMjYuw\n hLP3GcmPeNeM9rp2m6xu1w1fHbQM5HPfZVTAL5Fndd9Nwki/y0p28ErF6\n 36feAcJJU5bZz+DsJZoDQmGElW9dIb4csJluC3Y/nnDgCo10g4HsPgMCG\n w==;","X-Mailman-Original-Authentication-Results":["smtp4.osuosl.org;\n dmarc=pass (p=none dis=none)\n header.from=intel.com","smtp4.osuosl.org;\n dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com\n header.a=rsa-sha256 header.s=Intel header.b=PiS4o07z"],"Subject":"[Intel-wired-lan] [PATCH iwl-next v1 13/15] devlink: give user\n option to allocate resources","X-BeenThere":"intel-wired-lan@osuosl.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Intel Wired Ethernet Linux Kernel Driver Development\n <intel-wired-lan.osuosl.org>","List-Unsubscribe":"<https://lists.osuosl.org/mailman/options/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>","List-Archive":"<http://lists.osuosl.org/pipermail/intel-wired-lan/>","List-Post":"<mailto:intel-wired-lan@osuosl.org>","List-Help":"<mailto:intel-wired-lan-request@osuosl.org?subject=help>","List-Subscribe":"<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>","Errors-To":"intel-wired-lan-bounces@osuosl.org","Sender":"\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>"},"content":"Current devlink resources are designed as a thing that user could limit,\nbut there is not much otherwise that could be done with them.\nPerhaps that's the reason there is no much adoption despite API being\nthere for multiple years.\n\nAdd new mode of operation, where user could allocate/assign resources\n(from a common pool) to specific devices.\n\nThat requires \"occ set\" support, triggered by user.\nTo support that mode, \"occ get\" is (only then) turned into a simple\n\"get/show\" operation, as opposed to \"ask driver about current occupation\"\nin the \"legacy\" mode.\n\nSigned-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>\n---\nRFC, Feb '25\nhttps://lore.kernel.org/intel-wired-lan/20250219164410.35665-3-przemyslaw.kitszel@intel.com\n\nI have structured code to just choose \"the mode\" of operation based on\nthe presence of .occ_set callback, instead of naming the mode, what,\neven if not the most clear code, avoids the need of naming the modes.\n---\n include/net/devlink.h  |  7 +++\n net/devlink/resource.c | 98 +++++++++++++++++++++++++++++++++---------\n 2 files changed, 85 insertions(+), 20 deletions(-)","diff":"diff --git a/include/net/devlink.h b/include/net/devlink.h\nindex 5d3a1337bfa1..9b777f02beca 100644\n--- a/include/net/devlink.h\n+++ b/include/net/devlink.h\n@@ -420,6 +420,8 @@ devlink_resource_size_params_init(struct devlink_resource_size_params *size_para\n }\n \n typedef u64 devlink_resource_occ_get_t(void *priv);\n+typedef int devlink_resource_occ_set_t(u64 size, struct netlink_ext_ack *extack,\n+\t\t\t\t       void *priv);\n \n #define DEVLINK_RESOURCE_ID_PARENT_TOP 0\n \n@@ -1934,6 +1936,11 @@ void devl_resource_occ_get_register(struct devlink *devlink,\n \t\t\t\t    void *occ_get_priv);\n void devl_resource_occ_get_unregister(struct devlink *devlink,\n \t\t\t\t      u64 resource_id);\n+void devl_resource_occ_set_get_register(struct devlink *devlink,\n+\t\t\t\t\tu64 resource_id,\n+\t\t\t\t\tdevlink_resource_occ_set_t *occ_set,\n+\t\t\t\t\tdevlink_resource_occ_get_t *occ_get,\n+\t\t\t\t\tvoid *occ_priv);\n int devl_params_register(struct devlink *devlink,\n \t\t\t const struct devlink_param *params,\n \t\t\t size_t params_count);\ndiff --git a/net/devlink/resource.c b/net/devlink/resource.c\nindex 3d2f42bc2fb5..2212eff5230d 100644\n--- a/net/devlink/resource.c\n+++ b/net/devlink/resource.c\n@@ -19,7 +19,8 @@\n  * @list: parent list\n  * @resource_list: list of child resources\n  * @occ_get: occupancy getter callback\n- * @occ_get_priv: occupancy getter callback priv\n+ * @occ_set: occupancy setter callback\n+ * @occ_priv: occupancy callbacks priv\n  */\n struct devlink_resource {\n \tconst char *name;\n@@ -32,7 +33,8 @@ struct devlink_resource {\n \tstruct list_head list;\n \tstruct list_head resource_list;\n \tdevlink_resource_occ_get_t *occ_get;\n-\tvoid *occ_get_priv;\n+\tdevlink_resource_occ_set_t *occ_set;\n+\tvoid *occ_priv;\n };\n \n static struct devlink_resource *\n@@ -137,6 +139,9 @@ int devlink_nl_resource_set_doit(struct sk_buff *skb, struct genl_info *info)\n \tif (err)\n \t\treturn err;\n \n+\tif (resource->occ_set)\n+\t\treturn resource->occ_set(size, info->extack, resource->occ_priv);\n+\n \tresource->size_new = size;\n \tdevlink_resource_validate_children(resource);\n \tif (resource->parent)\n@@ -162,13 +167,40 @@ devlink_resource_size_params_put(struct devlink_resource *resource,\n \treturn 0;\n }\n \n-static int devlink_resource_occ_put(struct devlink_resource *resource,\n-\t\t\t\t    struct sk_buff *skb)\n+static int\n+devlink_resource_occ_size_put_legacy(struct devlink_resource *resource,\n+\t\t\t\t     struct sk_buff *skb)\n {\n-\tif (!resource->occ_get)\n-\t\treturn 0;\n-\treturn devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_OCC,\n-\t\t\t\t  resource->occ_get(resource->occ_get_priv));\n+\tif (devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE, resource->size))\n+\t\tgoto err;\n+\tif (resource->size != resource->size_new &&\n+\t    devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW,\n+\t\t\t       resource->size_new))\n+\t\tgoto err;\n+\tif (resource->occ_get &&\n+\t    devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_OCC,\n+\t\t\t       resource->occ_get(resource->occ_priv)))\n+\t\tgoto err;\n+\tif (nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_SIZE_VALID,\n+\t\t       resource->size_valid))\n+\t\tgoto err;\n+\n+\treturn 0;\n+err:\n+\treturn -EMSGSIZE;\n+}\n+\n+static int devlink_resource_occ_size_put(struct devlink_resource *resource,\n+\t\t\t\t\t struct sk_buff *skb)\n+{\n+\tif (!resource->occ_get || !resource->occ_set)\n+\t\treturn devlink_resource_occ_size_put_legacy(resource, skb);\n+\n+\tif (nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_SIZE_VALID, true))\n+\t\treturn -EMSGSIZE;\n+\n+\treturn devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE,\n+\t\t\t\t  resource->occ_get(resource->occ_priv));\n }\n \n static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb,\n@@ -183,24 +215,16 @@ static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb,\n \t\treturn -EMSGSIZE;\n \n \tif (nla_put_string(skb, DEVLINK_ATTR_RESOURCE_NAME, resource->name) ||\n-\t    devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE, resource->size) ||\n \t    devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_ID, resource->id))\n \t\tgoto nla_put_failure;\n-\tif (resource->size != resource->size_new &&\n-\t    devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW,\n-\t\t\t       resource->size_new))\n-\t\tgoto nla_put_failure;\n-\tif (devlink_resource_occ_put(resource, skb))\n+\tif (devlink_resource_occ_size_put(resource, skb))\n \t\tgoto nla_put_failure;\n \tif (devlink_resource_size_params_put(resource, skb))\n \t\tgoto nla_put_failure;\n+\n \tif (list_empty(&resource->resource_list))\n \t\tgoto out;\n \n-\tif (nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_SIZE_VALID,\n-\t\t       resource->size_valid))\n-\t\tgoto nla_put_failure;\n-\n \tchild_resource_attr = nla_nest_start_noflag(skb,\n \t\t\t\t\t\t    DEVLINK_ATTR_RESOURCE_LIST);\n \tif (!child_resource_attr)\n@@ -634,6 +658,39 @@ int devl_resource_size_get(struct devlink *devlink,\n }\n EXPORT_SYMBOL_GPL(devl_resource_size_get);\n \n+/**\n+ * devl_resource_occ_set_get_register - register occupancy getter and setter\n+ *\n+ * @devlink: devlink\n+ * @resource_id: resource id\n+ * @occ_set: occupancy setter callback\n+ * @occ_get: occupancy getter callback\n+ * @occ_priv: occupancy getter callback priv\n+ *\n+ * Setter will be called when the user wants to change the resource size,\n+ * getter is called to show the user what is current size of the resource.\n+ */\n+void devl_resource_occ_set_get_register(struct devlink *devlink,\n+\t\t\t\t\tu64 resource_id,\n+\t\t\t\t\tdevlink_resource_occ_set_t *occ_set,\n+\t\t\t\t\tdevlink_resource_occ_get_t *occ_get,\n+\t\t\t\t\tvoid *occ_priv)\n+{\n+\tstruct devlink_resource *resource;\n+\n+\tlockdep_assert_held(&devlink->lock);\n+\n+\tresource = devlink_resource_find(devlink, NULL, resource_id);\n+\tif (WARN_ON(!resource))\n+\t\treturn;\n+\tWARN_ON(resource->occ_get || resource->occ_set);\n+\n+\tresource->occ_set = occ_set;\n+\tresource->occ_get = occ_get;\n+\tresource->occ_priv = occ_priv;\n+}\n+EXPORT_SYMBOL_GPL(devl_resource_occ_set_get_register);\n+\n /**\n  * devl_resource_occ_get_register - register occupancy getter\n  *\n@@ -657,7 +714,7 @@ void devl_resource_occ_get_register(struct devlink *devlink,\n \tWARN_ON(resource->occ_get);\n \n \tresource->occ_get = occ_get;\n-\tresource->occ_get_priv = occ_get_priv;\n+\tresource->occ_priv = occ_get_priv;\n }\n EXPORT_SYMBOL_GPL(devl_resource_occ_get_register);\n \n@@ -678,9 +735,10 @@ void devl_resource_occ_get_unregister(struct devlink *devlink,\n \tif (WARN_ON(!resource))\n \t\treturn;\n \tWARN_ON(!resource->occ_get);\n+\tWARN_ON(resource->occ_set);\n \n \tresource->occ_get = NULL;\n-\tresource->occ_get_priv = NULL;\n+\tresource->occ_priv = NULL;\n }\n EXPORT_SYMBOL_GPL(devl_resource_occ_get_unregister);\n \n","prefixes":["iwl-next","v1","13/15"]}