rmnet_core: APS hooks

Add APS pre-queue and post-queue hooks.

Change-Id: I22be34c2a6bad4119e74ab8146d80eb6439fc585
Signed-off-by: Weiyi Chen <quic_weiyic@quicinc.com>
这个提交包含在:
Weiyi Chen
2022-04-18 14:13:32 -07:00
提交者 Gerrit - the friendly Code Review server
父节点 ca0f1abee9
当前提交 7e90328aee
修改 2 个文件,包含 25 行新增9 行删除

查看文件

@@ -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 {

查看文件

@@ -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;
}