aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/usb
diff options
context:
space:
mode:
authorJim Baxter <jim_baxter@mentor.com>2017-06-28 16:35:29 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-03 04:50:49 -0400
commite1069bbfcf3bcf4feb264397f3451184fd66b907 (patch)
treeb21e0b7f48e82746789d258b916fd74c1811169d /include/linux/usb
parent2da95be940714f6e75054a81e6484f5349b66f5f (diff)
net: cdc_ncm: Reduce memory use when kernel memory low
The CDC-NCM driver can require large amounts of memory to create skb's and this can be a problem when the memory becomes fragmented. This especially affects embedded systems that have constrained resources but wish to maximise the throughput of CDC-NCM with 16KiB NTB's. The issue is after running for a while the kernel memory can become fragmented and it needs compacting. If the NTB allocation is needed before the memory has been compacted the atomic allocation can fail which can cause increased latency, large re-transmissions or disconnections depending upon the data being transmitted at the time. This situation occurs for less than a second until the kernel has compacted the memory but the failed devices can take a lot longer to recover from the failed TX packets. To ease this temporary situation I modified the CDC-NCM TX path to temporarily switch into a reduced memory mode which allocates an NTB that will fit into a USB_CDC_NCM_NTB_MIN_OUT_SIZE (default 2048 Bytes) sized memory block and only transmit NTB's with a single network frame until the memory situation is resolved. Each time this issue occurs we wait for an increasing number of reduced size allocations before requesting a full size one to not put additional pressure on a low memory system. Once the memory is compacted the CDC-NCM data can resume transmitting at the normal tx_max rate once again. Signed-off-by: Jim Baxter <jim_baxter@mentor.com> Reviewed-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/usb')
-rw-r--r--include/linux/usb/cdc_ncm.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h
index 00d232406f18..021f7a88f52c 100644
--- a/include/linux/usb/cdc_ncm.h
+++ b/include/linux/usb/cdc_ncm.h
@@ -117,6 +117,9 @@ struct cdc_ncm_ctx {
117 u32 tx_curr_frame_num; 117 u32 tx_curr_frame_num;
118 u32 rx_max; 118 u32 rx_max;
119 u32 tx_max; 119 u32 tx_max;
120 u32 tx_curr_size;
121 u32 tx_low_mem_max_cnt;
122 u32 tx_low_mem_val;
120 u32 max_datagram_size; 123 u32 max_datagram_size;
121 u16 tx_max_datagrams; 124 u16 tx_max_datagrams;
122 u16 tx_remainder; 125 u16 tx_remainder;