50
50
#include <linux/interrupt.h>
51
51
#include <linux/ip.h>
52
52
#include <linux/ipv6.h>
53
+ #include <linux/page_ref.h>
53
54
#include <linux/pci.h>
54
55
#include <linux/pci_regs.h>
55
56
#include <linux/msi.h>
@@ -80,6 +81,22 @@ void nfp_net_get_fw_version(struct nfp_net_fw_version *fw_ver,
80
81
put_unaligned_le32 (reg , fw_ver );
81
82
}
82
83
84
+ static dma_addr_t
85
+ nfp_net_dma_map_rx (struct nfp_net * nn , void * frag , unsigned int bufsz ,
86
+ int direction )
87
+ {
88
+ return dma_map_single (& nn -> pdev -> dev , frag + NFP_NET_RX_BUF_HEADROOM ,
89
+ bufsz - NFP_NET_RX_BUF_NON_DATA , direction );
90
+ }
91
+
92
+ static void
93
+ nfp_net_dma_unmap_rx (struct nfp_net * nn , dma_addr_t dma_addr ,
94
+ unsigned int bufsz , int direction )
95
+ {
96
+ dma_unmap_single (& nn -> pdev -> dev , dma_addr ,
97
+ bufsz - NFP_NET_RX_BUF_NON_DATA , direction );
98
+ }
99
+
83
100
/* Firmware reconfig
84
101
*
85
102
* Firmware reconfig may take a while so we have two versions of it -
@@ -1035,64 +1052,67 @@ nfp_net_calc_fl_bufsz(struct nfp_net *nn, unsigned int mtu)
1035
1052
{
1036
1053
unsigned int fl_bufsz ;
1037
1054
1055
+ fl_bufsz = NFP_NET_RX_BUF_HEADROOM ;
1038
1056
if (nn -> rx_offset == NFP_NET_CFG_RX_OFFSET_DYNAMIC )
1039
- fl_bufsz = NFP_NET_MAX_PREPEND ;
1057
+ fl_bufsz + = NFP_NET_MAX_PREPEND ;
1040
1058
else
1041
- fl_bufsz = nn -> rx_offset ;
1059
+ fl_bufsz + = nn -> rx_offset ;
1042
1060
fl_bufsz += ETH_HLEN + VLAN_HLEN * 2 + mtu ;
1043
1061
1062
+ fl_bufsz = SKB_DATA_ALIGN (fl_bufsz );
1063
+ fl_bufsz += SKB_DATA_ALIGN (sizeof (struct skb_shared_info ));
1064
+
1044
1065
return fl_bufsz ;
1045
1066
}
1046
1067
1047
1068
/**
1048
- * nfp_net_rx_alloc_one() - Allocate and map skb for RX
1069
+ * nfp_net_rx_alloc_one() - Allocate and map page frag for RX
1049
1070
* @rx_ring: RX ring structure of the skb
1050
1071
* @dma_addr: Pointer to storage for DMA address (output param)
1051
1072
* @fl_bufsz: size of freelist buffers
1052
1073
*
1053
- * This function will allcate a new skb , map it for DMA.
1074
+ * This function will allcate a new page frag , map it for DMA.
1054
1075
*
1055
- * Return: allocated skb or NULL on failure.
1076
+ * Return: allocated page frag or NULL on failure.
1056
1077
*/
1057
- static struct sk_buff *
1078
+ static void *
1058
1079
nfp_net_rx_alloc_one (struct nfp_net_rx_ring * rx_ring , dma_addr_t * dma_addr ,
1059
1080
unsigned int fl_bufsz )
1060
1081
{
1061
1082
struct nfp_net * nn = rx_ring -> r_vec -> nfp_net ;
1062
- struct sk_buff * skb ;
1083
+ void * frag ;
1063
1084
1064
- skb = netdev_alloc_skb ( nn -> netdev , fl_bufsz );
1065
- if (!skb ) {
1066
- nn_warn_ratelimit (nn , "Failed to alloc receive SKB \n" );
1085
+ frag = netdev_alloc_frag ( fl_bufsz );
1086
+ if (!frag ) {
1087
+ nn_warn_ratelimit (nn , "Failed to alloc receive page frag \n" );
1067
1088
return NULL ;
1068
1089
}
1069
1090
1070
- * dma_addr = dma_map_single (& nn -> pdev -> dev , skb -> data ,
1071
- fl_bufsz , DMA_FROM_DEVICE );
1091
+ * dma_addr = nfp_net_dma_map_rx (nn , frag , fl_bufsz , DMA_FROM_DEVICE );
1072
1092
if (dma_mapping_error (& nn -> pdev -> dev , * dma_addr )) {
1073
- dev_kfree_skb_any ( skb );
1093
+ skb_free_frag ( frag );
1074
1094
nn_warn_ratelimit (nn , "Failed to map DMA RX buffer\n" );
1075
1095
return NULL ;
1076
1096
}
1077
1097
1078
- return skb ;
1098
+ return frag ;
1079
1099
}
1080
1100
1081
1101
/**
1082
1102
* nfp_net_rx_give_one() - Put mapped skb on the software and hardware rings
1083
1103
* @rx_ring: RX ring structure
1084
- * @skb: Skb to put on rings
1104
+ * @frag: page fragment buffer
1085
1105
* @dma_addr: DMA address of skb mapping
1086
1106
*/
1087
1107
static void nfp_net_rx_give_one (struct nfp_net_rx_ring * rx_ring ,
1088
- struct sk_buff * skb , dma_addr_t dma_addr )
1108
+ void * frag , dma_addr_t dma_addr )
1089
1109
{
1090
1110
unsigned int wr_idx ;
1091
1111
1092
1112
wr_idx = rx_ring -> wr_p % rx_ring -> cnt ;
1093
1113
1094
1114
/* Stash SKB and DMA address away */
1095
- rx_ring -> rxbufs [wr_idx ].skb = skb ;
1115
+ rx_ring -> rxbufs [wr_idx ].frag = frag ;
1096
1116
rx_ring -> rxbufs [wr_idx ].dma_addr = dma_addr ;
1097
1117
1098
1118
/* Fill freelist descriptor */
@@ -1127,9 +1147,9 @@ static void nfp_net_rx_ring_reset(struct nfp_net_rx_ring *rx_ring)
1127
1147
wr_idx = rx_ring -> wr_p % rx_ring -> cnt ;
1128
1148
last_idx = rx_ring -> cnt - 1 ;
1129
1149
rx_ring -> rxbufs [wr_idx ].dma_addr = rx_ring -> rxbufs [last_idx ].dma_addr ;
1130
- rx_ring -> rxbufs [wr_idx ].skb = rx_ring -> rxbufs [last_idx ].skb ;
1150
+ rx_ring -> rxbufs [wr_idx ].frag = rx_ring -> rxbufs [last_idx ].frag ;
1131
1151
rx_ring -> rxbufs [last_idx ].dma_addr = 0 ;
1132
- rx_ring -> rxbufs [last_idx ].skb = NULL ;
1152
+ rx_ring -> rxbufs [last_idx ].frag = NULL ;
1133
1153
1134
1154
memset (rx_ring -> rxds , 0 , sizeof (* rx_ring -> rxds ) * rx_ring -> cnt );
1135
1155
rx_ring -> wr_p = 0 ;
@@ -1149,22 +1169,21 @@ static void nfp_net_rx_ring_reset(struct nfp_net_rx_ring *rx_ring)
1149
1169
static void
1150
1170
nfp_net_rx_ring_bufs_free (struct nfp_net * nn , struct nfp_net_rx_ring * rx_ring )
1151
1171
{
1152
- struct pci_dev * pdev = nn -> pdev ;
1153
1172
unsigned int i ;
1154
1173
1155
1174
for (i = 0 ; i < rx_ring -> cnt - 1 ; i ++ ) {
1156
1175
/* NULL skb can only happen when initial filling of the ring
1157
1176
* fails to allocate enough buffers and calls here to free
1158
1177
* already allocated ones.
1159
1178
*/
1160
- if (!rx_ring -> rxbufs [i ].skb )
1179
+ if (!rx_ring -> rxbufs [i ].frag )
1161
1180
continue ;
1162
1181
1163
- dma_unmap_single ( & pdev -> dev , rx_ring -> rxbufs [i ].dma_addr ,
1164
- rx_ring -> bufsz , DMA_FROM_DEVICE );
1165
- dev_kfree_skb_any (rx_ring -> rxbufs [i ].skb );
1182
+ nfp_net_dma_unmap_rx ( nn , rx_ring -> rxbufs [i ].dma_addr ,
1183
+ rx_ring -> bufsz , DMA_FROM_DEVICE );
1184
+ skb_free_frag (rx_ring -> rxbufs [i ].frag );
1166
1185
rx_ring -> rxbufs [i ].dma_addr = 0 ;
1167
- rx_ring -> rxbufs [i ].skb = NULL ;
1186
+ rx_ring -> rxbufs [i ].frag = NULL ;
1168
1187
}
1169
1188
}
1170
1189
@@ -1182,10 +1201,10 @@ nfp_net_rx_ring_bufs_alloc(struct nfp_net *nn, struct nfp_net_rx_ring *rx_ring)
1182
1201
rxbufs = rx_ring -> rxbufs ;
1183
1202
1184
1203
for (i = 0 ; i < rx_ring -> cnt - 1 ; i ++ ) {
1185
- rxbufs [i ].skb =
1204
+ rxbufs [i ].frag =
1186
1205
nfp_net_rx_alloc_one (rx_ring , & rxbufs [i ].dma_addr ,
1187
1206
rx_ring -> bufsz );
1188
- if (!rxbufs [i ].skb ) {
1207
+ if (!rxbufs [i ].frag ) {
1189
1208
nfp_net_rx_ring_bufs_free (nn , rx_ring );
1190
1209
return - ENOMEM ;
1191
1210
}
@@ -1203,7 +1222,7 @@ static void nfp_net_rx_ring_fill_freelist(struct nfp_net_rx_ring *rx_ring)
1203
1222
unsigned int i ;
1204
1223
1205
1224
for (i = 0 ; i < rx_ring -> cnt - 1 ; i ++ )
1206
- nfp_net_rx_give_one (rx_ring , rx_ring -> rxbufs [i ].skb ,
1225
+ nfp_net_rx_give_one (rx_ring , rx_ring -> rxbufs [i ].frag ,
1207
1226
rx_ring -> rxbufs [i ].dma_addr );
1208
1227
}
1209
1228
@@ -1338,8 +1357,13 @@ nfp_net_rx_drop(struct nfp_net_r_vector *r_vec, struct nfp_net_rx_ring *rx_ring,
1338
1357
r_vec -> rx_drops ++ ;
1339
1358
u64_stats_update_end (& r_vec -> rx_sync );
1340
1359
1360
+ /* skb is build based on the frag, free_skb() would free the frag
1361
+ * so to be able to reuse it we need an extra ref.
1362
+ */
1363
+ if (skb && rxbuf && skb -> head == rxbuf -> frag )
1364
+ page_ref_inc (virt_to_head_page (rxbuf -> frag ));
1341
1365
if (rxbuf )
1342
- nfp_net_rx_give_one (rx_ring , rxbuf -> skb , rxbuf -> dma_addr );
1366
+ nfp_net_rx_give_one (rx_ring , rxbuf -> frag , rxbuf -> dma_addr );
1343
1367
if (skb )
1344
1368
dev_kfree_skb_any (skb );
1345
1369
}
@@ -1360,10 +1384,12 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1360
1384
struct nfp_net_r_vector * r_vec = rx_ring -> r_vec ;
1361
1385
struct nfp_net * nn = r_vec -> nfp_net ;
1362
1386
unsigned int data_len , meta_len ;
1363
- struct sk_buff * skb , * new_skb ;
1387
+ struct nfp_net_rx_buf * rxbuf ;
1364
1388
struct nfp_net_rx_desc * rxd ;
1365
1389
dma_addr_t new_dma_addr ;
1390
+ struct sk_buff * skb ;
1366
1391
int pkts_polled = 0 ;
1392
+ void * new_frag ;
1367
1393
int idx ;
1368
1394
1369
1395
while (pkts_polled < budget ) {
@@ -1381,21 +1407,23 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1381
1407
rx_ring -> rd_p ++ ;
1382
1408
pkts_polled ++ ;
1383
1409
1384
- skb = rx_ring -> rxbufs [idx ].skb ;
1385
-
1386
- new_skb = nfp_net_rx_alloc_one (rx_ring , & new_dma_addr ,
1387
- nn -> fl_bufsz );
1388
- if (!new_skb ) {
1389
- nfp_net_rx_drop (r_vec , rx_ring , & rx_ring -> rxbufs [idx ],
1390
- NULL );
1410
+ rxbuf = & rx_ring -> rxbufs [idx ];
1411
+ skb = build_skb (rxbuf -> frag , nn -> fl_bufsz );
1412
+ if (unlikely (!skb )) {
1413
+ nfp_net_rx_drop (r_vec , rx_ring , rxbuf , NULL );
1414
+ continue ;
1415
+ }
1416
+ new_frag = nfp_net_rx_alloc_one (rx_ring , & new_dma_addr ,
1417
+ nn -> fl_bufsz );
1418
+ if (unlikely (!new_frag )) {
1419
+ nfp_net_rx_drop (r_vec , rx_ring , rxbuf , skb );
1391
1420
continue ;
1392
1421
}
1393
1422
1394
- dma_unmap_single (& nn -> pdev -> dev ,
1395
- rx_ring -> rxbufs [idx ].dma_addr ,
1396
- nn -> fl_bufsz , DMA_FROM_DEVICE );
1423
+ nfp_net_dma_unmap_rx (nn , rx_ring -> rxbufs [idx ].dma_addr ,
1424
+ nn -> fl_bufsz , DMA_FROM_DEVICE );
1397
1425
1398
- nfp_net_rx_give_one (rx_ring , new_skb , new_dma_addr );
1426
+ nfp_net_rx_give_one (rx_ring , new_frag , new_dma_addr );
1399
1427
1400
1428
/* < meta_len >
1401
1429
* <-- [rx_offset] -->
@@ -1413,9 +1441,10 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1413
1441
data_len = le16_to_cpu (rxd -> rxd .data_len );
1414
1442
1415
1443
if (nn -> rx_offset == NFP_NET_CFG_RX_OFFSET_DYNAMIC )
1416
- skb_reserve (skb , meta_len );
1444
+ skb_reserve (skb , NFP_NET_RX_BUF_HEADROOM + meta_len );
1417
1445
else
1418
- skb_reserve (skb , nn -> rx_offset );
1446
+ skb_reserve (skb ,
1447
+ NFP_NET_RX_BUF_HEADROOM + nn -> rx_offset );
1419
1448
skb_put (skb , data_len - meta_len );
1420
1449
1421
1450
/* Stats update */
0 commit comments