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

Commit 6a4fdbd9 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "net: qrtr: use alloc_skb_with_frags() in rx path"

parents dff88d98 33685bb2
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2015, Sony Mobile Communications Inc.
 * Copyright (c) 2013, 2018 The Linux Foundation. All rights reserved.
 * Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved.
 */
#include <linux/module.h>
#include <linux/netlink.h>
@@ -248,12 +248,15 @@ static void qrtr_node_release(struct qrtr_node *node)
 */
static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb)
{
	struct qrtr_ctrl_pkt *pkt = (struct qrtr_ctrl_pkt *)skb->data;
	u64 remote_node = le32_to_cpu(pkt->client.node);
	u32 remote_port = le32_to_cpu(pkt->client.port);
	struct qrtr_ctrl_pkt pkt = {0,};
	struct qrtr_tx_flow *flow;
	unsigned long key;
	u64 remote_node;
	u32 remote_port;

	skb_copy_bits(skb, 0, &pkt, sizeof(pkt));
	remote_node = le32_to_cpu(pkt.client.node);
	remote_port = le32_to_cpu(pkt.client.port);
	key = remote_node << 32 | remote_port;

	flow = radix_tree_lookup(&node->qrtr_tx_flow, key);
@@ -471,14 +474,16 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
	unsigned int size;
	unsigned int ver;
	size_t hdrlen;
	int errcode;

	if (len & 3)
		return -EINVAL;

	skb = netdev_alloc_skb(NULL, len);
	skb = alloc_skb_with_frags(sizeof(*v1), len, 0, &errcode, GFP_ATOMIC);
	if (!skb)
		return -ENOMEM;

	skb_reserve(skb, sizeof(*v1));
	cb = (struct qrtr_cb *)skb->cb;

	/* Version field in v1 is little endian, so this works for both cases */
@@ -528,7 +533,9 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
	    cb->type != QRTR_TYPE_RESUME_TX)
		goto err;

	skb_put_data(skb, data + hdrlen, size);
	skb->data_len = size;
	skb->len = size;
	skb_store_bits(skb, 0, data + hdrlen, size);

	qrtr_node_assign(node, cb->src_node);