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>
This commit is contained in:
David Ahern 2018-06-05 08:14:10 -07:00 committed by David S. Miller
parent ac0fc8a1bb
commit 7fa76d777e
3 changed files with 10 additions and 6 deletions

View file

@ -163,7 +163,7 @@ static int nsim_devlink_reload(struct devlink *devlink,
err = devlink_resource_size_get(devlink, res_ids[i], &val); err = devlink_resource_size_get(devlink, res_ids[i], &val);
if (!err) { if (!err) {
err = nsim_fib_set_max(net, res_ids[i], val); err = nsim_fib_set_max(net, res_ids[i], val, extack);
if (err) if (err)
return err; return err;
} }
@ -181,7 +181,7 @@ static void nsim_devlink_net_reset(struct net *net)
int i; int i;
for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { for (i = 0; i < ARRAY_SIZE(res_ids); ++i) {
if (nsim_fib_set_max(net, res_ids[i], (u64)-1)) { if (nsim_fib_set_max(net, res_ids[i], (u64)-1, NULL)) {
pr_err("Failed to reset limit for resource %u\n", pr_err("Failed to reset limit for resource %u\n",
res_ids[i]); res_ids[i]);
} }

View file

@ -64,7 +64,8 @@ u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max)
return max ? entry->max : entry->num; return max ? entry->max : entry->num;
} }
int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val) int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val,
struct netlink_ext_ack *extack)
{ {
struct nsim_fib_data *fib_data = net_generic(net, nsim_fib_net_id); struct nsim_fib_data *fib_data = net_generic(net, nsim_fib_net_id);
struct nsim_fib_entry *entry; struct nsim_fib_entry *entry;
@ -90,10 +91,12 @@ int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val)
/* not allowing a new max to be less than curren occupancy /* not allowing a new max to be less than curren occupancy
* --> no means of evicting entries * --> no means of evicting entries
*/ */
if (val < entry->num) if (val < entry->num) {
NL_SET_ERR_MSG_MOD(extack, "New size is less than current occupancy");
err = -EINVAL; err = -EINVAL;
else } else {
entry->max = val; entry->max = val;
}
return err; return err;
} }

View file

@ -126,7 +126,8 @@ void nsim_devlink_exit(void);
int nsim_fib_init(void); int nsim_fib_init(void);
void nsim_fib_exit(void); void nsim_fib_exit(void);
u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max); u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max);
int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val); int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val,
struct netlink_ext_ack *extack);
#else #else
static inline int nsim_devlink_setup(struct netdevsim *ns) static inline int nsim_devlink_setup(struct netdevsim *ns)
{ {