msm: ipa: do not use skb clones for lan clients

IPA driver uses 8k buffers for RX packets as those are aggregated.
If these packets deaggregated in IPA driver, cloned and provided
to clients, later calls to skb_copy() results in creating an 8k skb
which may lead to high memory utilization.
This change avoid the use of skb clones and allocates new skbs
for LAN clients and copy the packet content to it.

CRs-Fixed: 1050670
Change-Id: Iba47db8936b49309360791c1c6b482dcfcffd4d7
Acked by: Ady Abraham <adya@qti.qualcomm.com>
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
This commit is contained in:
Skylar Chang 2016-08-02 16:36:40 -07:00 committed by Gerrit - the friendly Code Review server
parent e94b446eac
commit e91a2cce99

View file

@ -40,6 +40,8 @@
IPA_GENERIC_RX_BUFF_BASE_SZ) -\
IPA_GENERIC_RX_BUFF_BASE_SZ)
#define IPA_RX_BUFF_CLIENT_HEADROOM 256
/* less 1 nominal MTU (1500 bytes) rounded to units of KB */
#define IPA_ADJUST_AGGR_BYTE_LIMIT(X) (((X) - IPA_MTU)/1000)
@ -2288,6 +2290,21 @@ static void ipa_cleanup_rx(struct ipa_sys_context *sys)
}
}
static struct sk_buff *ipa_skb_copy_for_client(struct sk_buff *skb, int len)
{
struct sk_buff *skb2 = NULL;
skb2 = __dev_alloc_skb(len + IPA_RX_BUFF_CLIENT_HEADROOM, GFP_KERNEL);
if (likely(skb2)) {
/* Set the data pointer */
skb_reserve(skb2, IPA_RX_BUFF_CLIENT_HEADROOM);
memcpy(skb2->data, skb->data, len);
skb2->len = len;
skb_set_tail_pointer(skb2, len);
}
return skb2;
}
static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb,
struct ipa_sys_context *sys)
@ -2484,7 +2501,8 @@ begin:
sys->drop_packet = true;
}
skb2 = skb_clone(skb, GFP_KERNEL);
skb2 = ipa_skb_copy_for_client(skb,
status->pkt_len + IPA_PKT_STATUS_SIZE);
if (likely(skb2)) {
if (skb->len < len + IPA_PKT_STATUS_SIZE) {
IPADBG("SPL skb len %d len %d\n",
@ -2527,7 +2545,7 @@ begin:
IPA_PKT_STATUS_SIZE);
}
} else {
IPAERR("fail to clone\n");
IPAERR("fail to alloc skb\n");
if (skb->len < len) {
sys->prev_skb = NULL;
sys->len_rem = len - skb->len +