Commit 05b8f502 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents 34a07c5b 0a7de4a8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ struct rps_dev_flow_table {
 * meaning we use 32-6=26 bits for the hash.
 */
struct rps_sock_flow_table {
	struct rcu_head	rcu;
	u32		mask;

	u32		ents[] ____cacheline_aligned_in_smp;
+7 −4
Original line number Diff line number Diff line
@@ -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;
		}
	}
+3 −2
Original line number Diff line number Diff line
@@ -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[];
+5 −4
Original line number Diff line number Diff line
@@ -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;
+3 −3
Original line number Diff line number Diff line
@@ -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);
			}
		}