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

Commit 5c298933 authored by Sean Tranchetti's avatar Sean Tranchetti Committed by Gerrit - the friendly Code Review server
Browse files

net: qualcomm: rmnet: Add new rmnet_perf ingress hook



rmnet_perf now can handle performing GRO of packets that have already
passed through RSB/RSC. Add a hook in rmnet_deliver_skb() to send the
packets down this path when the module is inserted.

Change-Id: I56f2de49dd8be11d2c2a9f0d7c1fb1086240042b
Signed-off-by: default avatarSean Tranchetti <stranche@codeaurora.org>
parent fff51c15
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -86,6 +86,11 @@ void rmnet_set_skb_proto(struct sk_buff *skb)
}
EXPORT_SYMBOL(rmnet_set_skb_proto);

/* Perf hook handler */
void (*rmnet_perf_skb_entry)(struct sk_buff *skb,
			     struct rmnet_port *port) __rcu __read_mostly;
EXPORT_SYMBOL(rmnet_perf_skb_entry);

/* Shs hook handler */
int (*rmnet_shs_skb_entry)(struct sk_buff *skb,
			   struct rmnet_port *port) __rcu __read_mostly;
@@ -101,6 +106,8 @@ EXPORT_SYMBOL(rmnet_shs_skb_entry_wq);
void
rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
{
	void (*rmnet_perf_ingress)(struct sk_buff *skb,
				   struct rmnet_port *port);
	int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port);
	struct rmnet_priv *priv = netdev_priv(skb->dev);

@@ -113,11 +120,21 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
	skb->pkt_type = PACKET_HOST;
	skb_set_mac_header(skb, 0);

	rcu_read_lock();
	rmnet_perf_ingress = rcu_dereference(rmnet_perf_skb_entry);
	if (rmnet_perf_ingress) {
		rmnet_perf_ingress(skb, port);
		rcu_read_unlock();
		return;
	}

	rmnet_shs_stamp = rcu_dereference(rmnet_shs_skb_entry);
	if (rmnet_shs_stamp) {
		rmnet_shs_stamp(skb, port);
		rcu_read_unlock();
		return;
	}
	rcu_read_unlock();

	if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) {
		if (!rmnet_check_skb_can_gro(skb) &&
@@ -158,12 +175,15 @@ rmnet_deliver_skb_wq(struct sk_buff *skb, struct rmnet_port *port,
	/* packets coming from work queue context due to packet flush timer
	 * must go through the special workqueue path in SHS driver
	 */
	rcu_read_lock();
	rmnet_shs_stamp = (!ctx) ? rcu_dereference(rmnet_shs_skb_entry) :
				   rcu_dereference(rmnet_shs_skb_entry_wq);
	if (rmnet_shs_stamp) {
		rmnet_shs_stamp(skb, port);
		rcu_read_unlock();
		return;
	}
	rcu_read_unlock();

	if (ctx == RMNET_NET_RX_CTX) {
		if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) {
@@ -282,6 +302,10 @@ int (*rmnet_perf_deag_entry)(struct sk_buff *skb,
			     struct rmnet_port *port) __rcu __read_mostly;
EXPORT_SYMBOL(rmnet_perf_deag_entry);

/* Notify perf at the end of SKB chain */
void (*rmnet_perf_chain_end)(void) __rcu __read_mostly;
EXPORT_SYMBOL(rmnet_perf_chain_end);

static void
rmnet_map_ingress_handler(struct sk_buff *skb,
			  struct rmnet_port *port)
@@ -289,6 +313,7 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
	struct sk_buff *skbn;
	int (*rmnet_perf_core_deaggregate)(struct sk_buff *skb,
					   struct rmnet_port *port);
	void (*rmnet_perf_opt_chain_end)(void);

	if (skb->dev->type == ARPHRD_ETHER) {
		if (pskb_expand_head(skb, ETH_HLEN, 0, GFP_KERNEL)) {
@@ -306,11 +331,14 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
	}

	/* Pass off handling to rmnet_perf module, if present */
	rcu_read_lock();
	rmnet_perf_core_deaggregate = rcu_dereference(rmnet_perf_deag_entry);
	if (rmnet_perf_core_deaggregate) {
		rmnet_perf_core_deaggregate(skb, port);
		rcu_read_unlock();
		return;
	}
	rcu_read_unlock();

	/* Deaggregation and freeing of HW originating
	 * buffers is done within here
@@ -330,6 +358,12 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
next_skb:
		skb = skb_frag;
	}

	rcu_read_lock();
	rmnet_perf_opt_chain_end = rcu_dereference(rmnet_perf_chain_end);
	if (rmnet_perf_opt_chain_end)
		rmnet_perf_opt_chain_end();
	rcu_read_unlock();
}

static int rmnet_map_egress_handler(struct sk_buff *skb,