summaryrefslogtreecommitdiffstats
path: root/drivers/ntb
diff options
context:
space:
mode:
authorDave Jiang <dave.jiang@intel.com>2015-07-13 08:07:17 -0400
committerJon Mason <jdmason@kudzu.us>2015-09-07 15:17:08 -0400
commite74bfeedad08180b968d8613dcde141ffb0720c3 (patch)
tree989c37a03defc84cd2db4ed121bf633ebb074632 /drivers/ntb
parent5e9fd733fa34b491e7ac41c91aa42ba0a9d8ea10 (diff)
NTB: Add flow control to the ntb_netdev
Right now if we push the NTB really hard, we start dropping packets due to not able to process the packets fast enough. We need to st:qop the upper layer from flooding us when that happens. A timer is necessary in order to restart the queue once the resource has been processed on the receive side. Due to the way NTB is setup, the resources on the tx side are tied to the processing of the rx side and there's no async way to know when the rx side has released those resources. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb')
-rw-r--r--drivers/ntb/ntb_transport.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
index 1c6386d5f79c..0d851d684523 100644
--- a/drivers/ntb/ntb_transport.c
+++ b/drivers/ntb/ntb_transport.c
@@ -494,6 +494,12 @@ static ssize_t debugfs_read(struct file *filp, char __user *ubuf, size_t count,
494 "tx_index - \t%u\n", qp->tx_index); 494 "tx_index - \t%u\n", qp->tx_index);
495 out_offset += snprintf(buf + out_offset, out_count - out_offset, 495 out_offset += snprintf(buf + out_offset, out_count - out_offset,
496 "tx_max_entry - \t%u\n", qp->tx_max_entry); 496 "tx_max_entry - \t%u\n", qp->tx_max_entry);
497 out_offset += snprintf(buf + out_offset, out_count - out_offset,
498 "qp->remote_rx_info->entry - \t%u\n",
499 qp->remote_rx_info->entry);
500 out_offset += snprintf(buf + out_offset, out_count - out_offset,
501 "free tx - \t%u\n",
502 ntb_transport_tx_free_entry(qp));
497 503
498 out_offset += snprintf(buf + out_offset, out_count - out_offset, 504 out_offset += snprintf(buf + out_offset, out_count - out_offset,
499 "\nQP Link %s\n", 505 "\nQP Link %s\n",
@@ -535,6 +541,7 @@ static struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock,
535 } 541 }
536 entry = list_first_entry(list, struct ntb_queue_entry, entry); 542 entry = list_first_entry(list, struct ntb_queue_entry, entry);
537 list_del(&entry->entry); 543 list_del(&entry->entry);
544
538out: 545out:
539 spin_unlock_irqrestore(lock, flags); 546 spin_unlock_irqrestore(lock, flags);
540 547
@@ -1843,7 +1850,7 @@ int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,
1843 entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q); 1850 entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q);
1844 if (!entry) { 1851 if (!entry) {
1845 qp->tx_err_no_buf++; 1852 qp->tx_err_no_buf++;
1846 return -ENOMEM; 1853 return -EBUSY;
1847 } 1854 }
1848 1855
1849 entry->cb_data = cb; 1856 entry->cb_data = cb;
@@ -1969,6 +1976,15 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
1969} 1976}
1970EXPORT_SYMBOL_GPL(ntb_transport_max_size); 1977EXPORT_SYMBOL_GPL(ntb_transport_max_size);
1971 1978
1979unsigned int ntb_transport_tx_free_entry(struct ntb_transport_qp *qp)
1980{
1981 unsigned int head = qp->tx_index;
1982 unsigned int tail = qp->remote_rx_info->entry;
1983
1984 return tail > head ? tail - head : qp->tx_max_entry + tail - head;
1985}
1986EXPORT_SYMBOL_GPL(ntb_transport_tx_free_entry);
1987
1972static void ntb_transport_doorbell_callback(void *data, int vector) 1988static void ntb_transport_doorbell_callback(void *data, int vector)
1973{ 1989{
1974 struct ntb_transport_ctx *nt = data; 1990 struct ntb_transport_ctx *nt = data;