mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
Merge branch 'rps-misc-changes'
Eric Dumazet says: ==================== rps: misc changes Minor changes in rps: skb_flow_limit() is probably unused these days, and data-races are quite theoretical. ==================== Link: https://patch.msgid.link/20250407163602.170356-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
05b8f502f4
|
|
@ -57,9 +57,10 @@ struct rps_dev_flow_table {
|
|||
* meaning we use 32-6=26 bits for the hash.
|
||||
*/
|
||||
struct rps_sock_flow_table {
|
||||
u32 mask;
|
||||
struct rcu_head rcu;
|
||||
u32 mask;
|
||||
|
||||
u32 ents[] ____cacheline_aligned_in_smp;
|
||||
u32 ents[] ____cacheline_aligned_in_smp;
|
||||
};
|
||||
#define RPS_SOCK_FLOW_TABLE_SIZE(_num) (offsetof(struct rps_sock_flow_table, ents[_num]))
|
||||
|
||||
|
|
|
|||
|
|
@ -4953,7 +4953,8 @@ static void rps_trigger_softirq(void *data)
|
|||
struct softnet_data *sd = data;
|
||||
|
||||
____napi_schedule(sd, &sd->backlog);
|
||||
sd->received_rps++;
|
||||
/* Pairs with READ_ONCE() in softnet_seq_show() */
|
||||
WRITE_ONCE(sd->received_rps, sd->received_rps + 1);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_RPS */
|
||||
|
|
@ -5038,7 +5039,7 @@ static bool skb_flow_limit(struct sk_buff *skb, unsigned int qlen)
|
|||
rcu_read_lock();
|
||||
fl = rcu_dereference(sd->flow_limit);
|
||||
if (fl) {
|
||||
new_flow = skb_get_hash(skb) & (fl->num_buckets - 1);
|
||||
new_flow = hash_32(skb_get_hash(skb), fl->log_buckets);
|
||||
old_flow = fl->history[fl->history_head];
|
||||
fl->history[fl->history_head] = new_flow;
|
||||
|
||||
|
|
@ -5049,7 +5050,8 @@ static bool skb_flow_limit(struct sk_buff *skb, unsigned int qlen)
|
|||
fl->buckets[old_flow]--;
|
||||
|
||||
if (++fl->buckets[new_flow] > (FLOW_LIMIT_HISTORY >> 1)) {
|
||||
fl->count++;
|
||||
/* Pairs with READ_ONCE() in softnet_seq_show() */
|
||||
WRITE_ONCE(fl->count, fl->count + 1);
|
||||
rcu_read_unlock();
|
||||
return true;
|
||||
}
|
||||
|
|
@ -7522,7 +7524,8 @@ static __latent_entropy void net_rx_action(void)
|
|||
*/
|
||||
if (unlikely(budget <= 0 ||
|
||||
time_after_eq(jiffies, time_limit))) {
|
||||
sd->time_squeeze++;
|
||||
/* Pairs with READ_ONCE() in softnet_seq_show() */
|
||||
WRITE_ONCE(sd->time_squeeze, sd->time_squeeze + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,9 @@ struct cpumask;
|
|||
/* Random bits of netdevice that don't need to be exposed */
|
||||
#define FLOW_LIMIT_HISTORY (1 << 7) /* must be ^2 and !overflow buckets */
|
||||
struct sd_flow_limit {
|
||||
u64 count;
|
||||
unsigned int num_buckets;
|
||||
struct rcu_head rcu;
|
||||
unsigned int count;
|
||||
u8 log_buckets;
|
||||
unsigned int history_head;
|
||||
u16 history[FLOW_LIMIT_HISTORY];
|
||||
u8 buckets[];
|
||||
|
|
|
|||
|
|
@ -132,8 +132,9 @@ static int softnet_seq_show(struct seq_file *seq, void *v)
|
|||
|
||||
rcu_read_lock();
|
||||
fl = rcu_dereference(sd->flow_limit);
|
||||
/* Pairs with WRITE_ONCE() in skb_flow_limit() */
|
||||
if (fl)
|
||||
flow_limit_count = fl->count;
|
||||
flow_limit_count = READ_ONCE(fl->count);
|
||||
rcu_read_unlock();
|
||||
#endif
|
||||
|
||||
|
|
@ -144,11 +145,11 @@ static int softnet_seq_show(struct seq_file *seq, void *v)
|
|||
seq_printf(seq,
|
||||
"%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x "
|
||||
"%08x %08x\n",
|
||||
sd->processed, atomic_read(&sd->dropped),
|
||||
sd->time_squeeze, 0,
|
||||
READ_ONCE(sd->processed), atomic_read(&sd->dropped),
|
||||
READ_ONCE(sd->time_squeeze), 0,
|
||||
0, 0, 0, 0, /* was fastroute */
|
||||
0, /* was cpu_collision */
|
||||
sd->received_rps, flow_limit_count,
|
||||
READ_ONCE(sd->received_rps), flow_limit_count,
|
||||
input_qlen + process_qlen, (int)seq->index,
|
||||
input_qlen, process_qlen);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ static int rps_sock_flow_sysctl(const struct ctl_table *table, int write,
|
|||
if (orig_sock_table) {
|
||||
static_branch_dec(&rps_needed);
|
||||
static_branch_dec(&rfs_needed);
|
||||
kvfree_rcu_mightsleep(orig_sock_table);
|
||||
kvfree_rcu(orig_sock_table, rcu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -239,7 +239,7 @@ static int flow_limit_cpu_sysctl(const struct ctl_table *table, int write,
|
|||
lockdep_is_held(&flow_limit_update_mutex));
|
||||
if (cur && !cpumask_test_cpu(i, mask)) {
|
||||
RCU_INIT_POINTER(sd->flow_limit, NULL);
|
||||
kfree_rcu_mightsleep(cur);
|
||||
kfree_rcu(cur, rcu);
|
||||
} else if (!cur && cpumask_test_cpu(i, mask)) {
|
||||
cur = kzalloc_node(len, GFP_KERNEL,
|
||||
cpu_to_node(i));
|
||||
|
|
@ -248,7 +248,7 @@ static int flow_limit_cpu_sysctl(const struct ctl_table *table, int write,
|
|||
ret = -ENOMEM;
|
||||
goto write_unlock;
|
||||
}
|
||||
cur->num_buckets = netdev_flow_limit_table_len;
|
||||
cur->log_buckets = ilog2(netdev_flow_limit_table_len);
|
||||
rcu_assign_pointer(sd->flow_limit, cur);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user