net/mlx5e: Fix select queue to consider SKBTX_HW_TSTAMP
Steering packets to PTP-SQ should be done only if the SKB has
SKBTX_HW_TSTAMP set in the tx_flags. While here, take the function into
a header and inline it.
Set the whole condition to select the PTP-SQ to unlikely.
Fixes: 24c22dd091 ("net/mlx5e: Add states to PTP channel")
Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Maxim Mikityanskiy <maximmi@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
committed by
Saeed Mahameed
parent
9ae8c18c5e
commit
a6ee6f5f10
@@ -1,7 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||||
// Copyright (c) 2020 Mellanox Technologies
|
// Copyright (c) 2020 Mellanox Technologies
|
||||||
|
|
||||||
#include <linux/ptp_classify.h>
|
|
||||||
#include "en/ptp.h"
|
#include "en/ptp.h"
|
||||||
#include "en/txrx.h"
|
#include "en/txrx.h"
|
||||||
#include "en/params.h"
|
#include "en/params.h"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "en.h"
|
#include "en.h"
|
||||||
#include "en_stats.h"
|
#include "en_stats.h"
|
||||||
|
#include <linux/ptp_classify.h>
|
||||||
|
|
||||||
struct mlx5e_ptpsq {
|
struct mlx5e_ptpsq {
|
||||||
struct mlx5e_txqsq txqsq;
|
struct mlx5e_txqsq txqsq;
|
||||||
@@ -43,6 +44,27 @@ struct mlx5e_ptp {
|
|||||||
DECLARE_BITMAP(state, MLX5E_PTP_STATE_NUM_STATES);
|
DECLARE_BITMAP(state, MLX5E_PTP_STATE_NUM_STATES);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool mlx5e_use_ptpsq(struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct flow_keys fk;
|
||||||
|
|
||||||
|
if (!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!skb_flow_dissect_flow_keys(skb, &fk, 0))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (fk.basic.n_proto == htons(ETH_P_1588))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (fk.basic.n_proto != htons(ETH_P_IP) &&
|
||||||
|
fk.basic.n_proto != htons(ETH_P_IPV6))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return (fk.basic.ip_proto == IPPROTO_UDP &&
|
||||||
|
fk.ports.dst == htons(PTP_EV_PORT));
|
||||||
|
}
|
||||||
|
|
||||||
int mlx5e_ptp_open(struct mlx5e_priv *priv, struct mlx5e_params *params,
|
int mlx5e_ptp_open(struct mlx5e_priv *priv, struct mlx5e_params *params,
|
||||||
u8 lag_port, struct mlx5e_ptp **cp);
|
u8 lag_port, struct mlx5e_ptp **cp);
|
||||||
void mlx5e_ptp_close(struct mlx5e_ptp *c);
|
void mlx5e_ptp_close(struct mlx5e_ptp *c);
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
|
|
||||||
#include <linux/tcp.h>
|
#include <linux/tcp.h>
|
||||||
#include <linux/if_vlan.h>
|
#include <linux/if_vlan.h>
|
||||||
#include <linux/ptp_classify.h>
|
|
||||||
#include <net/geneve.h>
|
#include <net/geneve.h>
|
||||||
#include <net/dsfield.h>
|
#include <net/dsfield.h>
|
||||||
#include "en.h"
|
#include "en.h"
|
||||||
@@ -67,24 +66,6 @@ static inline int mlx5e_get_dscp_up(struct mlx5e_priv *priv, struct sk_buff *skb
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool mlx5e_use_ptpsq(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct flow_keys fk;
|
|
||||||
|
|
||||||
if (!skb_flow_dissect_flow_keys(skb, &fk, 0))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (fk.basic.n_proto == htons(ETH_P_1588))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (fk.basic.n_proto != htons(ETH_P_IP) &&
|
|
||||||
fk.basic.n_proto != htons(ETH_P_IPV6))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return (fk.basic.ip_proto == IPPROTO_UDP &&
|
|
||||||
fk.ports.dst == htons(PTP_EV_PORT));
|
|
||||||
}
|
|
||||||
|
|
||||||
static u16 mlx5e_select_ptpsq(struct net_device *dev, struct sk_buff *skb)
|
static u16 mlx5e_select_ptpsq(struct net_device *dev, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||||
@@ -145,9 +126,9 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ptp_channel = READ_ONCE(priv->channels.ptp);
|
ptp_channel = READ_ONCE(priv->channels.ptp);
|
||||||
if (unlikely(ptp_channel) &&
|
if (unlikely(ptp_channel &&
|
||||||
test_bit(MLX5E_PTP_STATE_TX, ptp_channel->state) &&
|
test_bit(MLX5E_PTP_STATE_TX, ptp_channel->state) &&
|
||||||
mlx5e_use_ptpsq(skb))
|
mlx5e_use_ptpsq(skb)))
|
||||||
return mlx5e_select_ptpsq(dev, skb);
|
return mlx5e_select_ptpsq(dev, skb);
|
||||||
|
|
||||||
txq_ix = netdev_pick_tx(dev, skb, NULL);
|
txq_ix = netdev_pick_tx(dev, skb, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user