devlink: pass flags as an arg of dump_one() callback
authorJiri Pirko <jiri@nvidia.com>
Fri, 11 Aug 2023 15:57:07 +0000 (17:57 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 14 Aug 2023 18:47:25 +0000 (11:47 -0700)
In order to easily set NLM_F_DUMP_FILTERED for partial dumps, pass the
flags as an arg of dump_one() callback. Currently, it is always
NLM_F_MULTI.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20230811155714.1736405-7-jiri@resnulli.us
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/devlink/dev.c
net/devlink/devl_internal.h
net/devlink/health.c
net/devlink/leftover.c
net/devlink/netlink.c

index 22e8ab3..abf3393 100644 (file)
@@ -218,11 +218,11 @@ int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int
 devlink_nl_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                       struct netlink_callback *cb)
+                       struct netlink_callback *cb, int flags)
 {
        return devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
                               NETLINK_CB(cb->skb).portid,
-                              cb->nlh->nlmsg_seq, NLM_F_MULTI);
+                              cb->nlh->nlmsg_seq, flags);
 }
 
 int devlink_nl_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
@@ -828,13 +828,13 @@ int devlink_nl_info_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int
 devlink_nl_info_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                            struct netlink_callback *cb)
+                            struct netlink_callback *cb, int flags)
 {
        int err;
 
        err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
                                   NETLINK_CB(cb->skb).portid,
-                                  cb->nlh->nlmsg_seq, NLM_F_MULTI,
+                                  cb->nlh->nlmsg_seq, flags,
                                   cb->extack);
        if (err == -EOPNOTSUPP)
                err = 0;
@@ -1231,14 +1231,15 @@ int devlink_nl_selftests_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int devlink_nl_selftests_get_dump_one(struct sk_buff *msg,
                                             struct devlink *devlink,
-                                            struct netlink_callback *cb)
+                                            struct netlink_callback *cb,
+                                            int flags)
 {
        if (!devlink->ops->selftest_check)
                return 0;
 
        return devlink_nl_selftests_fill(msg, devlink,
                                         NETLINK_CB(cb->skb).portid,
-                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
+                                        cb->nlh->nlmsg_seq, flags,
                                         cb->extack);
 }
 
index 500c91c..f8af6ff 100644 (file)
@@ -115,7 +115,8 @@ struct devlink_nl_dump_state {
 
 typedef int devlink_nl_dump_one_func_t(struct sk_buff *msg,
                                       struct devlink *devlink,
-                                      struct netlink_callback *cb);
+                                      struct netlink_callback *cb,
+                                      int flags);
 
 extern const struct genl_small_ops devlink_nl_small_ops[54];
 
index dbe2d6a..b9b3e68 100644 (file)
@@ -386,7 +386,8 @@ int devlink_nl_health_reporter_get_doit(struct sk_buff *skb,
 
 static int devlink_nl_health_reporter_get_dump_one(struct sk_buff *msg,
                                                   struct devlink *devlink,
-                                                  struct netlink_callback *cb)
+                                                  struct netlink_callback *cb,
+                                                  int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_health_reporter *reporter;
@@ -404,7 +405,7 @@ static int devlink_nl_health_reporter_get_dump_one(struct sk_buff *msg,
                                                      DEVLINK_CMD_HEALTH_REPORTER_GET,
                                                      NETLINK_CB(cb->skb).portid,
                                                      cb->nlh->nlmsg_seq,
-                                                     NLM_F_MULTI);
+                                                     flags);
                if (err) {
                        state->idx = idx;
                        return err;
@@ -421,7 +422,7 @@ static int devlink_nl_health_reporter_get_dump_one(struct sk_buff *msg,
                                                              DEVLINK_CMD_HEALTH_REPORTER_GET,
                                                              NETLINK_CB(cb->skb).portid,
                                                              cb->nlh->nlmsg_seq,
-                                                             NLM_F_MULTI);
+                                                             flags);
                        if (err) {
                                state->idx = idx;
                                return err;
index 21f1058..883c655 100644 (file)
@@ -1006,7 +1006,7 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate,
 
 static int
 devlink_nl_rate_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                            struct netlink_callback *cb)
+                            struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_rate *devlink_rate;
@@ -1022,8 +1022,7 @@ devlink_nl_rate_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
                        continue;
                }
                err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id,
