USB: u_bam: Reduce number of interrupts in TX data path
Current RMNET driver will set IOC bit for every IP packet
sent to host which will cause performace degradation. Set
IOC bit for every certain number of IP packets for improving
performance in TX direction.
With standalone dataloopback test, increments in throughput numbers
are observed as follows(Mbps):
TCP uplink 29.7 53.3
TCP downlink 29.8 52.8
UDP uplink 16.7 25.9
UDP downlink 20.8 25.2
Change-Id: I42aa1fee16eb8a0dbb0921ff713a29ce9b3bef31
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
diff --git a/drivers/usb/gadget/u_bam.c b/drivers/usb/gadget/u_bam.c
index b12d74a..4f380df 100644
--- a/drivers/usb/gadget/u_bam.c
+++ b/drivers/usb/gadget/u_bam.c
@@ -34,6 +34,7 @@
static struct workqueue_struct *gbam_wq;
static int n_bam_ports;
static int n_bam2bam_ports;
+static unsigned n_tx_req_queued;
static unsigned bam_ch_ids[] = { 8 };
static const char *bam_ch_names[] = { "bam_dmux_ch_8" };
@@ -50,6 +51,8 @@
#define BAM_MUX_TX_Q_SIZE 200
#define BAM_MUX_RX_REQ_SIZE (2048 - BAM_MUX_HDR)
+#define DL_INTR_THRESHOLD 20
+
unsigned int bam_mux_tx_pkt_drop_thld = BAM_MUX_TX_PKT_DROP_THRESHOLD;
module_param(bam_mux_tx_pkt_drop_thld, uint, S_IRUGO | S_IWUSR);
@@ -71,6 +74,9 @@
unsigned int bam_mux_rx_req_size = BAM_MUX_RX_REQ_SIZE;
module_param(bam_mux_rx_req_size, uint, S_IRUGO | S_IWUSR);
+unsigned int dl_intr_threshold = DL_INTR_THRESHOLD;
+module_param(dl_intr_threshold, uint, S_IRUGO | S_IWUSR);
+
#define BAM_CH_OPENED BIT(0)
#define BAM_CH_READY BIT(1)
#define SPS_PARAMS_PIPE_ID_MASK (0x1F)
@@ -199,6 +205,13 @@
req->context = skb;
req->buf = skb->data;
req->length = skb->len;
+ n_tx_req_queued++;
+ if (n_tx_req_queued == dl_intr_threshold) {
+ req->no_interrupt = 0;
+ n_tx_req_queued = 0;
+ } else {
+ req->no_interrupt = 1;
+ }
list_del(&req->list);
@@ -1049,6 +1062,7 @@
spin_lock_irqsave(&port->port_lock_ul, flags);
spin_lock_irqsave(&port->port_lock_dl, flags);
port->port_usb = 0;
+ n_tx_req_queued = 0;
spin_unlock_irqrestore(&port->port_lock_dl, flags);
spin_unlock_irqrestore(&port->port_lock_ul, flags);