mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
iflib: remove convoluted custom zeroing code
Replace a collection of aliasing violations and ifdefs with memset
(which now expands to __builtin_memset and should be quite reliably
inlined.) The old code is hard to maintain as evidenced by the most
recent change to if_pkt_info_t updating the defines, but not the zeroing
code.
Reviewed by: gallatin, erj
Effort: CHERI upstreaming
Sponsored by: Innovate UK
Fixes: 43d7ee540e ("iflib: support for transmit side nic KTLS offload")
Differential Revision: https://reviews.freebsd.org/D54605
This commit is contained in:
parent
1b425afa8d
commit
31e7dc6b9a
1 changed files with 5 additions and 60 deletions
|
|
@ -504,61 +504,6 @@ typedef struct if_rxsd {
|
|||
iflib_fl_t ifsd_fl;
|
||||
} *if_rxsd_t;
|
||||
|
||||
/* multiple of word size */
|
||||
#ifdef __LP64__
|
||||
#define PKT_INFO_SIZE 7
|
||||
#define RXD_INFO_SIZE 5
|
||||
#define PKT_TYPE uint64_t
|
||||
#else
|
||||
#define PKT_INFO_SIZE 12
|
||||
#define RXD_INFO_SIZE 8
|
||||
#define PKT_TYPE uint32_t
|
||||
#endif
|
||||
#define PKT_LOOP_BOUND ((PKT_INFO_SIZE / 3) * 3)
|
||||
#define RXD_LOOP_BOUND ((RXD_INFO_SIZE / 4) * 4)
|
||||
|
||||
typedef struct if_pkt_info_pad {
|
||||
PKT_TYPE pkt_val[PKT_INFO_SIZE];
|
||||
} *if_pkt_info_pad_t;
|
||||
typedef struct if_rxd_info_pad {
|
||||
PKT_TYPE rxd_val[RXD_INFO_SIZE];
|
||||
} *if_rxd_info_pad_t;
|
||||
|
||||
CTASSERT(sizeof(struct if_pkt_info_pad) == sizeof(struct if_pkt_info));
|
||||
CTASSERT(sizeof(struct if_rxd_info_pad) == sizeof(struct if_rxd_info));
|
||||
|
||||
static inline void
|
||||
pkt_info_zero(if_pkt_info_t pi)
|
||||
{
|
||||
if_pkt_info_pad_t pi_pad;
|
||||
|
||||
pi_pad = (if_pkt_info_pad_t)pi;
|
||||
pi_pad->pkt_val[0] = 0; pi_pad->pkt_val[1] = 0; pi_pad->pkt_val[2] = 0;
|
||||
pi_pad->pkt_val[3] = 0; pi_pad->pkt_val[4] = 0; pi_pad->pkt_val[5] = 0;
|
||||
#ifndef __LP64__
|
||||
pi_pad->pkt_val[6] = 0; pi_pad->pkt_val[7] = 0; pi_pad->pkt_val[8] = 0;
|
||||
pi_pad->pkt_val[9] = 0; pi_pad->pkt_val[10] = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
rxd_info_zero(if_rxd_info_t ri)
|
||||
{
|
||||
if_rxd_info_pad_t ri_pad;
|
||||
int i;
|
||||
|
||||
ri_pad = (if_rxd_info_pad_t)ri;
|
||||
for (i = 0; i < RXD_LOOP_BOUND; i += 4) {
|
||||
ri_pad->rxd_val[i] = 0;
|
||||
ri_pad->rxd_val[i + 1] = 0;
|
||||
ri_pad->rxd_val[i + 2] = 0;
|
||||
ri_pad->rxd_val[i + 3] = 0;
|
||||
}
|
||||
#ifdef __LP64__
|
||||
ri_pad->rxd_val[RXD_INFO_SIZE - 1] = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Only allow a single packet to take up most 1/nth of the tx ring
|
||||
*/
|
||||
|
|
@ -1068,7 +1013,7 @@ iflib_netmap_txsync(struct netmap_kring *kring, int flags)
|
|||
if (nm_i != head) { /* we have new packets to send */
|
||||
uint32_t pkt_len = 0, seg_idx = 0;
|
||||
int nic_i_start = -1, flags = 0;
|
||||
pkt_info_zero(&pi);
|
||||
memset(&pi, 0, sizeof(pi));
|
||||
pi.ipi_segs = txq->ift_segs;
|
||||
pi.ipi_qsidx = kring->ring_id;
|
||||
nic_i = netmap_idx_k2n(kring, nm_i);
|
||||
|
|
@ -1261,7 +1206,7 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
|||
nm_i = netmap_idx_n2k(kring, nic_i);
|
||||
MPASS(nm_i == kring->nr_hwtail);
|
||||
for (n = 0; avail > 0 && nm_i != hwtail_lim; n++, avail--) {
|
||||
rxd_info_zero(&ri);
|
||||
memset(&ri, 0, sizeof(ri));
|
||||
ri.iri_frags = rxq->ifr_frags;
|
||||
ri.iri_qsidx = kring->ring_id;
|
||||
ri.iri_ifp = ctx->ifc_ifp;
|
||||
|
|
@ -2998,7 +2943,7 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget)
|
|||
/*
|
||||
* Reset client set fields to their default values
|
||||
*/
|
||||
rxd_info_zero(&ri);
|
||||
memset(&ri, 0, sizeof(ri));
|
||||
ri.iri_qsidx = rxq->ifr_id;
|
||||
ri.iri_cidx = *cidxp;
|
||||
ri.iri_ifp = ifp;
|
||||
|
|
@ -3580,7 +3525,7 @@ iflib_encap(iflib_txq_t txq, struct mbuf **m_headp)
|
|||
}
|
||||
m_head = *m_headp;
|
||||
|
||||
pkt_info_zero(&pi);
|
||||
memset(&pi, 0, sizeof(pi));
|
||||
pi.ipi_mflags = (m_head->m_flags & (M_VLANTAG | M_BCAST | M_MCAST));
|
||||
pi.ipi_pidx = pidx;
|
||||
pi.ipi_qsidx = txq->ift_id;
|
||||
|
|
@ -4256,7 +4201,7 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
|
|||
if (ctx->isc_txq_select_v2) {
|
||||
struct if_pkt_info pi;
|
||||
uint64_t early_pullups = 0;
|
||||
pkt_info_zero(&pi);
|
||||
memset(&pi, 0, sizeof(pi));
|
||||
|
||||
err = iflib_parse_header_partial(&pi, &m, &early_pullups);
|
||||
if (__predict_false(err != 0)) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue