ice: Support HW timestamp hint
Use previously refactored code and create a function that allows XDP code to read HW timestamp. Also, introduce packet context, where hints-related data will be stored. ice_xdp_buff contains only a pointer to this structure, to avoid copying it in ZC mode later in the series. HW timestamp is the first supported hint in the driver, so also add xdp_metadata_ops. Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com> Link: https://lore.kernel.org/r/20231205210847.28460-6-larysa.zaremba@intel.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
d951c14ad2
commit
9031d5f491
@ -996,4 +996,6 @@ static inline void ice_clear_rdma_cap(struct ice_pf *pf)
|
||||
set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags);
|
||||
clear_bit(ICE_FLAG_RDMA_ENA, pf->flags);
|
||||
}
|
||||
|
||||
extern const struct xdp_metadata_ops ice_xdp_md_ops;
|
||||
#endif /* _ICE_H_ */
|
||||
|
@ -575,6 +575,7 @@ int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
|
||||
|
||||
xdp_init_buff(&ring->xdp, ice_rx_pg_size(ring) / 2, &ring->xdp_rxq);
|
||||
ring->xdp.data = NULL;
|
||||
ring->xdp_ext.pkt_ctx = &ring->pkt_ctx;
|
||||
err = ice_setup_rx_ctx(ring);
|
||||
if (err) {
|
||||
dev_err(dev, "ice_setup_rx_ctx failed for RxQ %d, err %d\n",
|
||||
|
@ -3397,6 +3397,7 @@ static void ice_set_ops(struct ice_vsi *vsi)
|
||||
|
||||
netdev->netdev_ops = &ice_netdev_ops;
|
||||
netdev->udp_tunnel_nic_info = &pf->hw.udp_tunnel_nic;
|
||||
netdev->xdp_metadata_ops = &ice_xdp_md_ops;
|
||||
ice_set_ethtool_ops(netdev);
|
||||
|
||||
if (vsi->type != ICE_VSI_PF)
|
||||
|
@ -2129,12 +2129,12 @@ int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr)
|
||||
/**
|
||||
* ice_ptp_get_rx_hwts - Get packet Rx timestamp in ns
|
||||
* @rx_desc: Receive descriptor
|
||||
* @rx_ring: Ring to get the cached time
|
||||
* @pkt_ctx: Packet context to get the cached time
|
||||
*
|
||||
* The driver receives a notification in the receive descriptor with timestamp.
|
||||
*/
|
||||
u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
|
||||
struct ice_rx_ring *rx_ring)
|
||||
const struct ice_pkt_ctx *pkt_ctx)
|
||||
{
|
||||
u64 ts_ns, cached_time;
|
||||
u32 ts_high;
|
||||
@ -2142,7 +2142,7 @@ u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
|
||||
if (!(rx_desc->wb.time_stamp_low & ICE_PTP_TS_VALID))
|
||||
return 0;
|
||||
|
||||
cached_time = READ_ONCE(rx_ring->cached_phctime);
|
||||
cached_time = READ_ONCE(pkt_ctx->cached_phctime);
|
||||
|
||||
/* Do not report a timestamp if we don't have a cached PHC time */
|
||||
if (!cached_time)
|
||||
|
@ -299,7 +299,7 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb);
|
||||
enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);
|
||||
|
||||
u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
|
||||
struct ice_rx_ring *rx_ring);
|
||||
const struct ice_pkt_ctx *pkt_ctx);
|
||||
void ice_ptp_reset(struct ice_pf *pf);
|
||||
void ice_ptp_prepare_for_reset(struct ice_pf *pf);
|
||||
void ice_ptp_init(struct ice_pf *pf);
|
||||
@ -331,7 +331,7 @@ static inline bool ice_ptp_process_ts(struct ice_pf *pf)
|
||||
|
||||
static inline u64
|
||||
ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
|
||||
struct ice_rx_ring *rx_ring)
|
||||
const struct ice_pkt_ctx *pkt_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -257,9 +257,14 @@ enum ice_rx_dtype {
|
||||
ICE_RX_DTYPE_SPLIT_ALWAYS = 2,
|
||||
};
|
||||
|
||||
struct ice_pkt_ctx {
|
||||
u64 cached_phctime;
|
||||
};
|
||||
|
||||
struct ice_xdp_buff {
|
||||
struct xdp_buff xdp_buff;
|
||||
const union ice_32b_rx_flex_desc *eop_desc;
|
||||
const struct ice_pkt_ctx *pkt_ctx;
|
||||
};
|
||||
|
||||
/* Required for compatibility with xdp_buffs from xsk_pool */
|
||||
@ -328,6 +333,10 @@ struct ice_rx_ring {
|
||||
struct xdp_buff xdp;
|
||||
};
|
||||
/* CL3 - 3rd cacheline starts here */
|
||||
union {
|
||||
struct ice_pkt_ctx pkt_ctx;
|
||||
u64 cached_phctime;
|
||||
};
|
||||
struct bpf_prog *xdp_prog;
|
||||
u16 rx_offset;
|
||||
|
||||
@ -346,7 +355,6 @@ struct ice_rx_ring {
|
||||
struct ice_rx_ring *next; /* pointer to next ring in q_vector */
|
||||
struct xsk_buff_pool *xsk_pool;
|
||||
dma_addr_t dma; /* physical address of ring */
|
||||
u64 cached_phctime;
|
||||
u16 rx_buf_len;
|
||||
u8 dcb_tc; /* Traffic class of ring */
|
||||
u8 ptp_rx;
|
||||
|
@ -197,7 +197,7 @@ ice_ptp_rx_hwts_to_skb(struct ice_rx_ring *rx_ring,
|
||||
const union ice_32b_rx_flex_desc *rx_desc,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
u64 ts_ns = ice_ptp_get_rx_hwts(rx_desc, rx_ring);
|
||||
u64 ts_ns = ice_ptp_get_rx_hwts(rx_desc, &rx_ring->pkt_ctx);
|
||||
|
||||
skb_hwtstamps(skb)->hwtstamp = ns_to_ktime(ts_ns);
|
||||
}
|
||||
@ -507,3 +507,26 @@ void ice_finalize_xdp_rx(struct ice_tx_ring *xdp_ring, unsigned int xdp_res,
|
||||
spin_unlock(&xdp_ring->tx_lock);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_xdp_rx_hw_ts - HW timestamp XDP hint handler
|
||||
* @ctx: XDP buff pointer
|
||||
* @ts_ns: destination address
|
||||
*
|
||||
* Copy HW timestamp (if available) to the destination address.
|
||||
*/
|
||||
static int ice_xdp_rx_hw_ts(const struct xdp_md *ctx, u64 *ts_ns)
|
||||
{
|
||||
const struct ice_xdp_buff *xdp_ext = (void *)ctx;
|
||||
|
||||
*ts_ns = ice_ptp_get_rx_hwts(xdp_ext->eop_desc,
|
||||
xdp_ext->pkt_ctx);
|
||||
if (!*ts_ns)
|
||||
return -ENODATA;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct xdp_metadata_ops ice_xdp_md_ops = {
|
||||
.xmo_rx_timestamp = ice_xdp_rx_hw_ts,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user