mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
nfp: allow fallback packets from non-reprs
Currently, it is assumed that fallback packets will be from reprs. Modify this to allow an app to receive non-repr ports from the fallback channel - e.g. from an internal port. If such a packet is received, do not update repr stats. Change the naming function calls so as not to imply it will always be a repr netdev returned. Add the option to set a bool value to redirect a fallback packet out the returned port rather than RXing it. Setting of this bool in subsequent patches allows the handling of packets falling back when they are due to egress an internal port. Signed-off-by: John Hurley <john.hurley@netronome.com> Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Simon Horman <simon.horman@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4d12ba4278
commit
27f54b5825
@ -53,7 +53,8 @@ nfp_abm_setup_tc(struct nfp_app *app, struct net_device *netdev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct net_device *nfp_abm_repr_get(struct nfp_app *app, u32 port_id)
|
static struct net_device *
|
||||||
|
nfp_abm_repr_get(struct nfp_app *app, u32 port_id, bool *redir_egress)
|
||||||
{
|
{
|
||||||
enum nfp_repr_type rtype;
|
enum nfp_repr_type rtype;
|
||||||
struct nfp_reprs *reprs;
|
struct nfp_reprs *reprs;
|
||||||
@ -549,5 +550,5 @@ const struct nfp_app_type app_abm = {
|
|||||||
.eswitch_mode_get = nfp_abm_eswitch_mode_get,
|
.eswitch_mode_get = nfp_abm_eswitch_mode_get,
|
||||||
.eswitch_mode_set = nfp_abm_eswitch_mode_set,
|
.eswitch_mode_set = nfp_abm_eswitch_mode_set,
|
||||||
|
|
||||||
.repr_get = nfp_abm_repr_get,
|
.dev_get = nfp_abm_repr_get,
|
||||||
};
|
};
|
||||||
|
@ -159,7 +159,7 @@ nfp_flower_cmsg_portmod_rx(struct nfp_app *app, struct sk_buff *skb)
|
|||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
netdev = nfp_app_repr_get(app, be32_to_cpu(msg->portnum));
|
netdev = nfp_app_dev_get(app, be32_to_cpu(msg->portnum), NULL);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
if (!netdev) {
|
if (!netdev) {
|
||||||
nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
|
nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
|
||||||
@ -192,7 +192,7 @@ nfp_flower_cmsg_portreify_rx(struct nfp_app *app, struct sk_buff *skb)
|
|||||||
msg = nfp_flower_cmsg_get_data(skb);
|
msg = nfp_flower_cmsg_get_data(skb);
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
exists = !!nfp_app_repr_get(app, be32_to_cpu(msg->portnum));
|
exists = !!nfp_app_dev_get(app, be32_to_cpu(msg->portnum), NULL);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
|
nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
|
||||||
|
@ -216,7 +216,7 @@ nfp_flower_repr_get_type_and_port(struct nfp_app *app, u32 port_id, u8 *port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct net_device *
|
static struct net_device *
|
||||||
nfp_flower_repr_get(struct nfp_app *app, u32 port_id)
|
nfp_flower_repr_get(struct nfp_app *app, u32 port_id, bool *redir_egress)
|
||||||
{
|
{
|
||||||
enum nfp_repr_type repr_type;
|
enum nfp_repr_type repr_type;
|
||||||
struct nfp_reprs *reprs;
|
struct nfp_reprs *reprs;
|
||||||
@ -923,7 +923,7 @@ const struct nfp_app_type app_flower = {
|
|||||||
.sriov_disable = nfp_flower_sriov_disable,
|
.sriov_disable = nfp_flower_sriov_disable,
|
||||||
|
|
||||||
.eswitch_mode_get = eswitch_mode_get,
|
.eswitch_mode_get = eswitch_mode_get,
|
||||||
.repr_get = nfp_flower_repr_get,
|
.dev_get = nfp_flower_repr_get,
|
||||||
|
|
||||||
.setup_tc = nfp_flower_setup_tc,
|
.setup_tc = nfp_flower_setup_tc,
|
||||||
};
|
};
|
||||||
|
@ -171,7 +171,7 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb)
|
|||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
ipv4_addr = payload->tun_info[i].ipv4;
|
ipv4_addr = payload->tun_info[i].ipv4;
|
||||||
port = be32_to_cpu(payload->tun_info[i].egress_port);
|
port = be32_to_cpu(payload->tun_info[i].egress_port);
|
||||||
netdev = nfp_app_repr_get(app, port);
|
netdev = nfp_app_dev_get(app, port, NULL);
|
||||||
if (!netdev)
|
if (!netdev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -366,7 +366,7 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb)
|
|||||||
|
|
||||||
payload = nfp_flower_cmsg_get_data(skb);
|
payload = nfp_flower_cmsg_get_data(skb);
|
||||||
|
|
||||||
netdev = nfp_app_repr_get(app, be32_to_cpu(payload->ingress_port));
|
netdev = nfp_app_dev_get(app, be32_to_cpu(payload->ingress_port), NULL);
|
||||||
if (!netdev)
|
if (!netdev)
|
||||||
goto route_fail_warning;
|
goto route_fail_warning;
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ extern const struct nfp_app_type app_abm;
|
|||||||
* @eswitch_mode_set: set SR-IOV eswitch mode (under pf->lock)
|
* @eswitch_mode_set: set SR-IOV eswitch mode (under pf->lock)
|
||||||
* @sriov_enable: app-specific sriov initialisation
|
* @sriov_enable: app-specific sriov initialisation
|
||||||
* @sriov_disable: app-specific sriov clean-up
|
* @sriov_disable: app-specific sriov clean-up
|
||||||
* @repr_get: get representor netdev
|
* @dev_get: get representor or internal port representing netdev
|
||||||
*/
|
*/
|
||||||
struct nfp_app_type {
|
struct nfp_app_type {
|
||||||
enum nfp_app_id id;
|
enum nfp_app_id id;
|
||||||
@ -143,7 +143,8 @@ struct nfp_app_type {
|
|||||||
|
|
||||||
enum devlink_eswitch_mode (*eswitch_mode_get)(struct nfp_app *app);
|
enum devlink_eswitch_mode (*eswitch_mode_get)(struct nfp_app *app);
|
||||||
int (*eswitch_mode_set)(struct nfp_app *app, u16 mode);
|
int (*eswitch_mode_set)(struct nfp_app *app, u16 mode);
|
||||||
struct net_device *(*repr_get)(struct nfp_app *app, u32 id);
|
struct net_device *(*dev_get)(struct nfp_app *app, u32 id,
|
||||||
|
bool *redir_egress);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -397,12 +398,14 @@ static inline void nfp_app_sriov_disable(struct nfp_app *app)
|
|||||||
app->type->sriov_disable(app);
|
app->type->sriov_disable(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct net_device *nfp_app_repr_get(struct nfp_app *app, u32 id)
|
static inline
|
||||||
|
struct net_device *nfp_app_dev_get(struct nfp_app *app, u32 id,
|
||||||
|
bool *redir_egress)
|
||||||
{
|
{
|
||||||
if (unlikely(!app || !app->type->repr_get))
|
if (unlikely(!app || !app->type->dev_get))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return app->type->repr_get(app, id);
|
return app->type->dev_get(app, id, redir_egress);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nfp_app *nfp_app_from_netdev(struct net_device *netdev);
|
struct nfp_app *nfp_app_from_netdev(struct net_device *netdev);
|
||||||
|
@ -1683,6 +1683,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
|
|||||||
struct nfp_net_rx_buf *rxbuf;
|
struct nfp_net_rx_buf *rxbuf;
|
||||||
struct nfp_net_rx_desc *rxd;
|
struct nfp_net_rx_desc *rxd;
|
||||||
struct nfp_meta_parsed meta;
|
struct nfp_meta_parsed meta;
|
||||||
|
bool redir_egress = false;
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
dma_addr_t new_dma_addr;
|
dma_addr_t new_dma_addr;
|
||||||
u32 meta_len_xdp = 0;
|
u32 meta_len_xdp = 0;
|
||||||
@ -1818,13 +1819,16 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
|
|||||||
struct nfp_net *nn;
|
struct nfp_net *nn;
|
||||||
|
|
||||||
nn = netdev_priv(dp->netdev);
|
nn = netdev_priv(dp->netdev);
|
||||||
netdev = nfp_app_repr_get(nn->app, meta.portid);
|
netdev = nfp_app_dev_get(nn->app, meta.portid,
|
||||||
|
&redir_egress);
|
||||||
if (unlikely(!netdev)) {
|
if (unlikely(!netdev)) {
|
||||||
nfp_net_rx_drop(dp, r_vec, rx_ring, rxbuf,
|
nfp_net_rx_drop(dp, r_vec, rx_ring, rxbuf,
|
||||||
NULL);
|
NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
nfp_repr_inc_rx_stats(netdev, pkt_len);
|
|
||||||
|
if (nfp_netdev_is_nfp_repr(netdev))
|
||||||
|
nfp_repr_inc_rx_stats(netdev, pkt_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
skb = build_skb(rxbuf->frag, true_bufsz);
|
skb = build_skb(rxbuf->frag, true_bufsz);
|
||||||
@ -1859,7 +1863,13 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
|
|||||||
if (meta_len_xdp)
|
if (meta_len_xdp)
|
||||||
skb_metadata_set(skb, meta_len_xdp);
|
skb_metadata_set(skb, meta_len_xdp);
|
||||||
|
|
||||||
napi_gro_receive(&rx_ring->r_vec->napi, skb);
|
if (likely(!redir_egress)) {
|
||||||
|
napi_gro_receive(&rx_ring->r_vec->napi, skb);
|
||||||
|
} else {
|
||||||
|
skb->dev = netdev;
|
||||||
|
__skb_push(skb, ETH_HLEN);
|
||||||
|
dev_queue_xmit(skb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xdp_prog) {
|
if (xdp_prog) {
|
||||||
|
Loading…
Reference in New Issue
Block a user