@@ -2214,14 +2214,22 @@ static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i)
22142214static void hns3_nic_reclaim_one_desc (struct hns3_enet_ring * ring , int * bytes ,
22152215 int * pkts )
22162216{
2217- struct hns3_desc_cb * desc_cb = & ring -> desc_cb [ring -> next_to_clean ];
2217+ int ntc = ring -> next_to_clean ;
2218+ struct hns3_desc_cb * desc_cb ;
22182219
2220+ desc_cb = & ring -> desc_cb [ntc ];
22192221 (* pkts ) += (desc_cb -> type == DESC_TYPE_SKB );
22202222 (* bytes ) += desc_cb -> length ;
22212223 /* desc_cb will be cleaned, after hnae3_free_buffer_detach*/
2222- hns3_free_buffer_detach (ring , ring -> next_to_clean );
2224+ hns3_free_buffer_detach (ring , ntc );
22232225
2224- ring_ptr_move_fw (ring , next_to_clean );
2226+ if (++ ntc == ring -> desc_num )
2227+ ntc = 0 ;
2228+
2229+ /* This smp_store_release() pairs with smp_load_acquire() in
2230+ * ring_space called by hns3_nic_net_xmit.
2231+ */
2232+ smp_store_release (& ring -> next_to_clean , ntc );
22252233}
22262234
22272235static int is_valid_clean_head (struct hns3_enet_ring * ring , int h )
@@ -2689,36 +2697,37 @@ static int hns3_set_gro_and_checksum(struct hns3_enet_ring *ring,
26892697}
26902698
26912699static void hns3_set_rx_skb_rss_type (struct hns3_enet_ring * ring ,
2692- struct sk_buff * skb )
2700+ struct sk_buff * skb , u32 rss_hash )
26932701{
26942702 struct hnae3_handle * handle = ring -> tqp -> handle ;
26952703 enum pkt_hash_types rss_type ;
2696- struct hns3_desc * desc ;
2697- int last_bd ;
26982704
2699- /* When driver handle the rss type, ring->next_to_clean indicates the
2700- * first descriptor of next packet, need -1 here.
2701- */
2702- last_bd = (ring -> next_to_clean - 1 + ring -> desc_num ) % ring -> desc_num ;
2703- desc = & ring -> desc [last_bd ];
2704-
2705- if (le32_to_cpu (desc -> rx .rss_hash ))
2705+ if (rss_hash )
27062706 rss_type = handle -> kinfo .rss_type ;
27072707 else
27082708 rss_type = PKT_HASH_TYPE_NONE ;
27092709
2710- skb_set_hash (skb , le32_to_cpu ( desc -> rx . rss_hash ) , rss_type );
2710+ skb_set_hash (skb , rss_hash , rss_type );
27112711}
27122712
2713- static int hns3_handle_bdinfo (struct hns3_enet_ring * ring , struct sk_buff * skb ,
2714- struct hns3_desc * desc )
2713+ static int hns3_handle_bdinfo (struct hns3_enet_ring * ring , struct sk_buff * skb )
27152714{
27162715 struct net_device * netdev = ring -> tqp -> handle -> kinfo .netdev ;
2717- u32 bd_base_info = le32_to_cpu (desc -> rx .bd_base_info );
2718- u32 l234info = le32_to_cpu (desc -> rx .l234_info );
27192716 enum hns3_pkt_l2t_type l2_frame_type ;
2717+ u32 bd_base_info , l234info ;
2718+ struct hns3_desc * desc ;
27202719 unsigned int len ;
2721- int ret ;
2720+ int pre_ntc , ret ;
2721+
2722+ /* bdinfo handled below is only valid on the last BD of the
2723+ * current packet, and ring->next_to_clean indicates the first
2724+ * descriptor of next packet, so need - 1 below.
2725+ */
2726+ pre_ntc = ring -> next_to_clean ? (ring -> next_to_clean - 1 ) :
2727+ (ring -> desc_num - 1 );
2728+ desc = & ring -> desc [pre_ntc ];
2729+ bd_base_info = le32_to_cpu (desc -> rx .bd_base_info );
2730+ l234info = le32_to_cpu (desc -> rx .l234_info );
27222731
27232732 /* Based on hw strategy, the tag offloaded will be stored at
27242733 * ot_vlan_tag in two layer tag case, and stored at vlan_tag
@@ -2779,6 +2788,8 @@ static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb,
27792788 u64_stats_update_end (& ring -> syncp );
27802789
27812790 ring -> tqp_vector -> rx_group .total_bytes += len ;
2791+
2792+ hns3_set_rx_skb_rss_type (ring , skb , le32_to_cpu (desc -> rx .rss_hash ));
27822793 return 0 ;
27832794}
27842795
@@ -2848,14 +2859,13 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
28482859 ALIGN (ring -> pull_len , sizeof (long )));
28492860 }
28502861
2851- ret = hns3_handle_bdinfo (ring , skb , desc );
2862+ ret = hns3_handle_bdinfo (ring , skb );
28522863 if (unlikely (ret )) {
28532864 dev_kfree_skb_any (skb );
28542865 return ret ;
28552866 }
28562867
28572868 * out_skb = skb ;
2858- hns3_set_rx_skb_rss_type (ring , skb );
28592869
28602870 return 0 ;
28612871}
@@ -2866,7 +2876,7 @@ int hns3_clean_rx_ring(
28662876{
28672877#define RCB_NOF_ALLOC_RX_BUFF_ONCE 16
28682878 int recv_pkts , recv_bds , clean_count , err ;
2869- int unused_count = hns3_desc_unused (ring ) - ring -> pending_buf ;
2879+ int unused_count = hns3_desc_unused (ring );
28702880 struct sk_buff * skb = ring -> skb ;
28712881 int num ;
28722882
@@ -2875,6 +2885,7 @@ int hns3_clean_rx_ring(
28752885
28762886 recv_pkts = 0 , recv_bds = 0 , clean_count = 0 ;
28772887 num -= unused_count ;
2888+ unused_count -= ring -> pending_buf ;
28782889
28792890 while (recv_pkts < budget && recv_bds < num ) {
28802891 /* Reuse or realloc buffers */
@@ -3476,6 +3487,7 @@ static int hns3_get_ring_config(struct hns3_nic_priv *priv)
34763487 }
34773488
34783489 devm_kfree (& pdev -> dev , priv -> ring_data );
3490+ priv -> ring_data = NULL ;
34793491 return ret ;
34803492}
34813493
@@ -3484,12 +3496,16 @@ static void hns3_put_ring_config(struct hns3_nic_priv *priv)
34843496 struct hnae3_handle * h = priv -> ae_handle ;
34853497 int i ;
34863498
3499+ if (!priv -> ring_data )
3500+ return ;
3501+
34873502 for (i = 0 ; i < h -> kinfo .num_tqps ; i ++ ) {
34883503 devm_kfree (priv -> dev , priv -> ring_data [i ].ring );
34893504 devm_kfree (priv -> dev ,
34903505 priv -> ring_data [i + h -> kinfo .num_tqps ].ring );
34913506 }
34923507 devm_kfree (priv -> dev , priv -> ring_data );
3508+ priv -> ring_data = NULL ;
34933509}
34943510
34953511static int hns3_alloc_ring_memory (struct hns3_enet_ring * ring )
@@ -3909,8 +3925,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
39093925
39103926 hns3_dbg_uninit (handle );
39113927
3912- priv -> ring_data = NULL ;
3913-
39143928out_netdev_free :
39153929 free_netdev (netdev );
39163930}
@@ -4257,12 +4271,10 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
42574271 hns3_uninit_all_ring (priv );
42584272err_uninit_vector :
42594273 hns3_nic_uninit_vector_data (priv );
4260- priv -> ring_data = NULL ;
42614274err_dealloc_vector :
42624275 hns3_nic_dealloc_vector_data (priv );
42634276err_put_ring :
42644277 hns3_put_ring_config (priv );
4265- priv -> ring_data = NULL ;
42664278
42674279 return ret ;
42684280}
@@ -4324,7 +4336,6 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
43244336 netdev_err (netdev , "uninit ring error\n" );
43254337
43264338 hns3_put_ring_config (priv );
4327- priv -> ring_data = NULL ;
43284339
43294340 return ret ;
43304341}
0 commit comments