From: Larysa Zaremba <larysa.zaremba@xxxxxxxxx> Date: Fri, 12 May 2023 17:25:53 +0200 > Previously, we only needed RX hash in skb path, > hence all related code was written with skb in mind. > But with the addition of XDP hints via kfuncs to the ice driver, > the same logic will be needed in .xmo_() callbacks. > > Separate generic process of reading RX hash from a descriptor > into a separate function. > > Signed-off-by: Larysa Zaremba <larysa.zaremba@xxxxxxxxx> > --- > drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 38 +++++++++++++------ > 1 file changed, 27 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > index c8322fb6f2b3..fc67bbf600af 100644 > --- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > @@ -63,28 +63,44 @@ static enum pkt_hash_types ice_ptype_to_htype(u16 ptype) > } > > /** > - * ice_rx_hash - set the hash value in the skb > + * ice_copy_rx_hash_from_desc - copy hash value from descriptor to address > + * @rx_desc: specific descriptor > + * @dst: address to copy hash value to > + * > + * Returns true, if valid hash has been copied into the destination address. > + */ > +static bool > +ice_copy_rx_hash_from_desc(union ice_32b_rx_flex_desc *rx_desc, u32 *dst) @rx_desc can be const. I'm also unsure about the naming. Why not name this one ice_rx_hash() and the one which sets it in skb ice_rx_hash_skb()? > +{ > + struct ice_32b_rx_flex_desc_nic *nic_mdid; Also const. I thought you'll pick most of my optimizations from the related commit :D > + > + if (rx_desc->wb.rxdid != ICE_RXDID_FLEX_NIC) > + return false; > + > + nic_mdid = (struct ice_32b_rx_flex_desc_nic *)rx_desc; > + *dst = le32_to_cpu(nic_mdid->rss_hash); > + return true; You can just return the hash. `hash == 0` means there's no hash, so it basically means `false`, while non-zero is `true`. > +} > + > +/** > + * ice_rx_hash_to_skb - set the hash value in the skb > * @rx_ring: descriptor ring > * @rx_desc: specific descriptor > * @skb: pointer to current skb > * @rx_ptype: the ptype value from the descriptor > */ > static void > -ice_rx_hash(struct ice_rx_ring *rx_ring, union ice_32b_rx_flex_desc *rx_desc, > - struct sk_buff *skb, u16 rx_ptype) > +ice_rx_hash_to_skb(struct ice_rx_ring *rx_ring, > + union ice_32b_rx_flex_desc *rx_desc, > + struct sk_buff *skb, u16 rx_ptype) > { > - struct ice_32b_rx_flex_desc_nic *nic_mdid; > u32 hash; > > if (!(rx_ring->netdev->features & NETIF_F_RXHASH)) > return; > > - if (rx_desc->wb.rxdid != ICE_RXDID_FLEX_NIC) > - return; > - > - nic_mdid = (struct ice_32b_rx_flex_desc_nic *)rx_desc; > - hash = le32_to_cpu(nic_mdid->rss_hash); > - skb_set_hash(skb, hash, ice_ptype_to_htype(rx_ptype)); > + if (ice_copy_rx_hash_from_desc(rx_desc, &hash)) likely()? I wouldn't care about zero-hashed frames, their perf is not critical anyway. > + skb_set_hash(skb, hash, ice_ptype_to_htype(rx_ptype)); > } > > /** > @@ -186,7 +202,7 @@ ice_process_skb_fields(struct ice_rx_ring *rx_ring, > union ice_32b_rx_flex_desc *rx_desc, > struct sk_buff *skb, u16 ptype) > { > - ice_rx_hash(rx_ring, rx_desc, skb, ptype); > + ice_rx_hash_to_skb(rx_ring, rx_desc, skb, ptype); > > /* modifies the skb - consumes the enet header */ > skb->protocol = eth_type_trans(skb, rx_ring->netdev); Thanks, Olek