Skip to content

Commit ded0e25

Browse files
committed
Merge tag 'ntb-4.3' of git://github.com/jonmason/ntb
Pull NTB fixes from Jon Mason: "NTB bug and documentation fixes, new device IDs, performance improvements, and adding a mailing list to MAINTAINERS for NTB" * tag 'ntb-4.3' of git://github.com/jonmason/ntb: NTB: Fix range check on memory window index NTB: Improve index handling in B2B MW workaround NTB: Fix documentation for ntb_peer_db_clear. NTB: Fix documentation for ntb_link_is_up NTB: Use unique DMA channels for TX and RX NTB: Remove dma_sync_wait from ntb_async_rx NTB: Clean up QP stats info NTB: Make the transport list in order of discovery NTB: Add PCI Device IDs for Broadwell Xeon NTB: Add flow control to the ntb_netdev NTB: Add list to MAINTAINERS
2 parents f0c032d + 9a07826 commit ded0e25

File tree

7 files changed

+210
-47
lines changed

7 files changed

+210
-47
lines changed

MAINTAINERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7396,6 +7396,7 @@ NTB DRIVER CORE
73967396
M: Jon Mason <jdmason@kudzu.us>
73977397
M: Dave Jiang <dave.jiang@intel.com>
73987398
M: Allen Hubbe <Allen.Hubbe@emc.com>
7399+
L: linux-ntb@googlegroups.com
73997400
S: Supported
74007401
W: https://github.com/jonmason/ntb/wiki
74017402
T: git git://github.com/jonmason/ntb.git
@@ -7407,6 +7408,7 @@ F: include/linux/ntb_transport.h
74077408
NTB INTEL DRIVER
74087409
M: Jon Mason <jdmason@kudzu.us>
74097410
M: Dave Jiang <dave.jiang@intel.com>
7411+
L: linux-ntb@googlegroups.com
74107412
S: Supported
74117413
W: https://github.com/jonmason/ntb/wiki
74127414
T: git git://github.com/jonmason/ntb.git

drivers/net/ntb_netdev.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,21 @@ MODULE_VERSION(NTB_NETDEV_VER);
6161
MODULE_LICENSE("Dual BSD/GPL");
6262
MODULE_AUTHOR("Intel Corporation");
6363

64+
/* Time in usecs for tx resource reaper */
65+
static unsigned int tx_time = 1;
66+
67+
/* Number of descriptors to free before resuming tx */
68+
static unsigned int tx_start = 10;
69+
70+
/* Number of descriptors still available before stop upper layer tx */
71+
static unsigned int tx_stop = 5;
72+
6473
struct ntb_netdev {
6574
struct list_head list;
6675
struct pci_dev *pdev;
6776
struct net_device *ndev;
6877
struct ntb_transport_qp *qp;
78+
struct timer_list tx_timer;
6979
};
7080

7181
#define NTB_TX_TIMEOUT_MS 1000
@@ -136,11 +146,42 @@ static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data,
136146
}
137147
}
138148

149+
static int __ntb_netdev_maybe_stop_tx(struct net_device *netdev,
150+
struct ntb_transport_qp *qp, int size)
151+
{
152+
struct ntb_netdev *dev = netdev_priv(netdev);
153+
154+
netif_stop_queue(netdev);
155+
/* Make sure to see the latest value of ntb_transport_tx_free_entry()
156+
* since the queue was last started.
157+
*/
158+
smp_mb();
159+
160+
if (likely(ntb_transport_tx_free_entry(qp) < size)) {
161+
mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time));
162+
return -EBUSY;
163+
}
164+
165+
netif_start_queue(netdev);
166+
return 0;
167+
}
168+
169+
static int ntb_netdev_maybe_stop_tx(struct net_device *ndev,
170+
struct ntb_transport_qp *qp, int size)
171+
{
172+
if (netif_queue_stopped(ndev) ||
173+
(ntb_transport_tx_free_entry(qp) >= size))
174+
return 0;
175+
176+
return __ntb_netdev_maybe_stop_tx(ndev, qp, size);
177+
}
178+
139179
static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data,
140180
void *data, int len)
141181
{
142182
struct net_device *ndev = qp_data;
143183
struct sk_buff *skb;
184+
struct ntb_netdev *dev = netdev_priv(ndev);
144185

145186
skb = data;
146187
if (!skb || !ndev)
@@ -155,6 +196,15 @@ static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data,
155196
}
156197