-                                          cb->nlh->nlmsg_seq,
-                                          NLM_F_MULTI, NULL);
+                                          cb->nlh->nlmsg_seq, flags, NULL);
                if (err) {
                        state->idx = idx;
                        break;
@@ -1100,7 +1099,7 @@ int devlink_nl_port_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int
 devlink_nl_port_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                            struct netlink_callback *cb)
+                            struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_port *devlink_port;
@@ -1111,8 +1110,8 @@ devlink_nl_port_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
                err = devlink_nl_port_fill(msg, devlink_port,
                                           DEVLINK_CMD_NEW,
                                           NETLINK_CB(cb->skb).portid,
-                                          cb->nlh->nlmsg_seq,
-                                          NLM_F_MULTI, cb->extack);
+                                          cb->nlh->nlmsg_seq, flags,
+                                          cb->extack);
                if (err) {
                        state->idx = port_index;
                        break;
@@ -1856,7 +1855,8 @@ int devlink_nl_linecard_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int devlink_nl_linecard_get_dump_one(struct sk_buff *msg,
                                            struct devlink *devlink,
-                                           struct netlink_callback *cb)
+                                           struct netlink_callback *cb,
+                                           int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_linecard *linecard;
@@ -1872,8 +1872,7 @@ static int devlink_nl_linecard_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_linecard_fill(msg, devlink, linecard,
                                               DEVLINK_CMD_LINECARD_NEW,
                                               NETLINK_CB(cb->skb).portid,
-                                              cb->nlh->nlmsg_seq,
-                                              NLM_F_MULTI,
+                                              cb->nlh->nlmsg_seq, flags,
                                               cb->extack);
                mutex_unlock(&linecard->state_lock);
                if (err) {
@@ -2120,7 +2119,7 @@ int devlink_nl_sb_get_doit(struct sk_buff *skb, struct genl_info *info)
 
 static int
 devlink_nl_sb_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                          struct netlink_callback *cb)
+                          struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_sb *devlink_sb;
@@ -2135,8 +2134,7 @@ devlink_nl_sb_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
                err = devlink_nl_sb_fill(msg, devlink, devlink_sb,
                                         DEVLINK_CMD_SB_NEW,
                                         NETLINK_CB(cb->skb).portid,
-                                        cb->nlh->nlmsg_seq,
-                                        NLM_F_MULTI);
+                                        cb->nlh->nlmsg_seq, flags);
                if (err) {
                        state->idx = idx;
                        break;
@@ -2233,7 +2231,7 @@ int devlink_nl_sb_pool_get_doit(struct sk_buff *skb, struct genl_info *info)
 static int __sb_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
                                struct devlink *devlink,
                                struct devlink_sb *devlink_sb,
-                               u32 portid, u32 seq)
+                               u32 portid, u32 seq, int flags)
 {
        u16 pool_count = devlink_sb_pool_count(devlink_sb);
        u16 pool_index;
@@ -2248,7 +2246,7 @@ static int __sb_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
                                              devlink_sb,
                                              pool_index,
                                              DEVLINK_CMD_SB_POOL_NEW,
-                                             portid, seq, NLM_F_MULTI);
+                                             portid, seq, flags);
                if (err)
                        return err;
                (*p_idx)++;
@@ -2258,7 +2256,7 @@ static int __sb_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
 
 static int
 devlink_nl_sb_pool_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
-                               struct netlink_callback *cb)
+                               struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_sb *devlink_sb;
@@ -2272,7 +2270,7 @@ devlink_nl_sb_pool_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
                err = __sb_pool_get_dumpit(msg, state->idx, &idx,
                                           devlink, devlink_sb,
                                           NETLINK_CB(cb->skb).portid,
-                                          cb->nlh->nlmsg_seq);
+                                          cb->nlh->nlmsg_seq, flags);
                if (err == -EOPNOTSUPP) {
                        err = 0;
                } else if (err) {
@@ -2436,7 +2434,7 @@ int devlink_nl_sb_port_pool_get_doit(struct sk_buff *skb,
 static int __sb_port_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
                                     struct devlink *devlink,
                                     struct devlink_sb *devlink_sb,
-                                    u32 portid, u32 seq)
+                                    u32 portid, u32 seq, int flags)
 {
        struct devlink_port *devlink_port;
        u16 pool_count = devlink_sb_pool_count(devlink_sb);
@@ -2455,8 +2453,7 @@ static int __sb_port_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
                                                           devlink_sb,
                                                           pool_index,
                                                           DEVLINK_CMD_SB_PORT_POOL_NEW,
-                                                          portid, seq,
-                                                          NLM_F_MULTI);
+                                                          portid, seq, flags);
                        if (err)
                                return err;
                        (*p_idx)++;
