Message ID | 20110225174425.GA11203@akhaparde-VBox |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
Le vendredi 25 février 2011 à 11:44 -0600, Ajit Khaparde a écrit : > > -----Original Message----- > > From: Eric Dumazet <eric.dumazet@gmail.com> > > Sent: Thursday, February 24, 2011 2:25 PM > > To: Khaparde, Ajit > > Cc: netdev@vger.kernel.org > > Subject: [RFC] be2net: add rxhash support > > > > Ajit, it seems be2net provides RSS hash value in rx compl descriptor ? > > > > Could we feed skb->rxhash with it ? > > > > Thanks ! > Thanks Eric. Sure. > This is a long pending change which fell through the cracks. > But then because hashing is enabled in the device only when > Number of Rx Queues is > 1, I would suggest the following patch. > > Unaware of exact conventions, I have added signed-off-by to the patch already. > > Thanks > > ----- > [PATCH net-next] be2net: add rxhash support > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> > Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com> > --- > drivers/net/benet/be_main.c | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c > index 26f9c56..8c4b782 100644 > --- a/drivers/net/benet/be_main.c > +++ b/drivers/net/benet/be_main.c > @@ -1038,6 +1038,10 @@ static void be_rx_compl_process(struct be_adapter *adapter, > > skb->truesize = skb->len + sizeof(struct sk_buff); > skb->protocol = eth_type_trans(skb, adapter->netdev); > + if (adapter->netdev->features & NETIF_F_RXHASH) > + skb->rxhash = AMAP_GET_BITS(struct amap_eth_rx_compl, > + rsshash, rxcp); > + > > vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); > vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp); > @@ -1099,6 +1103,10 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter, > return; > } > > + if (adapter->netdev->features & NETIF_F_RXHASH) > + skb->rxhash = AMAP_GET_BITS(struct amap_eth_rx_compl, > + rsshash, rxcp); > + > remaining = pkt_size; > for (i = 0, j = -1; i < num_rcvd; i++) { > page_info = get_rx_page_info(adapter, rxo, rxq_idx); > @@ -2619,6 +2627,9 @@ static void be_netdev_init(struct net_device *netdev) > NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | > NETIF_F_GRO | NETIF_F_TSO6; > > + if (be_multi_rxq(adapter)) > + netdev->features |= NETIF_F_RXHASH; > + > netdev->vlan_features |= NETIF_F_SG | NETIF_F_TSO | > NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; > I added some traces, and I am not sure its OK : With one active tcp flow, I got different rxhash values : [ 1064.674253] rxhash=bbd37952 rsshp=1 bank=1 [ 1064.738104] rxhash=37acd31d rsshp=1 bank=1 [ 1064.741684] rxhash=bbd37952 rsshp=1 bank=1 [ 1064.874283] rxhash=bbd37952 rsshp=1 bank=1 [ 1064.940201] rxhash=bbd37952 rsshp=1 bank=1 [ 1064.955278] rxhash=b668ace2 rsshp=1 bank=1 [ 1065.080028] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.153360] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.293164] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.401862] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.460506] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.519980] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.650160] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.717585] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.730909] rxhash=37acd31d rsshp=1 bank=1 [ 1065.840350] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.900704] rxhash=bbd37952 rsshp=1 bank=1 [ 1065.931526] rxhash=b668ace2 rsshp=1 bank=1 [ 1066.503657] rxhash=bbd37952 rsshp=1 bank=1 [ 1066.570138] rxhash=bbd37952 rsshp=1 bank=1 How is it possible ? (I have a VLAN config on top of a bonding) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 26f9c56..8c4b782 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c @@ -1038,6 +1038,10 @@ static void be_rx_compl_process(struct be_adapter *adapter, skb->truesize = skb->len + sizeof(struct sk_buff); skb->protocol = eth_type_trans(skb, adapter->netdev); + if (adapter->netdev->features & NETIF_F_RXHASH) + skb->rxhash = AMAP_GET_BITS(struct amap_eth_rx_compl, + rsshash, rxcp); + vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp); @@ -1099,6 +1103,10 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter, return; } + if (adapter->netdev->features & NETIF_F_RXHASH) + skb->rxhash = AMAP_GET_BITS(struct amap_eth_rx_compl, + rsshash, rxcp); + remaining = pkt_size; for (i = 0, j = -1; i < num_rcvd; i++) { page_info = get_rx_page_info(adapter, rxo, rxq_idx); @@ -2619,6 +2627,9 @@ static void be_netdev_init(struct net_device *netdev) NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO | NETIF_F_TSO6; + if (be_multi_rxq(adapter)) + netdev->features |= NETIF_F_RXHASH; + netdev->vlan_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;