On Thu, Aug 24, 2023 at 09:26:40PM +0200, Larysa Zaremba wrote: > 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 | 37 +++++++++++++------ > 1 file changed, 26 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..8f7f6d78f7bf 100644 > --- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > +++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c > @@ -63,28 +63,43 @@ static enum pkt_hash_types ice_ptype_to_htype(u16 ptype) > } > > /** > - * ice_rx_hash - set the hash value in the skb > + * ice_get_rx_hash - get RX hash value from descriptor > + * @rx_desc: specific descriptor > + * > + * Returns hash, if present, 0 otherwise. > + */ > +static u32 > +ice_get_rx_hash(const union ice_32b_rx_flex_desc *rx_desc) > +{ > + const struct ice_32b_rx_flex_desc_nic *nic_mdid; > + > + if (rx_desc->wb.rxdid != ICE_RXDID_FLEX_NIC) > + return 0; > + > + nic_mdid = (struct ice_32b_rx_flex_desc_nic *)rx_desc; > + return le32_to_cpu(nic_mdid->rss_hash); > +} > + > +/** > + * 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(const struct ice_rx_ring *rx_ring, nit: maybe ice_rx_skb_hash, but i have not seen xdp side yet. other idea would be to turn ice_get_rx_hash to __ice_rx_hash and keep the ice_rx_hash name as-is. Usual way of naming internal funcs. Take it or leave it:) > + const 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)); > + hash = ice_get_rx_hash(rx_desc); > + if (likely(hash)) > + skb_set_hash(skb, hash, ice_ptype_to_htype(rx_ptype)); Looks like a behavior change as you wouldn't be setting l4_hash and sw_hash from skb in case !hash ? When can we get hash == 0 ? > } > > /** > @@ -186,7 +201,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); > -- > 2.41.0 >