@@ -2468,7 +2465,7 @@ static int __sb_port_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
 static int
 devlink_nl_sb_port_pool_get_dump_one(struct sk_buff *msg,
                                     struct devlink *devlink,
-                                    struct netlink_callback *cb)
+                                    struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_sb *devlink_sb;
@@ -2482,7 +2479,7 @@ devlink_nl_sb_port_pool_get_dump_one(struct sk_buff *msg,
                err = __sb_port_pool_get_dumpit(msg, state->idx, &idx,
                                                devlink, devlink_sb,
                                                NETLINK_CB(cb->skb).portid,
-                                               cb->nlh->nlmsg_seq);
+                                               cb->nlh->nlmsg_seq, flags);
                if (err == -EOPNOTSUPP) {
                        err = 0;
                } else if (err) {
@@ -2654,7 +2651,7 @@ static int __sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
                                        int start, int *p_idx,
                                        struct devlink *devlink,
                                        struct devlink_sb *devlink_sb,
-                                       u32 portid, u32 seq)
+                                       u32 portid, u32 seq, int flags)
 {
        struct devlink_port *devlink_port;
        unsigned long port_index;
@@ -2675,7 +2672,7 @@ static int __sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
                                                              DEVLINK_SB_POOL_TYPE_INGRESS,
                                                              DEVLINK_CMD_SB_TC_POOL_BIND_NEW,
                                                              portid, seq,
-                                                             NLM_F_MULTI);
+                                                             flags);
                        if (err)
                                return err;
                        (*p_idx)++;
@@ -2693,7 +2690,7 @@ static int __sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
                                                              DEVLINK_SB_POOL_TYPE_EGRESS,
                                                              DEVLINK_CMD_SB_TC_POOL_BIND_NEW,
                                                              portid, seq,
-                                                             NLM_F_MULTI);
+                                                             flags);
                        if (err)
                                return err;
                        (*p_idx)++;
