nfp: make use of extended ack message reporting
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 1 May 2017 04:46:47 +0000 (21:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 May 2017 14:35:47 +0000 (10:35 -0400)
Try to carry error messages to the user via the netlink extended
ack message attribute.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net.h
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

index 38b41fdeaa8f59efe49ff9bd72363143d39b9c4a..fcf81b3be830de463e425338ad9ca92fde2af8e6 100644 (file)
@@ -818,7 +818,8 @@ nfp_net_irqs_assign(struct nfp_net *nn, struct msix_entry *irq_entries,
                    unsigned int n);
 
 struct nfp_net_dp *nfp_net_clone_dp(struct nfp_net *nn);
-int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *new);
+int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *new,
+                         struct netlink_ext_ack *extack);
 
 bool nfp_net_link_changed_read_clear(struct nfp_net *nn);
 int nfp_net_refresh_eth_port(struct nfp_net *nn);
index b9f3548bb65fcf38fb54c8f05be34cc35220304a..db20376260f526348a1447cd300ada57880ab303 100644 (file)
@@ -2524,24 +2524,27 @@ struct nfp_net_dp *nfp_net_clone_dp(struct nfp_net *nn)
        return new;
 }
 
-static int nfp_net_check_config(struct nfp_net *nn, struct nfp_net_dp *dp)
+static int
+nfp_net_check_config(struct nfp_net *nn, struct nfp_net_dp *dp,
+                    struct netlink_ext_ack *extack)
 {
        /* XDP-enabled tests */
        if (!dp->xdp_prog)
                return 0;
        if (dp->fl_bufsz > PAGE_SIZE) {
-               nn_warn(nn, "MTU too large w/ XDP enabled\n");
+               NL_MOD_TRY_SET_ERR_MSG(extack, "MTU too large w/ XDP enabled");
                return -EINVAL;
        }
        if (dp->num_tx_rings > nn->max_tx_rings) {
-               nn_warn(nn, "Insufficient number of TX rings w/ XDP enabled\n");
+               NL_MOD_TRY_SET_ERR_MSG(extack, "Insufficient number of TX rings w/ XDP enabled");
                return -EINVAL;
        }
 
        return 0;
 }
 
-int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *dp)
+int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *dp,
+                         struct netlink_ext_ack *extack)
 {
        int r, err;
 
@@ -2553,7 +2556,7 @@ int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *dp)
 
        dp->num_r_vecs = max(dp->num_rx_rings, dp->num_stack_tx_rings);
 
-       err = nfp_net_check_config(nn, dp);
+       err = nfp_net_check_config(nn, dp, extack);
        if (err)
                goto exit_free_dp;
 
@@ -2628,7 +2631,7 @@ static int nfp_net_change_mtu(struct net_device *netdev, int new_mtu)
 
        dp->mtu = new_mtu;
 
-       return nfp_net_ring_reconfig(nn, dp);
+       return nfp_net_ring_reconfig(nn, dp, NULL);
 }
 
 static void nfp_net_stat64(struct net_device *netdev,
@@ -2944,9 +2947,10 @@ static int nfp_net_xdp_offload(struct nfp_net *nn, struct bpf_prog *prog)
        return ret;
 }
 
-static int nfp_net_xdp_setup(struct nfp_net *nn, struct bpf_prog *prog)
+static int nfp_net_xdp_setup(struct nfp_net *nn, struct netdev_xdp *xdp)
 {
        struct bpf_prog *old_prog = nn->dp.xdp_prog;
+       struct bpf_prog *prog = xdp->prog;
        struct nfp_net_dp *dp;
        int err;
 
@@ -2969,7 +2973,7 @@ static int nfp_net_xdp_setup(struct nfp_net *nn, struct bpf_prog *prog)
        dp->rx_dma_off = prog ? XDP_PACKET_HEADROOM - nn->dp.rx_offset : 0;
 
        /* We need RX reconfig to remap the buffers (BIDIR vs FROM_DEV) */
-       err = nfp_net_ring_reconfig(nn, dp);
+       err = nfp_net_ring_reconfig(nn, dp, xdp->extack);
        if (err)
                return err;
 
@@ -2987,7 +2991,7 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_xdp *xdp)
 
        switch (xdp->command) {
        case XDP_SETUP_PROG:
-               return nfp_net_xdp_setup(nn, xdp->prog);
+               return nfp_net_xdp_setup(nn, xdp);
        case XDP_QUERY_PROG:
                xdp->prog_attached = !!nn->dp.xdp_prog;
                return 0;
index a704efd4e314f4e661c9e5c767c463050c9d539a..abbb47e60cc37e5ba6f3ac477e1b178d16c86bd9 100644 (file)
@@ -309,7 +309,7 @@ static int nfp_net_set_ring_size(struct nfp_net *nn, u32 rxd_cnt, u32 txd_cnt)
        dp->rxd_cnt = rxd_cnt;
        dp->txd_cnt = txd_cnt;
 
-       return nfp_net_ring_reconfig(nn, dp);
+       return nfp_net_ring_reconfig(nn, dp, NULL);
 }
 
 static int nfp_net_set_ringparam(struct net_device *netdev,
@@ -880,7 +880,7 @@ static int nfp_net_set_num_rings(struct nfp_net *nn, unsigned int total_rx,
        if (dp->xdp_prog)
                dp->num_tx_rings += total_rx;
 
-       return nfp_net_ring_reconfig(nn, dp);
+       return nfp_net_ring_reconfig(nn, dp, NULL);
 }
 
 static int nfp_net_set_channels(struct net_device *netdev,