netdevsim: Add extack error message for devlink reload
authorDavid Ahern <dsahern@gmail.com>
Tue, 5 Jun 2018 15:14:10 +0000 (08:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Jun 2018 16:32:37 +0000 (12:32 -0400)
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>
drivers/net/netdevsim/devlink.c
drivers/net/netdevsim/fib.c
drivers/net/netdevsim/netdevsim.h

index e8366cf372ffd12157cba57a23d47b164d56c540..ba663e5af168bc4db3152f6a8fdaf85bf4753148 100644 (file)
@@ -163,7 +163,7 @@ static int nsim_devlink_reload(struct devlink *devlink,
 
                err = devlink_resource_size_get(devlink, res_ids[i], &val);
                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)
                                return err;
                }
@@ -181,7 +181,7 @@ static void nsim_devlink_net_reset(struct net *net)
        int 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",
                               res_ids[i]);
                }
index 9bfe9e151e1317fcb1157c85ae65831458c7752a..f61d094746c069bb7ac1c6db9eb77fe0820d2562 100644 (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;
 }
 
-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_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
         * --> 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;
-       else
+       } else {
                entry->max = val;
+       }
 
        return err;
 }
index 3a8581af3b850a6f7449d3d16727a8d8f6a1b86a..8ca50b72c3287f41130beb61da42cf1bec360177 100644 (file)
@@ -126,7 +126,8 @@ void nsim_devlink_exit(void);
 int nsim_fib_init(void);
 void nsim_fib_exit(void);
 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
 static inline int nsim_devlink_setup(struct netdevsim *ns)
 {