Skip to content

Commit

Permalink
net: protect NAPI config fields with netdev_lock()
Browse files Browse the repository at this point in the history
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: Joe Damato <jdamato@fastly.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115035319.559603-11-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed Jan 16, 2025
1 parent 53ed308 commit e7ed2ba
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 5 deletions.
7 changes: 4 additions & 3 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions net/core/net-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);

Expand Down

0 comments on commit e7ed2ba

Please sign in to comment.