qlcnic: 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 Kumar Salecha and committed by David S. Miller 91a403ca 7c9f6472

+15
+1
drivers/net/qlcnic/qlcnic.h
··· 99 99 #define TX_UDPV6_PKT 0x0c 100 100 101 101 /* Tx defines */ 102 + #define QLCNIC_MAX_FRAGS_PER_TX 14 102 103 #define MAX_TSO_HEADER_DESC 2 103 104 #define MGMT_CMD_DESC_RESV 4 104 105 #define TX_STOP_THRESH ((MAX_SKB_FRAGS >> 2) + MAX_TSO_HEADER_DESC \
+14
drivers/net/qlcnic/qlcnic_main.c
··· 2099 2099 struct cmd_desc_type0 *hwdesc, *first_desc; 2100 2100 struct pci_dev *pdev; 2101 2101 struct ethhdr *phdr; 2102 + int delta = 0; 2102 2103 int i, k; 2103 2104 2104 2105 u32 producer; ··· 2119 2118 } 2120 2119 2121 2120 frag_count = skb_shinfo(skb)->nr_frags + 1; 2121 + /* 14 frags supported for normal packet and 2122 + * 32 frags supported for TSO packet 2123 + */ 2124 + if (!skb_is_gso(skb) && frag_count > QLCNIC_MAX_FRAGS_PER_TX) { 2125 + 2126 + for (i = 0; i < (frag_count - QLCNIC_MAX_FRAGS_PER_TX); i++) 2127 + delta += skb_shinfo(skb)->frags[i].size; 2128 + 2129 + if (!__pskb_pull_tail(skb, delta)) 2130 + goto drop_packet; 2131 + 2132 + frag_count = 1 + skb_shinfo(skb)->nr_frags; 2133 + } 2122 2134 2123 2135 /* 4 fragments per cmd des */ 2124 2136 no_of_desc = (frag_count + 3) >> 2;