All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Li,Rongqing" <lirongqing@baidu.com>
To: Leon Romanovsky <leon@kernel.org>, Jason Gunthorpe <jgg@ziepe.ca>,
	"Zhu Yanjun" <yanjun.zhu@linux.dev>,
	"linux-rdma@vger.kernel.org" <linux-rdma@vger.kernel.org>
Subject: 答复: [PATCH] RDMA/mlx5: Restore flow_attr-first layout in leftovers flow rules
Date: Fri, 18 Sep 2026 06:55:53 +0000	[thread overview]
Message-ID: <6f0e14ef38f64012a447e5e90102d0ca@baidu.com> (raw)
In-Reply-To: <20260917111722.1723-1-lirongqing@baidu.com>

> 
> From: Li RongQing <lirongqing@baidu.com>
> 
> Commit e91fb8b9d0ed ("RDMA/mlx5: Avoid flexible array warning") split the
> leftovers_specs[] array into two separate structs to silence the "array of flexible
> structures" sparse warning, but in doing so reversed the member order: eth_flow
> was placed before flow_attr.
> 
> _create_flow_rule() locates the flow specs with:
> 
>     ib_flow = (void *)flow_attr + sizeof(*flow_attr);
> 
> which expects the spec data to immediately follow the ib_flow_attr.
> With the reversed order, flow_attr is the last member, so ib_flow points past the
> end of the struct and the num_of_specs = 1 loop reads out-of-bounds memory
> (whatever static data follows in the .data section), producing incorrect flow
> rules or a crash.
> 
> Restore flow_attr as the first member so the eth_flow spec again sits at the offset
> _create_flow_rule() expects.  The two structs are no longer arrays, so the "array
> of flexible structures" warning does not re-occur.
> 
> Fixes: e91fb8b9d0ed ("RDMA/mlx5: Avoid flexible array warning")
> Signed-off-by: Li RongQing <lirongqing@baidu.com>
> ---
>  drivers/infiniband/hw/mlx5/fs.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/mlx5/fs.c b/drivers/infiniband/hw/mlx5/fs.c
> index 98cdc5c..034ab55 100644
> --- a/drivers/infiniband/hw/mlx5/fs.c
> +++ b/drivers/infiniband/hw/mlx5/fs.c
> @@ -1651,8 +1651,8 @@ static struct mlx5_ib_flow_handler
> *create_leftovers_rule(struct mlx5_ib_dev *de
>  	struct mlx5_ib_flow_handler *handler = NULL;
> 
>  	static struct {
> -		struct ib_flow_spec_eth eth_flow;
>  		struct ib_flow_attr	flow_attr;
> +		struct ib_flow_spec_eth eth_flow;
>  	} leftovers_wc = { .flow_attr = { .num_of_specs = 1,
>  					  .size = sizeof(leftovers_wc) },
>  			   .eth_flow = {
> @@ -1662,8 +1662,8 @@ static struct mlx5_ib_flow_handler
> *create_leftovers_rule(struct mlx5_ib_dev *de
>  				   .val = { .dst_mac = { 0x1 } } } };
> 
>  	static struct {
> -		struct ib_flow_spec_eth eth_flow;
>  		struct ib_flow_attr	flow_attr;
> +		struct ib_flow_spec_eth eth_flow;
>  	} leftovers_uc = { .flow_attr = { .num_of_specs = 1,
>  					  .size = sizeof(leftovers_uc) },
>  			   .eth_flow = {
> --
> 2.9.4

This patch should be like below, I will send v2:

diff --git a/drivers/infiniband/hw/mlx5/fs.c b/drivers/infiniband/hw/mlx5/fs.c
index 98cdc5c..e63fdb4 100644
--- a/drivers/infiniband/hw/mlx5/fs.c
+++ b/drivers/infiniband/hw/mlx5/fs.c
@@ -17,6 +17,7 @@
 #include <linux/mlx5/fs.h>
 #include <linux/mlx5/fs_helpers.h>
 #include <linux/mlx5/eswitch.h>
+#include <linux/overflow.h>
 #include <net/inet_ecn.h>
 #include "mlx5_ib.h"
 #include "counters.h"
@@ -1647,36 +1648,32 @@ static struct mlx5_ib_flow_handler *create_leftovers_rule(struct mlx5_ib_dev *de
                                                          struct ib_flow_attr *flow_attr,
                                                          struct mlx5_flow_destination *dst)
 {
+       DEFINE_RAW_FLEX(struct ib_flow_attr, flow_attr_wc, flows, 1);
+       DEFINE_RAW_FLEX(struct ib_flow_attr, flow_attr_uc, flows, 1);
+
        struct mlx5_ib_flow_handler *handler_ucast = NULL;
        struct mlx5_ib_flow_handler *handler = NULL;

-       static struct {
-               struct ib_flow_spec_eth eth_flow;
-               struct ib_flow_attr     flow_attr;
-       } leftovers_wc = { .flow_attr = { .num_of_specs = 1,
-                                         .size = sizeof(leftovers_wc) },
-                          .eth_flow = {
-                                  .type = IB_FLOW_SPEC_ETH,
-                                  .size = sizeof(struct ib_flow_spec_eth),
-                                  .mask = { .dst_mac = { 0x1 } },
-                                  .val = { .dst_mac = { 0x1 } } } };
-
-       static struct {
-               struct ib_flow_spec_eth eth_flow;
-               struct ib_flow_attr     flow_attr;
-       } leftovers_uc = { .flow_attr = { .num_of_specs = 1,
-                                         .size = sizeof(leftovers_uc) },
-                          .eth_flow = {
-                                  .type = IB_FLOW_SPEC_ETH,
-                                  .size = sizeof(struct ib_flow_spec_eth),
-                                  .mask = { .dst_mac = { 0x1 } },
-                                  .val = { .dst_mac = {} } } };
-
-       handler = create_flow_rule(dev, ft_prio, &leftovers_wc.flow_attr, dst);
+       flow_attr_wc->num_of_specs = 1;
+       flow_attr_wc->size = sizeof(struct ib_flow_attr) +
+                             sizeof(struct ib_flow_spec_eth);
+       flow_attr_wc->flows[0].eth.type = IB_FLOW_SPEC_ETH;
+       flow_attr_wc->flows[0].eth.size = sizeof(struct ib_flow_spec_eth);
+       flow_attr_wc->flows[0].eth.mask.dst_mac[0] = 0x1;
+       flow_attr_wc->flows[0].eth.val.dst_mac[0] = 0x1;
+
+       flow_attr_uc->num_of_specs = 1;
+       flow_attr_uc->size = sizeof(struct ib_flow_attr) +
+                             sizeof(struct ib_flow_spec_eth);
+       flow_attr_uc->flows[0].eth.type = IB_FLOW_SPEC_ETH;
+       flow_attr_uc->flows[0].eth.size = sizeof(struct ib_flow_spec_eth);
+       flow_attr_uc->flows[0].eth.mask.dst_mac[0] = 0x1;
+
+       handler = create_flow_rule(dev, ft_prio, flow_attr_wc, dst);
        if (!IS_ERR(handler) &&
            flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT) {
                handler_ucast = create_flow_rule(dev, ft_prio,
-                                                &leftovers_uc.flow_attr, dst);
+                                                flow_attr_uc, dst);
                if (IS_ERR(handler_ucast)) {
                        mlx5_del_flow_rules(handler->rule);
                        ft_prio->refcount--;

[Li,Rongqing] 




  parent reply	other threads:[~2026-09-18  6:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-17 11:17 [PATCH] RDMA/mlx5: Restore flow_attr-first layout in leftovers flow rules lirongqing
2026-09-17 11:25 ` sashiko-bot
2026-09-18  6:55 ` Li,Rongqing [this message]
2026-09-23 12:41 ` Leon Romanovsky
2026-09-23 12:45   ` Leon Romanovsky
2026-09-23 15:45     ` Jason Gunthorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6f0e14ef38f64012a447e5e90102d0ca@baidu.com \
    --to=lirongqing@baidu.com \
    --cc=jgg@ziepe.ca \
    --cc=leon@kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=yanjun.zhu@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.