@@ -2704,7 +2701,8 @@ static int __sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
 
 static int devlink_nl_sb_tc_pool_bind_get_dump_one(struct sk_buff *msg,
                                                   struct devlink *devlink,
-                                                  struct netlink_callback *cb)
+                                                  struct netlink_callback *cb,
+                                                  int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_sb *devlink_sb;
@@ -2718,7 +2716,7 @@ static int devlink_nl_sb_tc_pool_bind_get_dump_one(struct sk_buff *msg,
                err = __sb_tc_pool_bind_get_dumpit(msg, state->idx, &idx,
                                                   devlink, devlink_sb,
                                                   NETLINK_CB(cb->skb).portid,
-                                                  cb->nlh->nlmsg_seq);
+                                                  cb->nlh->nlmsg_seq, flags);
                if (err == -EOPNOTSUPP) {
                        err = 0;
                } else if (err) {
@@ -4185,7 +4183,8 @@ static void devlink_param_notify(struct devlink *devlink,
 
 static int devlink_nl_param_get_dump_one(struct sk_buff *msg,
                                         struct devlink *devlink,
-                                        struct netlink_callback *cb)
+                                        struct netlink_callback *cb,
+                                        int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_param_item *param_item;
@@ -4196,8 +4195,7 @@ static int devlink_nl_param_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_param_fill(msg, devlink, 0, param_item,
                                            DEVLINK_CMD_PARAM_GET,
                                            NETLINK_CB(cb->skb).portid,
-                                           cb->nlh->nlmsg_seq,
-                                           NLM_F_MULTI);
+                                           cb->nlh->nlmsg_seq, flags);
                if (err == -EOPNOTSUPP) {
                        err = 0;
                } else if (err) {
@@ -4848,8 +4846,7 @@ int devlink_nl_region_get_doit(struct sk_buff *skb, struct genl_info *info)
 static int devlink_nl_cmd_region_get_port_dumpit(struct sk_buff *msg,
                                                 struct netlink_callback *cb,
                                                 struct devlink_port *port,
-                                                int *idx,
-                                                int start)
+                                                int *idx, int start, int flags)
 {
        struct devlink_region *region;
        int err = 0;
@@ -4863,7 +4860,7 @@ static int devlink_nl_cmd_region_get_port_dumpit(struct sk_buff *msg,
                                             DEVLINK_CMD_REGION_GET,
                                             NETLINK_CB(cb->skb).portid,
                                             cb->nlh->nlmsg_seq,
-                                            NLM_F_MULTI, region);
+                                            flags, region);
                if (err)
                        goto out;
                (*idx)++;
@@ -4875,7 +4872,8 @@ out:
 
 static int devlink_nl_region_get_dump_one(struct sk_buff *msg,
                                          struct devlink *devlink,
-                                         struct netlink_callback *cb)
+                                         struct netlink_callback *cb,
+                                         int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_region *region;
@@ -4892,8 +4890,8 @@ static int devlink_nl_region_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_region_fill(msg, devlink,
                                             DEVLINK_CMD_REGION_GET,
                                             NETLINK_CB(cb->skb).portid,
-                                            cb->nlh->nlmsg_seq,
-                                            NLM_F_MULTI, region);
+                                            cb->nlh->nlmsg_seq, flags,
+                                            region);
                if (err) {
                        state->idx = idx;
                        return err;
@@ -4903,7 +4901,7 @@ static int devlink_nl_region_get_dump_one(struct sk_buff *msg,
 
        xa_for_each(&devlink->ports, port_index, port) {
                err = devlink_nl_cmd_region_get_port_dumpit(msg, cb, port, &idx,
-                                                           state->idx);
+                                                           state->idx, flags);
                if (err) {
                        state->idx = idx;
                        return err;
@@ -5699,7 +5697,7 @@ err_trap_fill:
 
 static int devlink_nl_trap_get_dump_one(struct sk_buff *msg,
                                        struct devlink *devlink,
-                                       struct netlink_callback *cb)
+                                       struct netlink_callback *cb, int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_trap_item *trap_item;
@@ -5714,8 +5712,7 @@ static int devlink_nl_trap_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_trap_fill(msg, devlink, trap_item,
                                           DEVLINK_CMD_TRAP_NEW,
                                           NETLINK_CB(cb->skb).portid,
-                                          cb->nlh->nlmsg_seq,
-                                          NLM_F_MULTI);
+                                          cb->nlh->nlmsg_seq, flags);
                if (err) {
                        state->idx = idx;
                        break;
@@ -5910,7 +5907,8 @@ err_trap_group_fill:
 
 static int devlink_nl_trap_group_get_dump_one(struct sk_buff *msg,
                                              struct devlink *devlink,
-                                             struct netlink_callback *cb)
+                                             struct netlink_callback *cb,
+                                             int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_trap_group_item *group_item;
@@ -5926,8 +5924,7 @@ static int devlink_nl_trap_group_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_trap_group_fill(msg, devlink, group_item,
                                                 DEVLINK_CMD_TRAP_GROUP_NEW,
                                                 NETLINK_CB(cb->skb).portid,
-                                                cb->nlh->nlmsg_seq,
-                                                NLM_F_MULTI);
+                                                cb->nlh->nlmsg_seq, flags);
                if (err) {
                        state->idx = idx;
                        break;
@@ -6205,7 +6202,8 @@ err_trap_policer_fill:
 
 static int devlink_nl_trap_policer_get_dump_one(struct sk_buff *msg,
                                                struct devlink *devlink,
-                                               struct netlink_callback *cb)
+                                               struct netlink_callback *cb,
+                                               int flags)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_trap_policer_item *policer_item;
@@ -6220,8 +6218,7 @@ static int devlink_nl_trap_policer_get_dump_one(struct sk_buff *msg,
                err = devlink_nl_trap_policer_fill(msg, devlink, policer_item,
                                                   DEVLINK_CMD_TRAP_POLICER_NEW,
                                                   NETLINK_CB(cb->skb).portid,
-                                                  cb->nlh->nlmsg_seq,
-                                                  NLM_F_MULTI);
+                                                  cb->nlh->nlmsg_seq, flags);
                if (err) {
                        state->idx = idx;
                        break;
index 1338866..47e44fb 100644 (file)
@@ -182,7 +182,7 @@ int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,
                devl_lock(devlink);
 
                if (devl_is_registered(devlink))
-                       err = dump_one(msg, devlink, cb);
+                       err = dump_one(msg, devlink, cb, NLM_F_MULTI);
                else
                        err = 0;