Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21d46e11 authored by Arun Kumar Neelakantam's avatar Arun Kumar Neelakantam Committed by Gerrit - the friendly Code Review server
Browse files

net: qrtr: Use skb with fragments in memory failure case



In system with fragmented memory allocation of bigger RX buffers
are failed and results in packet drop issue.

In failure cases use skb allocations with fragmented pages to avoid
packet drops and serve the use case.

CRs-Fixed: 2455559
Change-Id: Iac507bfa9b17ae0278e8cddafdfa5ec87fd7f80c
Signed-off-by: default avatarArun Kumar Neelakantam <aneela@codeaurora.org>
parent cf8acfa8
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -674,6 +674,8 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
	struct sk_buff *skb;
	struct qrtr_cb *cb;
	unsigned int size;
	int err = -ENOMEM;
	int frag = false;
	unsigned int ver;
	size_t hdrlen;

@@ -681,8 +683,14 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
		return -EINVAL;

	skb = netdev_alloc_skb(NULL, len);
	if (!skb)
	if (!skb) {
		skb = alloc_skb_with_frags(0, len, 0, &err, GFP_ATOMIC);
		if (!skb) {
			pr_err("%s memory allocation failed\n", __func__);
			return -ENOMEM;
		}
		frag = true;
	}

	cb = (struct qrtr_cb *)skb->cb;

@@ -736,7 +744,13 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
	    cb->type != QRTR_TYPE_RESUME_TX)
		goto err;

	if (frag) {
		skb->data_len = size;
		skb->len = size;
		skb_store_bits(skb, 0, data + hdrlen, size);
	} else {
		skb_put_data(skb, data + hdrlen, size);
	}
	qrtr_log_rx_msg(node, skb);

	skb_queue_tail(&node->rx_queue, skb);
@@ -891,8 +905,11 @@ static void qrtr_node_rx_work(struct kthread_work *work)
			if (!ipc) {
				kfree_skb(skb);
			} else {
				if (sock_queue_rcv_skb(&ipc->sk, skb))
				if (sock_queue_rcv_skb(&ipc->sk, skb)) {
					pr_err("%s qrtr pkt dropped flow[%d]\n",
					       __func__, cb->confirm_rx);
					kfree_skb(skb);
				}

				qrtr_port_put(ipc);
			}