157198
dev_kfree_skb(skb);
199+
200+
if (ntb_transport_tx_free_entry(dev->qp) >= tx_start) {
201+
/* Make sure anybody stopping the queue after this sees the new
202+
* value of ntb_transport_tx_free_entry()
203+
*/
204+
smp_mb();
205+
if (netif_queue_stopped(ndev))
206+
netif_wake_queue(ndev);
207+
}
158208
}
159209

160210
static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
@@ -163,10 +213,15 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
163213
struct ntb_netdev *dev = netdev_priv(ndev);
164214
int rc;
165215

216+
ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop);
217+
166218
rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len);
167219
if (rc)
168220
goto err;
169221

222+
/* check for next submit */
223+
ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop);
224+
170225
return NETDEV_TX_OK;
171226

172227
err:
@@ -175,6 +230,23 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
175230
return NETDEV_TX_BUSY;
176231
}
177232

233+
static void ntb_netdev_tx_timer(unsigned long data)
234+
{
235+
struct net_device *ndev = (struct net_device *)data;
236+
struct ntb_netdev *dev = netdev_priv(ndev);
237+
238+
if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) {
239+
mod_timer(&dev->tx_timer, jiffies + msecs_to_jiffies(tx_time));
240+
} else {
241+
/* Make sure anybody stopping the queue after this sees the new
242+
* value of ntb_transport_tx_free_entry()
243+
*/
244+
smp_mb();
245+
if (netif_queue_stopped(ndev))
246+
netif_wake_queue(ndev);
247+
}
248+
}
249+
178250
static int ntb_netdev_open(struct net_device *ndev)
179251
{
180252
struct ntb_netdev *dev = netdev_priv(ndev);
@@ -197,8 +269,11 @@ static int ntb_netdev_open(struct net_device *ndev)
197269
}
198270
}
199271

272+
setup_timer(&dev->tx_timer, ntb_netdev_tx_timer, (unsigned long)ndev);
273+
200274
netif_carrier_off(ndev);
201275
ntb_transport_link_up(dev->qp);
276+
netif_start_queue(ndev);
202277

203278
return 0;
204279

@@ -219,6 +294,8 @@ static int ntb_netdev_close(struct net_device *ndev)
219294
while ((skb = ntb_transport_rx_remove(dev->qp, &len)))
220295
dev_kfree_skb(skb);
221296

297+
del_timer_sync(&dev->tx_timer);
298+
222299
return 0;
223300
}
224301

drivers/ntb/hw/intel/ntb_hw_intel.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,17 @@ static inline int pdev_is_xeon(struct pci_dev *pdev)
190190
case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
191191
case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
192192
case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
193+
case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
193194
case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
194195
case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
195196
case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
196197
case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
198+
case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
197199
case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
198200
case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
199201
case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
200202
case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
203+
case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
201204
return 1;
202205
}
203206
return 0;
@@ -237,7 +240,7 @@ static inline int ndev_ignore_unsafe(struct intel_ntb_dev *ndev,
237240

238241
static int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx)
239242
{
240-
if (idx < 0 || idx > ndev->mw_count)
243+
if (idx < 0 || idx >= ndev->mw_count)
241244
return -EINVAL;
242245
return ndev->reg->mw_bar[idx];
243246
}
@@ -572,10 +575,13 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
572575
"Connection Topology -\t%s\n",
573576
ntb_topo_string(ndev->ntb.topo));
574577

