mirror of https://gitee.com/openkylin/linux.git
mlx4: make validate_loopback() more generic
Testing a boolean in fast path is not worth duplicating the code allocating packets, when GRO is on or off. If this proves to be a problem, we might later use a jump label. Next patch will remove this duplicated code and ease code review. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
02e6fd3e55
commit
6969cf0fdb
|
@ -584,20 +584,17 @@ static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
|
||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void validate_loopback(struct mlx4_en_priv *priv, struct sk_buff *skb)
|
static void validate_loopback(struct mlx4_en_priv *priv, void *va)
|
||||||
{
|
{
|
||||||
|
const unsigned char *data = va + ETH_HLEN;
|
||||||
int i;
|
int i;
|
||||||
int offset = ETH_HLEN;
|
|
||||||
|
|
||||||
for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++, offset++) {
|
for (i = 0; i < MLX4_LOOPBACK_TEST_PAYLOAD; i++) {
|
||||||
if (*(skb->data + offset) != (unsigned char) (i & 0xff))
|
if (data[i] != (unsigned char)i)
|
||||||
goto out_loopback;
|
return;
|
||||||
}
|
}
|
||||||
/* Loopback found */
|
/* Loopback found */
|
||||||
priv->loopback_ok = 1;
|
priv->loopback_ok = 1;
|
||||||
|
|
||||||
out_loopback:
|
|
||||||
dev_kfree_skb_any(skb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mlx4_en_refill_rx_buffers(struct mlx4_en_priv *priv,
|
static bool mlx4_en_refill_rx_buffers(struct mlx4_en_priv *priv,
|
||||||
|
@ -785,6 +782,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unlikely(priv->validate_loopback)) {
|
||||||
|
validate_loopback(priv, va);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Packet is OK - process it.
|
* Packet is OK - process it.
|
||||||
*/
|
*/
|
||||||
|
@ -948,11 +950,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(priv->validate_loopback)) {
|
|
||||||
validate_loopback(priv, skb);
|
|
||||||
goto next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ip_summed == CHECKSUM_COMPLETE) {
|
if (ip_summed == CHECKSUM_COMPLETE) {
|
||||||
if (check_csum(cqe, skb, va, dev->features)) {
|
if (check_csum(cqe, skb, va, dev->features)) {
|
||||||
ip_summed = CHECKSUM_NONE;
|
ip_summed = CHECKSUM_NONE;
|
||||||
|
|
|
@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
|
||||||
{
|
{
|
||||||
u32 loopback_ok = 0;
|
u32 loopback_ok = 0;
|
||||||
int i;
|
int i;
|
||||||
bool gro_enabled;
|
|
||||||
|
|
||||||
priv->loopback_ok = 0;
|
priv->loopback_ok = 0;
|
||||||
priv->validate_loopback = 1;
|
priv->validate_loopback = 1;
|
||||||
gro_enabled = priv->dev->features & NETIF_F_GRO;
|
|
||||||
|
|
||||||
mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
|
mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
|
||||||
priv->dev->features &= ~NETIF_F_GRO;
|
|
||||||
|
|
||||||
/* xmit */
|
/* xmit */
|
||||||
if (mlx4_en_test_loopback_xmit(priv)) {
|
if (mlx4_en_test_loopback_xmit(priv)) {
|
||||||
|
@ -111,9 +108,6 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
|
||||||
|
|
||||||
priv->validate_loopback = 0;
|
priv->validate_loopback = 0;
|
||||||
|
|
||||||
if (gro_enabled)
|
|
||||||
priv->dev->features |= NETIF_F_GRO;
|
|
||||||
|
|
||||||
mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
|
mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
|
||||||
return !loopback_ok;
|
return !loopback_ok;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue