Эх сурвалжийг харах

rmnet_core: APS hooks

Add APS pre-queue and post-queue hooks.

Change-Id: I22be34c2a6bad4119e74ab8146d80eb6439fc585
Signed-off-by: Weiyi Chen <[email protected]>
Weiyi Chen 3 жил өмнө
parent
commit
7e90328aee
2 өөрчлөгдсөн 25 нэмэгдсэн , 9 устгасан
  1. 1 0
      core/rmnet_config.h
  2. 24 9
      core/rmnet_vnd.c

+ 1 - 0
core/rmnet_config.h

@@ -219,6 +219,7 @@ struct rmnet_priv {
 	struct gro_cells gro_cells;
 	struct rmnet_priv_stats stats;
 	void __rcu *qos_info;
+	char aps_cb[16];
 };
 
 enum rmnet_dl_marker_prio {

+ 24 - 9
core/rmnet_vnd.c

@@ -47,6 +47,16 @@ typedef void (*rmnet_perf_egress_hook1_t)(struct sk_buff *skb);
 rmnet_perf_egress_hook1_t rmnet_perf_egress_hook1 __rcu __read_mostly;
 EXPORT_SYMBOL(rmnet_perf_egress_hook1);
 
+typedef void (*rmnet_aps_pre_queue_t)(struct net_device *dev,
+				      struct sk_buff *skb);
+rmnet_aps_pre_queue_t rmnet_aps_pre_queue __read_mostly;
+EXPORT_SYMBOL(rmnet_aps_pre_queue);
+
+typedef int (*rmnet_aps_post_queue_t)(struct net_device *dev,
+				      struct sk_buff *skb);
+rmnet_aps_post_queue_t rmnet_aps_post_queue __read_mostly;
+EXPORT_SYMBOL(rmnet_aps_post_queue);
+
 /* RX/TX Fixup */
 
 void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len)
@@ -85,10 +95,20 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,
 	u32 mark;
 	unsigned int len;
 	rmnet_perf_tether_egress_hook_t rmnet_perf_tether_egress;
+	rmnet_aps_post_queue_t aps_post_queue;
 	bool low_latency = false;
 	bool need_to_drop = false;
 
 	priv = netdev_priv(dev);
+
+	aps_post_queue = rcu_dereference(rmnet_aps_post_queue);
+	if (aps_post_queue)
+		if (unlikely(aps_post_queue(dev, skb))) {
+			this_cpu_inc(priv->pcpu_stats->stats.tx_drops);
+			kfree_skb(skb);
+			return NETDEV_TX_OK;
+		}
+
 	if (priv->real_dev) {
 		ip_type = (ip_hdr(skb)->version == 4) ?
 					AF_INET : AF_INET6;
@@ -262,9 +282,6 @@ static void rmnet_get_stats64(struct net_device *dev,
 	s->tx_dropped = total_stats.tx_drops;
 }
 
-void (*rmnet_aps_set_prio)(struct net_device *dev, struct sk_buff *skb);
-EXPORT_SYMBOL(rmnet_aps_set_prio);
-
 static u16 rmnet_vnd_select_queue(struct net_device *dev,
 				  struct sk_buff *skb,
 				  struct net_device *sb_dev)
@@ -274,7 +291,7 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev,
 	int boost_trigger = 0;
 	int txq = 0;
 	rmnet_perf_egress_hook1_t rmnet_perf_egress1;
-	void (*aps_set_prio)(struct net_device *dev, struct sk_buff *skb);
+	rmnet_aps_pre_queue_t aps_pre_queue;
 
 	rmnet_perf_egress1 = rcu_dereference(rmnet_perf_egress_hook1);
 	if (rmnet_perf_egress1) {
@@ -439,11 +456,9 @@ skip_trace:
 			(void) boost_period;
 	}
 
-	rcu_read_lock();
-	aps_set_prio = READ_ONCE(rmnet_aps_set_prio);
-	if (aps_set_prio)
-		aps_set_prio(dev, skb);
-	rcu_read_unlock();
+	aps_pre_queue = rcu_dereference(rmnet_aps_pre_queue);
+	if (aps_pre_queue)
+		aps_pre_queue(dev, skb);
 
 	return (txq < dev->real_num_tx_queues) ? txq : 0;
 }