@@ -660,7 +660,8 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
660
660
661
661
/* Add one frag and update the appropriate fields in the skb */
662
662
skb_fill_page_desc (skb , tpa_info -> frag_id ++ ,
663
- current_bd -> data , current_bd -> page_offset ,
663
+ current_bd -> data ,
664
+ current_bd -> page_offset + rxq -> rx_headroom ,
664
665
len_on_bd );
665
666
666
667
if (unlikely (qede_realloc_rx_buffer (rxq , current_bd ))) {
@@ -671,8 +672,7 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
671
672
goto out ;
672
673
}
673
674
674
- qed_chain_consume (& rxq -> rx_bd_ring );
675
- rxq -> sw_rx_cons ++ ;
675
+ qede_rx_bd_ring_consume (rxq );
676
676
677
677
skb -> data_len += len_on_bd ;
678
678
skb -> truesize += rxq -> rx_buf_seg_size ;
@@ -721,64 +721,129 @@ static u8 qede_check_tunn_csum(u16 flag)
721
721
return QEDE_CSUM_UNNECESSARY | tcsum ;
722
722
}
723
723
724
+ static inline struct sk_buff *
725
+ qede_build_skb (struct qede_rx_queue * rxq ,
726
+ struct sw_rx_data * bd , u16 len , u16 pad )
727
+ {
728
+ struct sk_buff * skb ;
729
+ void * buf ;
730
+
731
+ buf = page_address (bd -> data ) + bd -> page_offset ;
732
+ skb = build_skb (buf , rxq -> rx_buf_seg_size );
733
+
734
+ skb_reserve (skb , pad );
735
+ skb_put (skb , len );
736
+
737
+ return skb ;
738
+ }
739
+
740
+ static struct sk_buff *
741
+ qede_tpa_rx_build_skb (struct qede_dev * edev ,
742
+ struct qede_rx_queue * rxq ,
743
+ struct sw_rx_data * bd , u16 len , u16 pad ,
744
+ bool alloc_skb )
745
+ {
746
+ struct sk_buff * skb ;
747
+
748
+ skb = qede_build_skb (rxq , bd , len , pad );
749
+ bd -> page_offset += rxq -> rx_buf_seg_size ;
750
+
751
+ if (bd -> page_offset == PAGE_SIZE ) {
752
+ if (unlikely (qede_alloc_rx_buffer (rxq , true))) {
753
+ DP_NOTICE (edev ,
754
+ "Failed to allocate RX buffer for tpa start\n" );
755
+ bd -> page_offset -= rxq -> rx_buf_seg_size ;
756
+ page_ref_inc (bd -> data );
757
+ dev_kfree_skb_any (skb );
758
+ return NULL ;
759
+ }
760
+ } else {
761
+ page_ref_inc (bd -> data );
762
+ qede_reuse_page (rxq , bd );
763
+ }
764
+
765
+ /* We've consumed the first BD and prepared an SKB */
766
+ qede_rx_bd_ring_consume (rxq );
767
+
768
+ return skb ;
769
+ }
770
+
771
+ static struct sk_buff *
772
+ qede_rx_build_skb (struct qede_dev * edev ,
773
+ struct qede_rx_queue * rxq ,
774
+ struct sw_rx_data * bd , u16 len , u16 pad )
775
+ {
776
+ struct sk_buff * skb = NULL ;
777
+
778
+ /* For smaller frames still need to allocate skb, memcpy
779
+ * data and benefit in reusing the page segment instead of
780
+ * un-mapping it.
781
+ */
782
+ if ((len + pad <= edev -> rx_copybreak )) {
783
+ unsigned int offset = bd -> page_offset + pad ;
784
+
785
+ skb = netdev_alloc_skb (edev -> ndev , QEDE_RX_HDR_SIZE );
786
+ if (unlikely (!skb ))
787
+ return NULL ;
788
+
789
+ skb_reserve (skb , pad );
790
+ memcpy (skb_put (skb , len ),
791
+ page_address (bd -> data ) + offset , len );
792
+ qede_reuse_page (rxq , bd );
793
+ goto out ;
794
+ }
795
+
796
+ skb = qede_build_skb (rxq , bd , len , pad );
797
+
798
+ if (unlikely (qede_realloc_rx_buffer (rxq , bd ))) {
799
+ /* Incr page ref count to reuse on allocation failure so
800
+ * that it doesn't get freed while freeing SKB [as its
801
+ * already mapped there].
802
+ */
803
+ page_ref_inc (bd -> data );
804
+ dev_kfree_skb_any (skb );
805
+ return NULL ;
806
+ }
807
+ out :
808
+ /* We've consumed the first BD and prepared an SKB */
809
+ qede_rx_bd_ring_consume (rxq );
810
+
811
+ return skb ;
812
+ }
813
+
724
814
static void qede_tpa_start (struct qede_dev * edev ,
725
815
struct qede_rx_queue * rxq ,
726
816
struct eth_fast_path_rx_tpa_start_cqe * cqe )
727
817
{
728
818
struct qede_agg_info * tpa_info = & rxq -> tpa_info [cqe -> tpa_agg_index ];
729
- struct eth_rx_bd * rx_bd_cons = qed_chain_consume (& rxq -> rx_bd_ring );
730
- struct eth_rx_bd * rx_bd_prod = qed_chain_produce (& rxq -> rx_bd_ring );
731
- struct sw_rx_data * replace_buf = & tpa_info -> buffer ;
732
- dma_addr_t mapping = tpa_info -> buffer_mapping ;
733
819
struct sw_rx_data * sw_rx_data_cons ;
734
- struct sw_rx_data * sw_rx_data_prod ;
820
+ u16 pad ;
735
821
736
822
sw_rx_data_cons = & rxq -> sw_rx_ring [rxq -> sw_rx_cons & NUM_RX_BDS_MAX ];
737
- sw_rx_data_prod = & rxq -> sw_rx_ring [ rxq -> sw_rx_prod & NUM_RX_BDS_MAX ] ;
823
+ pad = cqe -> placement_offset + rxq -> rx_headroom ;
738
824
739
- /* Use pre-allocated replacement buffer - we can't release the agg.
740
- * start until its over and we don't want to risk allocation failing
741
- * here, so re-allocate when aggregation will be over.
742
- */
743
- sw_rx_data_prod -> mapping = replace_buf -> mapping ;
744
-
745
- sw_rx_data_prod -> data = replace_buf -> data ;
746
- rx_bd_prod -> addr .hi = cpu_to_le32 (upper_32_bits (mapping ));
747
- rx_bd_prod -> addr .lo = cpu_to_le32 (lower_32_bits (mapping ));
748
- sw_rx_data_prod -> page_offset = replace_buf -> page_offset ;
749
-
750
- rxq -> sw_rx_prod ++ ;
825
+ tpa_info -> skb = qede_tpa_rx_build_skb (edev , rxq , sw_rx_data_cons ,
826
+ le16_to_cpu (cqe -> len_on_first_bd ),
827
+ pad , false);
828
+ tpa_info -> buffer .page_offset = sw_rx_data_cons -> page_offset ;
829
+ tpa_info -> buffer .mapping = sw_rx_data_cons -> mapping ;
751
830
752
- /* move partial skb from cons to pool (don't unmap yet)
753
- * save mapping, incase we drop the packet later on.
754
- */
755
- tpa_info -> buffer = * sw_rx_data_cons ;
756
- mapping = HILO_U64 (le32_to_cpu (rx_bd_cons -> addr .hi ),
757
- le32_to_cpu (rx_bd_cons -> addr .lo ));
758
-
759
- tpa_info -> buffer_mapping = mapping ;
760
- rxq -> sw_rx_cons ++ ;
761
-
762
- /* set tpa state to start only if we are able to allocate skb
763
- * for this aggregation, otherwise mark as error and aggregation will
764
- * be dropped
765
- */
766
- tpa_info -> skb = netdev_alloc_skb (edev -> ndev ,
767
- le16_to_cpu (cqe -> len_on_first_bd ));
768
831
if (unlikely (!tpa_info -> skb )) {
769
832
DP_NOTICE (edev , "Failed to allocate SKB for gro\n" );
833
+
834
+ /* Consume from ring but do not produce since
835
+ * this might be used by FW still, it will be re-used
836
+ * at TPA end.
837
+ */
838
+ tpa_info -> tpa_start_fail = true;
839
+ qede_rx_bd_ring_consume (rxq );
770
840
tpa_info -> state = QEDE_AGG_STATE_ERROR ;
771
841
goto cons_buf ;
772
842
}
773
843
774
- /* Start filling in the aggregation info */
775
- skb_put (tpa_info -> skb , le16_to_cpu (cqe -> len_on_first_bd ));
776
844
tpa_info -> frag_id = 0 ;
777
845
tpa_info -> state = QEDE_AGG_STATE_START ;
778
846
779
- /* Store some information from first CQE */
780
- tpa_info -> start_cqe_placement_offset = cqe -> placement_offset ;
781
- tpa_info -> start_cqe_bd_len = le16_to_cpu (cqe -> len_on_first_bd );
782
847
if ((le16_to_cpu (cqe -> pars_flags .flags ) >>
783
848
PARSING_AND_ERR_FLAGS_TAG8021QEXIST_SHIFT ) &
784
849
PARSING_AND_ERR_FLAGS_TAG8021QEXIST_MASK )
@@ -899,6 +964,10 @@ static int qede_tpa_end(struct qede_dev *edev,
899
964
tpa_info = & rxq -> tpa_info [cqe -> tpa_agg_index ];
900
965
skb = tpa_info -> skb ;
901
966
967
+ if (tpa_info -> buffer .page_offset == PAGE_SIZE )
968
+ dma_unmap_page (rxq -> dev , tpa_info -> buffer .mapping ,
969
+ PAGE_SIZE , rxq -> data_direction );
970
+
902
971
for (i = 0 ; cqe -> len_list [i ]; i ++ )
903
972
qede_fill_frag_skb (edev , rxq , cqe -> tpa_agg_index ,
904
973
le16_to_cpu (cqe -> len_list [i ]));
@@ -919,11 +988,6 @@ static int qede_tpa_end(struct qede_dev *edev,
919
988
"Strange - total packet len [cqe] is %4x but SKB has len %04x\n" ,
920
989
le16_to_cpu (cqe -> total_packet_len ), skb -> len );
921
990
922
- memcpy (skb -> data ,
923
- page_address (tpa_info -> buffer .data ) +
924
- tpa_info -> start_cqe_placement_offset +
925
- tpa_info -> buffer .page_offset , tpa_info -> start_cqe_bd_len );
926
-
927
991
/* Finalize the SKB */
928
992
skb -> protocol = eth_type_trans (skb , edev -> ndev );
929
993
skb -> ip_summed = CHECKSUM_UNNECESSARY ;
@@ -940,6 +1004,12 @@ static int qede_tpa_end(struct qede_dev *edev,
940
1004
return 1 ;
941
1005
err :
942
1006
tpa_info -> state = QEDE_AGG_STATE_NONE ;
1007
+
1008
+ if (tpa_info -> tpa_start_fail ) {
1009
+ qede_reuse_page (rxq , & tpa_info -> buffer );
1010
+ tpa_info -> tpa_start_fail = false;
1011
+ }
1012
+
943
1013
dev_kfree_skb_any (tpa_info -> skb );
944
1014
tpa_info -> skb = NULL ;
945
1015
return 0 ;
@@ -1058,65 +1128,6 @@ static bool qede_rx_xdp(struct qede_dev *edev,
1058
1128
return false;
1059
1129
}
1060
1130
1061
- static struct sk_buff * qede_rx_allocate_skb (struct qede_dev * edev ,
1062
- struct qede_rx_queue * rxq ,
1063
- struct sw_rx_data * bd , u16 len ,
1064
- u16 pad )
1065
- {
1066
- unsigned int offset = bd -> page_offset + pad ;
1067
- struct skb_frag_struct * frag ;
1068
- struct page * page = bd -> data ;
1069
- unsigned int pull_len ;
1070
- struct sk_buff * skb ;
1071
- unsigned char * va ;
1072
-
1073
- /* Allocate a new SKB with a sufficient large header len */
1074
- skb = netdev_alloc_skb (edev -> ndev , QEDE_RX_HDR_SIZE );
1075
- if (unlikely (!skb ))
1076
- return NULL ;
1077
-
1078
- /* Copy data into SKB - if it's small, we can simply copy it and
1079
- * re-use the already allcoated & mapped memory.
1080
- */
1081
- if (len + pad <= edev -> rx_copybreak ) {
1082
- skb_put_data (skb , page_address (page ) + offset , len );
1083
- qede_reuse_page (rxq , bd );
1084
- goto out ;
1085
- }
1086
-
1087
- frag = & skb_shinfo (skb )-> frags [0 ];
1088
-
1089
- skb_add_rx_frag (skb , skb_shinfo (skb )-> nr_frags ,
1090
- page , offset , len , rxq -> rx_buf_seg_size );
1091
-
1092
- va = skb_frag_address (frag );
1093
- pull_len = eth_get_headlen (va , QEDE_RX_HDR_SIZE );
1094
-
1095
- /* Align the pull_len to optimize memcpy */
1096
- memcpy (skb -> data , va , ALIGN (pull_len , sizeof (long )));
1097
-
1098
- /* Correct the skb & frag sizes offset after the pull */
1099
- skb_frag_size_sub (frag , pull_len );
1100
- frag -> page_offset += pull_len ;
1101
- skb -> data_len -= pull_len ;
1102
- skb -> tail += pull_len ;
1103
-
1104
- if (unlikely (qede_realloc_rx_buffer (rxq , bd ))) {
1105
- /* Incr page ref count to reuse on allocation failure so
1106
- * that it doesn't get freed while freeing SKB [as its
1107
- * already mapped there].
1108
- */
1109
- page_ref_inc (page );
1110
- dev_kfree_skb_any (skb );
1111
- return NULL ;
1112
- }
1113
-
1114
- out :
1115
- /* We've consumed the first BD and prepared an SKB */
1116
- qede_rx_bd_ring_consume (rxq );
1117
- return skb ;
1118
- }
1119
-
1120
1131
static int qede_rx_build_jumbo (struct qede_dev * edev ,
1121
1132
struct qede_rx_queue * rxq ,
1122
1133
struct sk_buff * skb ,
@@ -1157,7 +1168,7 @@ static int qede_rx_build_jumbo(struct qede_dev *edev,
1157
1168
PAGE_SIZE , DMA_FROM_DEVICE );
1158
1169
1159
1170
skb_fill_page_desc (skb , skb_shinfo (skb )-> nr_frags ++ ,
1160
- bd -> data , 0 , cur_size );
1171
+ bd -> data , rxq -> rx_headroom , cur_size );
1161
1172
1162
1173
skb -> truesize += PAGE_SIZE ;
1163
1174
skb -> data_len += cur_size ;
@@ -1256,7 +1267,7 @@ static int qede_rx_process_cqe(struct qede_dev *edev,
1256
1267
/* Basic validation passed; Need to prepare an SKB. This would also
1257
1268
* guarantee to finally consume the first BD upon success.
1258
1269
*/
1259
- skb = qede_rx_allocate_skb (edev , rxq , bd , len , pad );
1270
+ skb = qede_rx_build_skb (edev , rxq , bd , len , pad );
1260
1271
if (!skb ) {
1261
1272
rxq -> rx_alloc_errors ++ ;
1262
1273
qede_recycle_rx_bd_ring (rxq , fp_cqe -> bd_num );
0 commit comments