Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netdevsim: Add extack error message for devlink reload

devlink reset command can fail if a FIB resource limit is set to a value
lower than the current occupancy. Return a proper message indicating the
reason for the failure.

$ devlink resource sh netdevsim/netdevsim0
netdevsim/netdevsim0:
name IPv4 size unlimited unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none
resources:
name fib size unlimited occ 43 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none
name fib-rules size unlimited occ 4 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none
name IPv6 size unlimited unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none
resources:
name fib size unlimited occ 54 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none
name fib-rules size unlimited occ 3 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables none

$ devlink resource set netdevsim/netdevsim0 path /IPv4/fib size 40

$ devlink dev reload netdevsim/netdevsim0
Error: netdevsim: New size is less than current occupancy.
devlink answers: Invalid argument

Signed-off-by: David Ahern <dsahern@gmail.com>
Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

David Ahern and committed by
David S. Miller
7fa76d77 ac0fc8a1

+10 -6
+2 -2
drivers/net/netdevsim/devlink.c
··· 163 163 164 164 err = devlink_resource_size_get(devlink, res_ids[i], &val); 165 165 if (!err) { 166 - err = nsim_fib_set_max(net, res_ids[i], val); 166 + err = nsim_fib_set_max(net, res_ids[i], val, extack); 167 167 if (err) 168 168 return err; 169 169 } ··· 181 181 int i; 182 182 183 183 for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { 184 - if (nsim_fib_set_max(net, res_ids[i], (u64)-1)) { 184 + if (nsim_fib_set_max(net, res_ids[i], (u64)-1, NULL)) { 185 185 pr_err("Failed to reset limit for resource %u\n", 186 186 res_ids[i]); 187 187 }
+6 -3
drivers/net/netdevsim/fib.c
··· 64 64 return max ? entry->max : entry->num; 65 65 } 66 66 67 - int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val) 67 + int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val, 68 + struct netlink_ext_ack *extack) 68 69 { 69 70 struct nsim_fib_data *fib_data = net_generic(net, nsim_fib_net_id); 70 71 struct nsim_fib_entry *entry; ··· 91 90 /* not allowing a new max to be less than curren occupancy 92 91 * --> no means of evicting entries 93 92 */ 94 - if (val < entry->num) 93 + if (val < entry->num) { 94 + NL_SET_ERR_MSG_MOD(extack, "New size is less than current occupancy"); 95 95 err = -EINVAL; 96 - else 96 + } else { 97 97 entry->max = val; 98 + } 98 99 99 100 return err; 100 101 }
+2 -1
drivers/net/netdevsim/netdevsim.h
··· 126 126 int nsim_fib_init(void); 127 127 void nsim_fib_exit(void); 128 128 u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max); 129 - int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val); 129 + int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val, 130 + struct netlink_ext_ack *extack); 130 131 #else 131 132 static inline int nsim_devlink_setup(struct netdevsim *ns) 132 133 {