From: kbuild test robot <lkp@intel.com>
To: Igor Pylypiv <ipylypiv@silver-peak.com>
Cc: kbuild-all@01.org, Shrikrishna Khare <skhare@vmware.com>,
"VMware, Inc." <pv-drivers@vmware.com>,
netdev@vger.kernel.org, ipylypiv@silver-peak.com
Subject: Re: [PATCH] vmxnet3: fix LRO feature check
Date: Sun, 18 Mar 2018 14:37:35 +0800 [thread overview]
Message-ID: <201803181411.VTfldbIf%fengguang.wu@intel.com> (raw)
In-Reply-To: <20180317075852.11785-1-ipylypiv@silver-peak.com>
[-- Attachment #1: Type: text/plain, Size: 10893 bytes --]
Hi Igor,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on v4.16-rc4]
[also build test WARNING on next-20180316]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Igor-Pylypiv/vmxnet3-fix-LRO-feature-check/20180318-140725
config: i386-randconfig-x003-201811 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
drivers/net/vmxnet3/vmxnet3_drv.c: In function 'vmxnet3_rq_rx_complete':
>> drivers/net/vmxnet3/vmxnet3_drv.c:1474:8: warning: suggest parentheses around operand of '!' or change '&' to '&&' or '!' to '~' [-Wparentheses]
!adapter->netdev->features & NETIF_F_LRO) {
^~~~~~~~~~~~~~~~~~~~~~~~~~
vim +1474 drivers/net/vmxnet3/vmxnet3_drv.c
1255
1256 static int
1257 vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
1258 struct vmxnet3_adapter *adapter, int quota)
1259 {
1260 static const u32 rxprod_reg[2] = {
1261 VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2
1262 };
1263 u32 num_pkts = 0;
1264 bool skip_page_frags = false;
1265 struct Vmxnet3_RxCompDesc *rcd;
1266 struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;
1267 u16 segCnt = 0, mss = 0;
1268 #ifdef __BIG_ENDIAN_BITFIELD
1269 struct Vmxnet3_RxDesc rxCmdDesc;
1270 struct Vmxnet3_RxCompDesc rxComp;
1271 #endif
1272 vmxnet3_getRxComp(rcd, &rq->comp_ring.base[rq->comp_ring.next2proc].rcd,
1273 &rxComp);
1274 while (rcd->gen == rq->comp_ring.gen) {
1275 struct vmxnet3_rx_buf_info *rbi;
1276 struct sk_buff *skb, *new_skb = NULL;
1277 struct page *new_page = NULL;
1278 dma_addr_t new_dma_addr;
1279 int num_to_alloc;
1280 struct Vmxnet3_RxDesc *rxd;
1281 u32 idx, ring_idx;
1282 struct vmxnet3_cmd_ring *ring = NULL;
1283 if (num_pkts >= quota) {
1284 /* we may stop even before we see the EOP desc of
1285 * the current pkt
1286 */
1287 break;
1288 }
1289 BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2 &&
1290 rcd->rqID != rq->dataRingQid);
1291 idx = rcd->rxdIdx;
1292 ring_idx = VMXNET3_GET_RING_IDX(adapter, rcd->rqID);
1293 ring = rq->rx_ring + ring_idx;
1294 vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd,
1295 &rxCmdDesc);
1296 rbi = rq->buf_info[ring_idx] + idx;
1297
1298 BUG_ON(rxd->addr != rbi->dma_addr ||
1299 rxd->len != rbi->len);
1300
1301 if (unlikely(rcd->eop && rcd->err)) {
1302 vmxnet3_rx_error(rq, rcd, ctx, adapter);
1303 goto rcd_done;
1304 }
1305
1306 if (rcd->sop) { /* first buf of the pkt */
1307 bool rxDataRingUsed;
1308 u16 len;
1309
1310 BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_HEAD ||
1311 (rcd->rqID != rq->qid &&
1312 rcd->rqID != rq->dataRingQid));
1313
1314 BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_SKB);
1315 BUG_ON(ctx->skb != NULL || rbi->skb == NULL);
1316
1317 if (unlikely(rcd->len == 0)) {
1318 /* Pretend the rx buffer is skipped. */
1319 BUG_ON(!(rcd->sop && rcd->eop));
1320 netdev_dbg(adapter->netdev,
1321 "rxRing[%u][%u] 0 length\n",
1322 ring_idx, idx);
1323 goto rcd_done;
1324 }
1325
1326 skip_page_frags = false;
1327 ctx->skb = rbi->skb;
1328
1329 rxDataRingUsed =
1330 VMXNET3_RX_DATA_RING(adapter, rcd->rqID);
1331 len = rxDataRingUsed ? rcd->len : rbi->len;
1332 new_skb = netdev_alloc_skb_ip_align(adapter->netdev,
1333 len);
1334 if (new_skb == NULL) {
1335 /* Skb allocation failed, do not handover this
1336 * skb to stack. Reuse it. Drop the existing pkt
1337 */
1338 rq->stats.rx_buf_alloc_failure++;
1339 ctx->skb = NULL;
1340 rq->stats.drop_total++;
1341 skip_page_frags = true;
1342 goto rcd_done;
1343 }
1344
1345 if (rxDataRingUsed) {
1346 size_t sz;
1347
1348 BUG_ON(rcd->len > rq->data_ring.desc_size);
1349
1350 ctx->skb = new_skb;
1351 sz = rcd->rxdIdx * rq->data_ring.desc_size;
1352 memcpy(new_skb->data,
1353 &rq->data_ring.base[sz], rcd->len);
1354 } else {
1355 ctx->skb = rbi->skb;
1356
1357 new_dma_addr =
1358 dma_map_single(&adapter->pdev->dev,
1359 new_skb->data, rbi->len,
1360 PCI_DMA_FROMDEVICE);
1361 if (dma_mapping_error(&adapter->pdev->dev,
1362 new_dma_addr)) {
1363 dev_kfree_skb(new_skb);
1364 /* Skb allocation failed, do not
1365 * handover this skb to stack. Reuse
1366 * it. Drop the existing pkt.
1367 */
1368 rq->stats.rx_buf_alloc_failure++;
1369 ctx->skb = NULL;
1370 rq->stats.drop_total++;
1371 skip_page_frags = true;
1372 goto rcd_done;
1373 }
1374
1375 dma_unmap_single(&adapter->pdev->dev,
1376 rbi->dma_addr,
1377 rbi->len,
1378 PCI_DMA_FROMDEVICE);
1379
1380 /* Immediate refill */
1381 rbi->skb = new_skb;
1382 rbi->dma_addr = new_dma_addr;
1383 rxd->addr = cpu_to_le64(rbi->dma_addr);
1384 rxd->len = rbi->len;
1385 }
1386
1387 #ifdef VMXNET3_RSS
1388 if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE &&
1389 (adapter->netdev->features & NETIF_F_RXHASH))
1390 skb_set_hash(ctx->skb,
1391 le32_to_cpu(rcd->rssHash),
1392 PKT_HASH_TYPE_L3);
1393 #endif
1394 skb_put(ctx->skb, rcd->len);
1395
1396 if (VMXNET3_VERSION_GE_2(adapter) &&
1397 rcd->type == VMXNET3_CDTYPE_RXCOMP_LRO) {
1398 struct Vmxnet3_RxCompDescExt *rcdlro;
1399 rcdlro = (struct Vmxnet3_RxCompDescExt *)rcd;
1400
1401 segCnt = rcdlro->segCnt;
1402 WARN_ON_ONCE(segCnt == 0);
1403 mss = rcdlro->mss;
1404 if (unlikely(segCnt <= 1))
1405 segCnt = 0;
1406 } else {
1407 segCnt = 0;
1408 }
1409 } else {
1410 BUG_ON(ctx->skb == NULL && !skip_page_frags);
1411
1412 /* non SOP buffer must be type 1 in most cases */
1413 BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE);
1414 BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY);
1415
1416 /* If an sop buffer was dropped, skip all
1417 * following non-sop fragments. They will be reused.
1418 */
1419 if (skip_page_frags)
1420 goto rcd_done;
1421
1422 if (rcd->len) {
1423 new_page = alloc_page(GFP_ATOMIC);
1424 /* Replacement page frag could not be allocated.
1425 * Reuse this page. Drop the pkt and free the
1426 * skb which contained this page as a frag. Skip
1427 * processing all the following non-sop frags.
1428 */
1429 if (unlikely(!new_page)) {
1430 rq->stats.rx_buf_alloc_failure++;
1431 dev_kfree_skb(ctx->skb);
1432 ctx->skb = NULL;
1433 skip_page_frags = true;
1434 goto rcd_done;
1435 }
1436 new_dma_addr = dma_map_page(&adapter->pdev->dev,
1437 new_page,
1438 0, PAGE_SIZE,
1439 PCI_DMA_FROMDEVICE);
1440 if (dma_mapping_error(&adapter->pdev->dev,
1441 new_dma_addr)) {
1442 put_page(new_page);
1443 rq->stats.rx_buf_alloc_failure++;
1444 dev_kfree_skb(ctx->skb);
1445 ctx->skb = NULL;
1446 skip_page_frags = true;
1447 goto rcd_done;
1448 }
1449
1450 dma_unmap_page(&adapter->pdev->dev,
1451 rbi->dma_addr, rbi->len,
1452 PCI_DMA_FROMDEVICE);
1453
1454 vmxnet3_append_frag(ctx->skb, rcd, rbi);
1455
1456 /* Immediate refill */
1457 rbi->page = new_page;
1458 rbi->dma_addr = new_dma_addr;
1459 rxd->addr = cpu_to_le64(rbi->dma_addr);
1460 rxd->len = rbi->len;
1461 }
1462 }
1463
1464
1465 skb = ctx->skb;
1466 if (rcd->eop) {
1467 u32 mtu = adapter->netdev->mtu;
1468 skb->len += skb->data_len;
1469
1470 vmxnet3_rx_csum(adapter, skb,
1471 (union Vmxnet3_GenericDesc *)rcd);
1472 skb->protocol = eth_type_trans(skb, adapter->netdev);
1473 if (!rcd->tcp ||
> 1474 !adapter->netdev->features & NETIF_F_LRO) {
1475 goto not_lro;
1476 }
1477
1478 if (segCnt != 0 && mss != 0) {
1479 skb_shinfo(skb)->gso_type = rcd->v4 ?
1480 SKB_GSO_TCPV4 : SKB_GSO_TCPV6;
1481 skb_shinfo(skb)->gso_size = mss;
1482 skb_shinfo(skb)->gso_segs = segCnt;
1483 } else if (segCnt != 0 || skb->len > mtu) {
1484 u32 hlen;
1485
1486 hlen = vmxnet3_get_hdr_len(adapter, skb,
1487 (union Vmxnet3_GenericDesc *)rcd);
1488 if (hlen == 0)
1489 goto not_lro;
1490
1491 skb_shinfo(skb)->gso_type =
1492 rcd->v4 ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6;
1493 if (segCnt != 0) {
1494 skb_shinfo(skb)->gso_segs = segCnt;
1495 skb_shinfo(skb)->gso_size =
1496 DIV_ROUND_UP(skb->len -
1497 hlen, segCnt);
1498 } else {
1499 skb_shinfo(skb)->gso_size = mtu - hlen;
1500 }
1501 }
1502 not_lro:
1503 if (unlikely(rcd->ts))
1504 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rcd->tci);
1505
1506 if (adapter->netdev->features & NETIF_F_LRO)
1507 netif_receive_skb(skb);
1508 else
1509 napi_gro_receive(&rq->napi, skb);
1510
1511 ctx->skb = NULL;
1512 num_pkts++;
1513 }
1514
1515 rcd_done:
1516 /* device may have skipped some rx descs */
1517 ring->next2comp = idx;
1518 num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring);
1519 ring = rq->rx_ring + ring_idx;
1520 while (num_to_alloc) {
1521 vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd,
1522 &rxCmdDesc);
1523 BUG_ON(!rxd->addr);
1524
1525 /* Recv desc is ready to be used by the device */
1526 rxd->gen = ring->gen;
1527 vmxnet3_cmd_ring_adv_next2fill(ring);
1528 num_to_alloc--;
1529 }
1530
1531 /* if needed, update the register */
1532 if (unlikely(rq->shared->updateRxProd)) {
1533 VMXNET3_WRITE_BAR0_REG(adapter,
1534 rxprod_reg[ring_idx] + rq->qid * 8,
1535 ring->next2fill);
1536 }
1537
1538 vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring);
1539 vmxnet3_getRxComp(rcd,
1540 &rq->comp_ring.base[rq->comp_ring.next2proc].rcd, &rxComp);
1541 }
1542
1543 return num_pkts;
1544 }
1545
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 34241 bytes --]
next prev parent reply other threads:[~2018-03-18 6:38 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-17 7:58 [PATCH] vmxnet3: fix LRO feature check Igor Pylypiv
2018-03-18 0:20 ` David Miller
2018-03-18 1:08 ` Igor Pylypiv
2018-03-18 6:37 ` kbuild test robot [this message]
2018-03-20 14:57 ` David Miller
2018-03-20 18:24 ` Igor Pylypiv
2018-03-20 18:42 ` Shrikrishna Khare
2018-03-20 18:59 ` David Miller
2018-03-18 11:23 ` kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201803181411.VTfldbIf%fengguang.wu@intel.com \
--to=lkp@intel.com \
--cc=ipylypiv@silver-peak.com \
--cc=kbuild-all@01.org \
--cc=netdev@vger.kernel.org \
--cc=pv-drivers@vmware.com \
--cc=skhare@vmware.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.