Commit e7ed2ba7 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

net: protect NAPI config fields with netdev_lock()



Protect the following members of netdev and napi by netdev_lock:
 - defer_hard_irqs,
 - gro_flush_timeout,
 - irq_suspend_timeout.

The first two are written via sysfs (which this patch switches
to new lock), and netdev genl which holds both netdev and rtnl locks.

irq_suspend_timeout is only written by netdev genl.

Reviewed-by: default avatarJoe Damato <jdamato@fastly.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115035319.559603-11-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 53ed3080
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -384,11 +384,11 @@ struct napi_struct {
	int			rx_count; /* length of rx_list */
	unsigned int		napi_id; /* protected by netdev_lock */
	struct hrtimer		timer;
	struct task_struct	*thread; /* protected by netdev_lock */
	/* all fields past this point are write-protected by netdev_lock */
	struct task_struct	*thread;
	unsigned long		gro_flush_timeout;
	unsigned long		irq_suspend_timeout;
	u32			defer_hard_irqs;
	/* all fields past this point are write-protected by netdev_lock */
	/* control-path-only fields follow */
	struct list_head	dev_list;
	struct hlist_node	napi_hash_node;
@@ -2452,7 +2452,8 @@ struct net_device {
	 * Drivers are free to use it for other protection.
	 *
	 * Protects:
	 *	@napi_list, @net_shaper_hierarchy, @reg_state, @threaded
	 *	@gro_flush_timeout, @napi_defer_hard_irqs, @napi_list,
	 *	@net_shaper_hierarchy, @reg_state, @threaded
	 *
	 * Partially protects (writers must hold both @lock and rtnl_lock):
	 *	@up
+3 −2
Original line number Diff line number Diff line
@@ -450,7 +450,7 @@ static ssize_t gro_flush_timeout_store(struct device *dev,
	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	return netdev_store(dev, attr, buf, len, change_gro_flush_timeout);
	return netdev_lock_store(dev, attr, buf, len, change_gro_flush_timeout);
}
NETDEVICE_SHOW_RW(gro_flush_timeout, fmt_ulong);

@@ -470,7 +470,8 @@ static ssize_t napi_defer_hard_irqs_store(struct device *dev,
	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	return netdev_store(dev, attr, buf, len, change_napi_defer_hard_irqs);
	return netdev_lock_store(dev, attr, buf, len,
				 change_napi_defer_hard_irqs);
}
NETDEVICE_SHOW_RW(napi_defer_hard_irqs, fmt_uint);