Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'ntb-bugfixes-3.10' of git://github.com/jonmason/ntb

Pull NTB update from Jon Mason:
"NTB bug fixes to address Smatch/Coverity errors, link toggling bugs,
and a few corner cases in the driver."

This pull request came in during the merge window, but without any
signage etc. So I'm taking it late, because it wasn't _originally_
late.

* tag 'ntb-bugfixes-3.10' of git://github.com/jonmason/ntb:
NTB: Multiple NTB client fix
ntb_netdev: remove from list on exit
NTB: memcpy lockup workaround
NTB: Correctly handle receive buffers of the minimal size
NTB: reset tx_index on link toggle
NTB: Link toggle memory leak
NTB: Handle 64bit BAR sizes
NTB: fix pointer math issues
ntb: off by one sanity checks
NTB: variable dereferenced before check

+123 -68
+2
drivers/net/ntb_netdev.c
··· 375 375 if (dev == NULL) 376 376 return; 377 377 378 + list_del(&dev->list); 379 + 378 380 ndev = dev->ndev; 379 381 380 382 unregister_netdev(ndev);
+5 -5
drivers/ntb/ntb_hw.c
··· 345 345 */ 346 346 void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw) 347 347 { 348 - if (mw > NTB_NUM_MW) 348 + if (mw >= NTB_NUM_MW) 349 349 return NULL; 350 350 351 351 return ndev->mw[mw].vbase; ··· 362 362 */ 363 363 resource_size_t ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw) 364 364 { 365 - if (mw > NTB_NUM_MW) 365 + if (mw >= NTB_NUM_MW) 366 366 return 0; 367 367 368 368 return ndev->mw[mw].bar_sz; ··· 380 380 */ 381 381 void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr) 382 382 { 383 - if (mw > NTB_NUM_MW) 383 + if (mw >= NTB_NUM_MW) 384 384 return; 385 385 386 386 dev_dbg(&ndev->pdev->dev, "Writing addr %Lx to BAR %d\n", addr, ··· 1027 1027 ndev->mw[i].vbase = 1028 1028 ioremap_wc(pci_resource_start(pdev, MW_TO_BAR(i)), 1029 1029 ndev->mw[i].bar_sz); 1030 - dev_info(&pdev->dev, "MW %d size %d\n", i, 1031 - (u32) pci_resource_len(pdev, MW_TO_BAR(i))); 1030 + dev_info(&pdev->dev, "MW %d size %llu\n", i, 1031 + pci_resource_len(pdev, MW_TO_BAR(i))); 1032 1032 if (!ndev->mw[i].vbase) { 1033 1033 dev_warn(&pdev->dev, "Cannot remap BAR %d\n", 1034 1034 MW_TO_BAR(i));
+116 -63
drivers/ntb/ntb_transport.c
··· 58 58 #include <linux/ntb.h> 59 59 #include "ntb_hw.h" 60 60 61 - #define NTB_TRANSPORT_VERSION 2 61 + #define NTB_TRANSPORT_VERSION 3 62 62 63 63 static unsigned int transport_mtu = 0x401E; 64 64 module_param(transport_mtu, uint, 0644); ··· 173 173 174 174 enum { 175 175 VERSION = 0, 176 - MW0_SZ, 177 - MW1_SZ, 178 - NUM_QPS, 179 176 QP_LINKS, 177 + NUM_QPS, 178 + NUM_MWS, 179 + MW0_SZ_HIGH, 180 + MW0_SZ_LOW, 181 + MW1_SZ_HIGH, 182 + MW1_SZ_LOW, 180 183 MAX_SPAD, 181 184 }; 182 185 ··· 300 297 { 301 298 struct ntb_transport_client_dev *client_dev; 302 299 struct ntb_transport *nt; 303 - int rc; 300 + int rc, i = 0; 304 301 305 302 if (list_empty(&ntb_transport_list)) 306 303 return -ENODEV; ··· 318 315 dev = &client_dev->dev; 319 316 320 317 /* setup and register client devices */ 321 - dev_set_name(dev, "%s", device_name); 318 + dev_set_name(dev, "%s%d", device_name, i); 322 319 dev->bus = &ntb_bus_type; 323 320 dev->release = ntb_client_release; 324 321 dev->parent = &ntb_query_pdev(nt->ndev)->dev; ··· 330 327 } 331 328 332 329 list_add_tail(&client_dev->entry, &nt->client_devs); 330 + i++; 333 331 } 334 332 335 333 return 0; ··· 490 486 (qp_num / NTB_NUM_MW * rx_size); 491 487 rx_size -= sizeof(struct ntb_rx_info); 492 488 493 - qp->rx_buff = qp->remote_rx_info + sizeof(struct ntb_rx_info); 494 - qp->rx_max_frame = min(transport_mtu, rx_size); 489 + qp->rx_buff = qp->remote_rx_info + 1; 490 + /* Due to housekeeping, there must be atleast 2 buffs */ 491 + qp->rx_max_frame = min(transport_mtu, rx_size / 2); 495 492 qp->rx_max_entry = rx_size / qp->rx_max_frame; 496 493 qp->rx_index = 0; 497 494 498 - qp->remote_rx_info->entry = qp->rx_max_entry; 495 + qp->remote_rx_info->entry = qp->rx_max_entry - 1; 499 496 500 497 /* setup the hdr offsets with 0's */ 501 498 for (i = 0; i < qp->rx_max_entry; i++) { ··· 507 502 508 503 qp->rx_pkts = 0; 509 504 qp->tx_pkts = 0; 505 + qp->tx_index = 0; 506 + } 507 + 508 + static void ntb_free_mw(struct ntb_transport *nt, int num_mw) 509 + { 510 + struct ntb_transport_mw *mw = &nt->mw[num_mw]; 511 + struct pci_dev *pdev = ntb_query_pdev(nt->ndev); 512 + 513 + if (!mw->virt_addr) 514 + return; 515 + 516 + dma_free_coherent(&pdev->dev, mw->size, mw->virt_addr, mw->dma_addr); 517 + mw->virt_addr = NULL; 510 518 } 511 519 512 520 static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size) ··· 527 509 struct ntb_transport_mw *mw = &nt->mw[num_mw]; 528 510 struct pci_dev *pdev = ntb_query_pdev(nt->ndev); 529 511 512 + /* No need to re-setup */ 513 + if (mw->size == ALIGN(size, 4096)) 514 + return 0; 515 + 516 + if (mw->size != 0) 517 + ntb_free_mw(nt, num_mw); 518 + 530 519 /* Alloc memory for receiving data. Must be 4k aligned */ 531 520 mw->size = ALIGN(size, 4096); 532 521 533 522 mw->virt_addr = dma_alloc_coherent(&pdev->dev, mw->size, &mw->dma_addr, 534 523 GFP_KERNEL); 535 524 if (!mw->virt_addr) { 525 + mw->size = 0; 536 526 dev_err(&pdev->dev, "Unable to allocate MW buffer of size %d\n", 537 527 (int) mw->size); 538 528 return -ENOMEM; ··· 630 604 u32 val; 631 605 int rc, i; 632 606 633 - /* send the local info */ 634 - rc = ntb_write_remote_spad(ndev, VERSION, NTB_TRANSPORT_VERSION); 635 - if (rc) { 636 - dev_err(&pdev->dev, "Error writing %x to remote spad %d\n", 637 - 0, VERSION); 638 - goto out; 607 + /* send the local info, in the opposite order of the way we read it */ 608 + for (i = 0; i < NTB_NUM_MW; i++) { 609 + rc = ntb_write_remote_spad(ndev, MW0_SZ_HIGH + (i * 2), 610 + ntb_get_mw_size(ndev, i) >> 32); 611 + if (rc) { 612 + dev_err(&pdev->dev, "Error writing %u to remote spad %d\n", 613 + (u32)(ntb_get_mw_size(ndev, i) >> 32), 614 + MW0_SZ_HIGH + (i * 2)); 615 + goto out; 616 + } 617 + 618 + rc = ntb_write_remote_spad(ndev, MW0_SZ_LOW + (i * 2), 619 + (u32) ntb_get_mw_size(ndev, i)); 620 + if (rc) { 621 + dev_err(&pdev->dev, "Error writing %u to remote spad %d\n", 622 + (u32) ntb_get_mw_size(ndev, i), 623 + MW0_SZ_LOW + (i * 2)); 624 + goto out; 625 + } 639 626 } 640 627 641 - rc = ntb_write_remote_spad(ndev, MW0_SZ, ntb_get_mw_size(ndev, 0)); 628 + rc = ntb_write_remote_spad(ndev, NUM_MWS, NTB_NUM_MW); 642 629 if (rc) { 643 630 dev_err(&pdev->dev, "Error writing %x to remote spad %d\n", 644 - (u32) ntb_get_mw_size(ndev, 0), MW0_SZ); 645 - goto out; 646 - } 647 - 648 - rc = ntb_write_remote_spad(ndev, MW1_SZ, ntb_get_mw_size(ndev, 1)); 649 - if (rc) { 650 - dev_err(&pdev->dev, "Error writing %x to remote spad %d\n", 651 - (u32) ntb_get_mw_size(ndev, 1), MW1_SZ); 631 + NTB_NUM_MW, NUM_MWS); 652 632 goto out; 653 633 } 654 634 ··· 665 633 goto out; 666 634 } 667 635 668 - rc = ntb_read_local_spad(nt->ndev, QP_LINKS, &val); 669 - if (rc) { 670 - dev_err(&pdev->dev, "Error reading spad %d\n", QP_LINKS); 671 - goto out; 672 - } 673 - 674 - rc = ntb_write_remote_spad(ndev, QP_LINKS, val); 636 + rc = ntb_write_remote_spad(ndev, VERSION, NTB_TRANSPORT_VERSION); 675 637 if (rc) { 676 638 dev_err(&pdev->dev, "Error writing %x to remote spad %d\n", 677 - val, QP_LINKS); 639 + NTB_TRANSPORT_VERSION, VERSION); 678 640 goto out; 679 641 } 680 642 ··· 693 667 goto out; 694 668 dev_dbg(&pdev->dev, "Remote max number of qps = %d\n", val); 695 669 696 - rc = ntb_read_remote_spad(ndev, MW0_SZ, &val); 670 + rc = ntb_read_remote_spad(ndev, NUM_MWS, &val); 697 671 if (rc) { 698 - dev_err(&pdev->dev, "Error reading remote spad %d\n", MW0_SZ); 672 + dev_err(&pdev->dev, "Error reading remote spad %d\n", NUM_MWS); 699 673 goto out; 700 674 } 701 675 702 - if (!val) 676 + if (val != NTB_NUM_MW) 703 677 goto out; 704 - dev_dbg(&pdev->dev, "Remote MW0 size = %d\n", val); 678 + dev_dbg(&pdev->dev, "Remote number of mws = %d\n", val); 705 679 706 - rc = ntb_set_mw(nt, 0, val); 707 - if (rc) 708 - goto out; 680 + for (i = 0; i < NTB_NUM_MW; i++) { 681 + u64 val64; 709 682 710 - rc = ntb_read_remote_spad(ndev, MW1_SZ, &val); 711 - if (rc) { 712 - dev_err(&pdev->dev, "Error reading remote spad %d\n", MW1_SZ); 713 - goto out; 683 + rc = ntb_read_remote_spad(ndev, MW0_SZ_HIGH + (i * 2), &val); 684 + if (rc) { 685 + dev_err(&pdev->dev, "Error reading remote spad %d\n", 686 + MW0_SZ_HIGH + (i * 2)); 687 + goto out1; 688 + } 689 + 690 + val64 = (u64) val << 32; 691 + 692 + rc = ntb_read_remote_spad(ndev, MW0_SZ_LOW + (i * 2), &val); 693 + if (rc) { 694 + dev_err(&pdev->dev, "Error reading remote spad %d\n", 695 + MW0_SZ_LOW + (i * 2)); 696 + goto out1; 697 + } 698 + 699 + val64 |= val; 700 + 701 + dev_dbg(&pdev->dev, "Remote MW%d size = %llu\n", i, val64); 702 + 703 + rc = ntb_set_mw(nt, i, val64); 704 + if (rc) 705 + goto out1; 714 706 } 715 - 716 - if (!val) 717 - goto out; 718 - dev_dbg(&pdev->dev, "Remote MW1 size = %d\n", val); 719 - 720 - rc = ntb_set_mw(nt, 1, val); 721 - if (rc) 722 - goto out; 723 707 724 708 nt->transport_link = NTB_LINK_UP; 725 709 ··· 744 708 745 709 return; 746 710 711 + out1: 712 + for (i = 0; i < NTB_NUM_MW; i++) 713 + ntb_free_mw(nt, i); 747 714 out: 748 715 if (ntb_hw_link_status(ndev)) 749 716 schedule_delayed_work(&nt->link_work, ··· 819 780 (qp_num / NTB_NUM_MW * tx_size); 820 781 tx_size -= sizeof(struct ntb_rx_info); 821 782 822 - qp->tx_mw = qp->rx_info + sizeof(struct ntb_rx_info); 823 - qp->tx_max_frame = min(transport_mtu, tx_size); 783 + qp->tx_mw = qp->rx_info + 1; 784 + /* Due to housekeeping, there must be atleast 2 buffs */ 785 + qp->tx_max_frame = min(transport_mtu, tx_size / 2); 824 786 qp->tx_max_entry = tx_size / qp->tx_max_frame; 825 - qp->tx_index = 0; 826 787 827 788 if (nt->debugfs_dir) { 828 789 char debugfs_name[4]; ··· 936 897 pdev = ntb_query_pdev(nt->ndev); 937 898 938 899 for (i = 0; i < NTB_NUM_MW; i++) 939 - if (nt->mw[i].virt_addr) 940 - dma_free_coherent(&pdev->dev, nt->mw[i].size, 941 - nt->mw[i].virt_addr, 942 - nt->mw[i].dma_addr); 900 + ntb_free_mw(nt, i); 943 901 944 902 kfree(nt->qps); 945 903 ntb_unregister_transport(nt->ndev); ··· 1035 999 static void ntb_transport_rx(unsigned long data) 1036 1000 { 1037 1001 struct ntb_transport_qp *qp = (struct ntb_transport_qp *)data; 1038 - int rc; 1002 + int rc, i; 1039 1003 1040 - do { 1004 + /* Limit the number of packets processed in a single interrupt to 1005 + * provide fairness to others 1006 + */ 1007 + for (i = 0; i < qp->rx_max_entry; i++) { 1041 1008 rc = ntb_process_rxc(qp); 1042 - } while (!rc); 1009 + if (rc) 1010 + break; 1011 + } 1043 1012 } 1044 1013 1045 1014 static void ntb_transport_rxc_db(void *data, int db_num) ··· 1251 1210 */ 1252 1211 void ntb_transport_free_queue(struct ntb_transport_qp *qp) 1253 1212 { 1254 - struct pci_dev *pdev = ntb_query_pdev(qp->ndev); 1213 + struct pci_dev *pdev; 1255 1214 struct ntb_queue_entry *entry; 1256 1215 1257 1216 if (!qp) 1258 1217 return; 1218 + 1219 + pdev = ntb_query_pdev(qp->ndev); 1259 1220 1260 1221 cancel_delayed_work_sync(&qp->link_work); 1261 1222 ··· 1414 1371 */ 1415 1372 void ntb_transport_link_down(struct ntb_transport_qp *qp) 1416 1373 { 1417 - struct pci_dev *pdev = ntb_query_pdev(qp->ndev); 1374 + struct pci_dev *pdev; 1418 1375 int rc, val; 1419 1376 1420 1377 if (!qp) 1421 1378 return; 1422 1379 1380 + pdev = ntb_query_pdev(qp->ndev); 1423 1381 qp->client_ready = NTB_LINK_DOWN; 1424 1382 1425 1383 rc = ntb_read_local_spad(qp->ndev, QP_LINKS, &val); ··· 1452 1408 */ 1453 1409 bool ntb_transport_link_query(struct ntb_transport_qp *qp) 1454 1410 { 1411 + if (!qp) 1412 + return false; 1413 + 1455 1414 return qp->qp_link == NTB_LINK_UP; 1456 1415 } 1457 1416 EXPORT_SYMBOL_GPL(ntb_transport_link_query); ··· 1469 1422 */ 1470 1423 unsigned char ntb_transport_qp_num(struct ntb_transport_qp *qp) 1471 1424 { 1425 + if (!qp) 1426 + return 0; 1427 + 1472 1428 return qp->qp_num; 1473 1429 } 1474 1430 EXPORT_SYMBOL_GPL(ntb_transport_qp_num); ··· 1486 1436 */ 1487 1437 unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) 1488 1438 { 1439 + if (!qp) 1440 + return 0; 1441 + 1489 1442 return qp->tx_max_frame - sizeof(struct ntb_payload_header); 1490 1443 } 1491 1444 EXPORT_SYMBOL_GPL(ntb_transport_max_size);