From patchwork Sun Mar 3 05:24:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13579651 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A0D4749C for ; Sun, 3 Mar 2024 05:24:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443459; cv=none; b=XdYkrt7vfAyctKIo8q95tYxyWI1MKdKUnNCKHCPZzmSePENCgsGEY+OduZV5Fk5MQlpremozWVbOlugwQ0fFnOtm39af4dpNMwJCKDAkfJp4yVM7bn+e9LlvahiBlvYPNnja1OcXBmTURSnnNyFc5qYApUMAnqz+wwXYFSEz0gI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443459; c=relaxed/simple; bh=HKnhDYflpFQSRl0hPluJ0n6u5DrST/DLWUBe0oiKsOI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iRKnmVAAsrTeEFXBwHQ00DjT37kekcha7cryEQXZ/3bCsRS6Saw4R8UxHu+GrdtDBzZazrSiqW6qvLhcIJvPdOVvbQyUS0OOuujJTH0tfNGMvaUwy1MXK+rx046Z1M4n1983P6kSbfjJtbeiIypKHwPKXx90npFTkW0bjOj5ARc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BT4f5eCV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BT4f5eCV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96064C43390; Sun, 3 Mar 2024 05:24:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709443459; bh=HKnhDYflpFQSRl0hPluJ0n6u5DrST/DLWUBe0oiKsOI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BT4f5eCVCA32CLBfY35FKpEeg5j8JDGmj12BLAkqpK707pm2+qCX4q9FOfZUS/7xv p3wRRuK1GLJQWqE9GQsvV1ti1HwWmSpwR17kTaR+brt6yuj6XOaAwtnKHebC6cGM1n BBdiM+kgDwi8RwPCJhjXxGVWAe5cflyFdQkwmnpCDOluqmqXVE0yASgvlvGcL1Eypt Hd1/YWXzFpSWR9S3N9Ssj+NXdArNyFVtlA3fxrC+W2XlrqsdAaniWVz/v4HUgvGIhp C2nrxqOo+oPgJ0IE4gzTkHkIRJzWuCJKMKntPDnUZstghXDAuBO4cC5wPPhfUxQxBu LBFL9S6Oo4S4A== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, jiri@resnulli.us, idosch@idosch.org, johannes@sipsolutions.net, fw@strlen.de, pablo@netfilter.org, Jakub Kicinski , kuniyu@amazon.com Subject: [PATCH net-next v2 1/3] netlink: handle EMSGSIZE errors in the core Date: Sat, 2 Mar 2024 21:24:06 -0800 Message-ID: <20240303052408.310064-2-kuba@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240303052408.310064-1-kuba@kernel.org> References: <20240303052408.310064-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Eric points out that our current suggested way of handling EMSGSIZE errors ((err == -EMSGSIZE) ? skb->len : err) will break if we didn't fit even a single object into the buffer provided by the user. This should not happen for well behaved applications, but we can fix that, and free netlink families from dealing with that completely by moving error handling into the core. Let's assume from now on that all EMSGSIZE errors in dumps are because we run out of skb space. Families can now propagate the error nla_put_*() etc generated and not worry about any return value magic. If some family really wants to send EMSGSIZE to user space, assuming it generates the same error on the next dump iteration the skb->len should be 0, and user space should still see the EMSGSIZE. This should simplify families and prevent mistakes in return values which lead to DONE being forced into a separate recv() call as discovered by Ido some time ago. Reviewed-by: Eric Dumazet Signed-off-by: Jakub Kicinski Reviewed-by: Ido Schimmel --- CC: kuniyu@amazon.com --- net/netlink/af_netlink.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index ad7b645e3ae7..da846212fb9b 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2267,6 +2267,15 @@ static int netlink_dump(struct sock *sk, bool lock_taken) if (extra_mutex) mutex_unlock(extra_mutex); + /* EMSGSIZE plus something already in the skb means + * that there's more to dump but current skb has filled up. + * If the callback really wants to return EMSGSIZE to user space + * it needs to do so again, on the next cb->dump() call, + * without putting data in the skb. + */ + if (nlk->dump_done_errno == -EMSGSIZE && skb->len) + nlk->dump_done_errno = skb->len; + cb->extack = NULL; } From patchwork Sun Mar 3 05:24:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13579652 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6ED288C0A for ; Sun, 3 Mar 2024 05:24:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443460; cv=none; b=l5OXXXNZc4NXoYlspYS94wwkSZTFAPx14uizQi12N1+hef7Mi3150SEajjRNYxBh8vYZT8iWFwrUDqi+gJtlUCz73I1+mq110LgHzat8xoW5nej4Gx6FPMnhEJ7za3eW7Mg7R1428vUdxh9urQ4d9kVDSFcl2QMBBQdLLHhTEsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443460; c=relaxed/simple; bh=I9rPy07t15ADD7d3TzEKsPQ9bCltTHRKg9dMINIHAm0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kpxGOLqrmdB9KHpJ2X7klGJCupa5otpigJqheJTww8jg9csntXtHV3rgtXHt168lzZQK8tGgEEFD5QRsRm2iPxqZVIjVdrsWw0awJ5VEz58isjx4COx17yFIhB1bo2ASJxbOwSa7m0a2UZu/QfpSdzBhV/ndsXfGvHFViMzJ1Sk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kC7DaTyg; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kC7DaTyg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BB5CC43394; Sun, 3 Mar 2024 05:24:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709443459; bh=I9rPy07t15ADD7d3TzEKsPQ9bCltTHRKg9dMINIHAm0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kC7DaTyg6Fy857O+r815BXryi0szUrNrQeVuPyP+IHp3rD1J7LhrYTnLoDwVehaiN U46TeryAhidAEZLm7VvRlWhESm6tuJExO3eeVlEpFMfRLYyuEGLaHuG/mjggKfF3fl DOBH1zvA0itET2No4mG84nPHk5qEmOzs2QoYQdEPiZKO9qPbB8mIcD0H8K4OIDfVo3 hnhV9r4HWJJg7p25kbG03QFLli89/O12bhFoHyZS15HlxKE4LNKSl0pJX/g66XJsRf Dj04m3ZJi29IKfJ31yD/hO/VE572xW4eWe8Owk5ph3Flv4EJQ2FYb0XsWjG0+qYlAS 9x/cLa4c3opgQ== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, jiri@resnulli.us, idosch@idosch.org, johannes@sipsolutions.net, fw@strlen.de, pablo@netfilter.org, Jakub Kicinski , amritha.nambiar@intel.com, sridhar.samudrala@intel.com, hawk@kernel.org Subject: [PATCH net-next v2 2/3] netdev: let netlink core handle -EMSGSIZE errors Date: Sat, 2 Mar 2024 21:24:07 -0800 Message-ID: <20240303052408.310064-3-kuba@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240303052408.310064-1-kuba@kernel.org> References: <20240303052408.310064-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Previous change added -EMSGSIZE handling to af_netlink, we don't have to hide these errors any longer. Theoretically the error handling changes from: if (err == -EMSGSIZE) to if (err == -EMSGSIZE && skb->len) everywhere, but in practice it doesn't matter. All messages fit into NLMSG_GOODSIZE, so overflow of an empty skb cannot happen. Reviewed-by: Eric Dumazet Signed-off-by: Jakub Kicinski Reviewed-by: Ido Schimmel --- CC: amritha.nambiar@intel.com CC: sridhar.samudrala@intel.com CC: hawk@kernel.org --- net/core/netdev-genl.c | 15 +++------------ net/core/page_pool_user.c | 2 -- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c index fd98936da3ae..918b109e0cf4 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -152,10 +152,7 @@ int netdev_nl_dev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) } rtnl_unlock(); - if (err != -EMSGSIZE) - return err; - - return skb->len; + return err; } static int @@ -287,10 +284,7 @@ int netdev_nl_napi_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) } rtnl_unlock(); - if (err != -EMSGSIZE) - return err; - - return skb->len; + return err; } static int @@ -463,10 +457,7 @@ int netdev_nl_queue_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) } rtnl_unlock(); - if (err != -EMSGSIZE) - return err; - - return skb->len; + return err; } static int netdev_genl_netdevice_event(struct notifier_block *nb, diff --git a/net/core/page_pool_user.c b/net/core/page_pool_user.c index 278294aca66a..3a3277ba167b 100644 --- a/net/core/page_pool_user.c +++ b/net/core/page_pool_user.c @@ -103,8 +103,6 @@ netdev_nl_page_pool_get_dump(struct sk_buff *skb, struct netlink_callback *cb, mutex_unlock(&page_pools_lock); rtnl_unlock(); - if (skb->len && err == -EMSGSIZE) - return skb->len; return err; } From patchwork Sun Mar 3 05:24:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13579653 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F02068F5D for ; Sun, 3 Mar 2024 05:24:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443461; cv=none; b=YmxCIf2pzYCp4WkCaV3r0YFQwcPg66ZcBmPl7oNuEtccZ9/fY7kuAgc4sPRI4sJZBnVXGmbYq+rzQk1je3+YIuR8q+FubroES6EjXX9swvgkIEJjyjLLGEKr3ifZDtNXDcMKGeBaRNPnevLwe8+Ed++/kRWFc/UTYG6fKWI5Ehw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709443461; c=relaxed/simple; bh=erMYHEtKWk5YhkMUaQk9snyW7OqcL8kOFfm6TWUKMnI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gsP6wVFTxnsdFY/bAI8Gaq55Rsid0v+5bPmTjI8g6bx+fzBTy60+Gr8JQM5H8dukQWZpUztEiL73AXp+MvFkaJOd0zpM71KbgVbkaG6opDIV84U/UUTTpD9L+il228gBtWJfVMpFf/YzKuzi1y4OlOEi+vBpf7TCIeUISBVYLbQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=koiAoZXS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="koiAoZXS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1410DC433B2; Sun, 3 Mar 2024 05:24:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709443460; bh=erMYHEtKWk5YhkMUaQk9snyW7OqcL8kOFfm6TWUKMnI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=koiAoZXSvUpEuZv4YHS1omz5gC2z2WF26azKq6Ot77Zm20Lg7EyLT8uuyLP0uL0Tb MDCLHA1/p7mhfHeQ2vMHaBLpkbedzI4kV9nHxdy/JaN8F4jmm0W5Jf/6979gxAhsFQ VMR8CAou2qZqgnvzs25dcy+k+42t+L9MyEhHxKC3zzqACR+gXbtTzlqgmKJjVgzrj0 xoy/rjMXIxlPeEBAkqJW6iN834ajVuJMi2Ip8MBjKPjU5sxz6ukyCuXfW5tKiCpSTC DqCR70RPmkleR6EFwAkGAKe7G7z6LkOYQeyegtXYrQpnBThOFRIFY6UmQNE5I6GIG7 ReLeVffjl1DYA== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, jiri@resnulli.us, idosch@idosch.org, johannes@sipsolutions.net, fw@strlen.de, pablo@netfilter.org, Jakub Kicinski Subject: [PATCH net-next v2 3/3] genetlink: fit NLMSG_DONE into same read() as families Date: Sat, 2 Mar 2024 21:24:08 -0800 Message-ID: <20240303052408.310064-4-kuba@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240303052408.310064-1-kuba@kernel.org> References: <20240303052408.310064-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Make sure ctrl_fill_info() returns sensible error codes and propagate them out to netlink core. Let netlink core decide when to return skb->len and when to treat the exit as an error. Netlink core does better job at it, if we always return skb->len the core doesn't know when we're done dumping and NLMSG_DONE ends up in a separate read(). Reviewed-by: Eric Dumazet Signed-off-by: Jakub Kicinski Reviewed-by: Ido Schimmel Reviewed-by: Eric Dumazet --- CC: jiri@resnulli.us --- net/netlink/genetlink.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index 50ec599a5cff..3b7666944b11 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -1232,7 +1232,7 @@ static int ctrl_fill_info(const struct genl_family *family, u32 portid, u32 seq, hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd); if (hdr == NULL) - return -1; + return -EMSGSIZE; if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) || @@ -1355,6 +1355,7 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) struct net *net = sock_net(skb->sk); int fams_to_skip = cb->args[0]; unsigned int id; + int err = 0; idr_for_each_entry(&genl_fam_idr, rt, id) { if (!rt->netnsok && !net_eq(net, &init_net)) @@ -1363,16 +1364,17 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) if (n++ < fams_to_skip) continue; - if (ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, NLM_F_MULTI, - skb, CTRL_CMD_NEWFAMILY) < 0) { + err = ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, NLM_F_MULTI, + skb, CTRL_CMD_NEWFAMILY); + if (err) { n--; break; } } cb->args[0] = n; - return skb->len; + return err; } static struct sk_buff *ctrl_build_family_msg(const struct genl_family *family,