575-
off += scnprintf(buf + off, buf_size - off,
576-
"B2B Offset -\t\t%#lx\n", ndev->b2b_off);
577-
off += scnprintf(buf + off, buf_size - off,
578-
"B2B MW Idx -\t\t%d\n", ndev->b2b_idx);
578+
if (ndev->b2b_idx != UINT_MAX) {
579+
off += scnprintf(buf + off, buf_size - off,
580+
"B2B MW Idx -\t\t%u\n", ndev->b2b_idx);
581+
off += scnprintf(buf + off, buf_size - off,
582+
"B2B Offset -\t\t%#lx\n", ndev->b2b_off);
583+
}
584+
579585
off += scnprintf(buf + off, buf_size - off,
580586
"BAR4 Split -\t\t%s\n",
581587
ndev->bar4_split ? "yes" : "no");
@@ -1484,7 +1490,7 @@ static int xeon_setup_b2b_mw(struct intel_ntb_dev *ndev,
14841490
pdev = ndev_pdev(ndev);
14851491
mmio = ndev->self_mmio;
14861492

1487-
if (ndev->b2b_idx >= ndev->mw_count) {
1493+
if (ndev->b2b_idx == UINT_MAX) {
14881494
dev_dbg(ndev_dev(ndev), "not using b2b mw\n");
14891495
b2b_bar = 0;
14901496
ndev->b2b_off = 0;
@@ -1776,6 +1782,13 @@ static int xeon_init_ntb(struct intel_ntb_dev *ndev)
17761782
else
17771783
ndev->b2b_idx = b2b_mw_idx;
17781784

1785+
if (ndev->b2b_idx >= ndev->mw_count) {
1786+
dev_dbg(ndev_dev(ndev),
1787+
"b2b_mw_idx %d invalid for mw_count %u\n",
1788+
b2b_mw_idx, ndev->mw_count);
1789+
return -EINVAL;
1790+
}
1791+
17791792
dev_dbg(ndev_dev(ndev),
17801793
"setting up b2b mw idx %d means %d\n",
17811794
b2b_mw_idx, ndev->b2b_idx);
@@ -1843,6 +1856,9 @@ static int xeon_init_dev(struct intel_ntb_dev *ndev)
18431856
case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
18441857
case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
18451858
case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
1859+
case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
1860+
case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
1861+
case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
18461862
ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
18471863
break;
18481864
}
@@ -1857,6 +1873,9 @@ static int xeon_init_dev(struct intel_ntb_dev *ndev)
18571873
case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
18581874
case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
18591875
case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
1876+
case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
1877+
case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
1878+
case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
18601879
ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
18611880
break;
18621881
}
@@ -1878,6 +1897,9 @@ static int xeon_init_dev(struct intel_ntb_dev *ndev)
18781897
case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
18791898
case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
18801899
case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
1900+
case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
1901+
case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
1902+
case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
18811903
ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
18821904
break;
18831905
}
@@ -1996,7 +2018,7 @@ static inline void ndev_init_struct(struct intel_ntb_dev *ndev,
19962018
ndev->ntb.ops = &intel_ntb_ops;
19972019

19982020
ndev->b2b_off = 0;
1999-
ndev->b2b_idx = INT_MAX;
2021+
ndev->b2b_idx = UINT_MAX;
20002022

20012023
ndev->bar4_split = 0;
20022024

@@ -2234,14 +2256,17 @@ static const struct pci_device_id intel_ntb_pci_tbl[] = {
22342256
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_SNB)},
22352257
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_IVT)},
22362258
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_HSX)},
2259+
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_BDX)},
22372260
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_JSF)},
22382261
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_SNB)},
22392262
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_IVT)},
22402263
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_HSX)},
2264+
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_BDX)},
22412265
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_JSF)},
22422266
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_SNB)},
22432267
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_IVT)},
22442268
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_HSX)},
2269+
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_BDX)},
22452270
{0}
22462271
};
22472272
MODULE_DEVICE_TABLE(pci, intel_ntb_pci_tbl);

drivers/ntb/hw/intel/ntb_hw_intel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
#define PCI_DEVICE_ID_INTEL_NTB_PS_HSX 0x2F0E
6868
#define PCI_DEVICE_ID_INTEL_NTB_SS_HSX 0x2F0F
6969
#define PCI_DEVICE_ID_INTEL_NTB_B2B_BWD 0x0C4E
70+
#define PCI_DEVICE_ID_INTEL_NTB_B2B_BDX 0x6F0D
71+
#define PCI_DEVICE_ID_INTEL_NTB_PS_BDX 0x6F0E
72+
#define PCI_DEVICE_ID_INTEL_NTB_SS_BDX 0x6F0F
7073

7174
/* Intel Xeon hardware */
7275

0 commit comments

Comments
 (0)