netxen: limit skb frags for non tso packet

Machines are getting deadlock in four node cluster environment.
All nodes are accessing (find /gfs2 -depth -print|cpio -ocv > /dev/null)
200 GB storage on a GFS2 filesystem.
This result in memory fragmentation and driver receives 18 frags for
1448 byte packets.
For non tso packet, fw drops the tx request, if it has >14 frags.

Fixing it by pulling extra frags.

Cc: stable@kernel.org
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

amit salecha and committed by
David S. Miller
c968bdf6 77c8e2c0

+19 -2
+2 -2
drivers/net/netxen/netxen_nic.h
··· 174 174 175 175 #define MAX_NUM_CARDS 4 176 176 177 - #define MAX_BUFFERS_PER_CMD 32 177 + #define NETXEN_MAX_FRAGS_PER_TX 14 178 178 #define MAX_TSO_HEADER_DESC 2 179 179 #define MGMT_CMD_DESC_RESV 4 180 180 #define TX_STOP_THRESH ((MAX_SKB_FRAGS >> 2) + MAX_TSO_HEADER_DESC \ ··· 558 558 */ 559 559 struct netxen_cmd_buffer { 560 560 struct sk_buff *skb; 561 - struct netxen_skb_frag frag_array[MAX_BUFFERS_PER_CMD + 1]; 561 + struct netxen_skb_frag frag_array[MAX_SKB_FRAGS + 1]; 562 562 u32 frag_count; 563 563 }; 564 564
+17
drivers/net/netxen/netxen_nic_main.c
··· 1844 1844 struct cmd_desc_type0 *hwdesc, *first_desc; 1845 1845 struct pci_dev *pdev; 1846 1846 int i, k; 1847 + int delta = 0; 1848 + struct skb_frag_struct *frag; 1847 1849 1848 1850 u32 producer; 1849 1851 int frag_count, no_of_desc; ··· 1853 1851 1854 1852 frag_count = skb_shinfo(skb)->nr_frags + 1; 1855 1853 1854 + /* 14 frags supported for normal packet and 1855 + * 32 frags supported for TSO packet 1856 + */ 1857 + if (!skb_is_gso(skb) && frag_count > NETXEN_MAX_FRAGS_PER_TX) { 1858 + 1859 + for (i = 0; i < (frag_count - NETXEN_MAX_FRAGS_PER_TX); i++) { 1860 + frag = &skb_shinfo(skb)->frags[i]; 1861 + delta += frag->size; 1862 + } 1863 + 1864 + if (!__pskb_pull_tail(skb, delta)) 1865 + goto drop_packet; 1866 + 1867 + frag_count = 1 + skb_shinfo(skb)->nr_frags; 1868 + } 1856 1869 /* 4 fragments per cmd des */ 1857 1870 no_of_desc = (frag_count + 3) >> 2; 1858 1871