mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 01:08:13 -04:00
bridge: use atomic ops to read/change p->flags in sysfs
Change net/bridge/br_sysfs_if.c to use atomic operations to read/change bits in p->flags. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Link: https://patch.msgid.link/20260611203453.3067462-2-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
96fbe161e4
commit
391932e249
@@ -44,40 +44,44 @@ const struct brport_attribute brport_attr_##_name = { \
|
||||
.store = _store, \
|
||||
};
|
||||
|
||||
#define BRPORT_ATTR_FLAG(_name, _mask) \
|
||||
#define BRPORT_ATTR_FLAG(_name, _bitnr) \
|
||||
static ssize_t show_##_name(struct net_bridge_port *p, char *buf) \
|
||||
{ \
|
||||
return sysfs_emit(buf, "%d\n", !!(p->flags & _mask)); \
|
||||
return sysfs_emit(buf, "%d\n", test_bit(_bitnr, &p->flags)); \
|
||||
} \
|
||||
static int store_##_name(struct net_bridge_port *p, unsigned long v) \
|
||||
{ \
|
||||
return store_flag(p, v, _mask); \
|
||||
return store_flag(p, v, _bitnr); \
|
||||
} \
|
||||
static BRPORT_ATTR(_name, 0644, \
|
||||
show_##_name, store_##_name)
|
||||
|
||||
static int store_flag(struct net_bridge_port *p, unsigned long v,
|
||||
unsigned long mask)
|
||||
unsigned long bitnr)
|
||||
{
|
||||
unsigned long oflags, flags = READ_ONCE(p->flags);
|
||||
struct netlink_ext_ack extack = {0};
|
||||
unsigned long flags = p->flags;
|
||||
int err;
|
||||
|
||||
oflags = flags;
|
||||
if (v)
|
||||
flags |= mask;
|
||||
__set_bit(bitnr, &flags);
|
||||
else
|
||||
flags &= ~mask;
|
||||
__clear_bit(bitnr, &flags);
|
||||
|
||||
if (flags != p->flags) {
|
||||
err = br_switchdev_set_port_flag(p, flags, mask, &extack);
|
||||
if (err) {
|
||||
netdev_err(p->dev, "%s\n", extack._msg);
|
||||
return err;
|
||||
}
|
||||
if (flags == oflags)
|
||||
return 0;
|
||||
|
||||
p->flags = flags;
|
||||
br_port_flags_change(p, mask);
|
||||
err = br_switchdev_set_port_flag(p, flags, BIT(bitnr), &extack);
|
||||
if (err) {
|
||||
netdev_err(p->dev, "%s\n", extack._msg);
|
||||
return err;
|
||||
}
|
||||
if (v)
|
||||
set_bit(bitnr, &p->flags);
|
||||
else
|
||||
clear_bit(bitnr, &p->flags);
|
||||
br_port_flags_change(p, BIT(bitnr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -247,17 +251,17 @@ static int store_backup_port(struct net_bridge_port *p, char *buf)
|
||||
}
|
||||
static BRPORT_ATTR_RAW(backup_port, 0644, show_backup_port, store_backup_port);
|
||||
|
||||
BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPIN_MODE);
|
||||
BRPORT_ATTR_FLAG(bpdu_guard, BR_BPDU_GUARD);
|
||||
BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLOCK);
|
||||
BRPORT_ATTR_FLAG(learning, BR_LEARNING);
|
||||
BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD);
|
||||
BRPORT_ATTR_FLAG(proxyarp, BR_PROXYARP);
|
||||
BRPORT_ATTR_FLAG(proxyarp_wifi, BR_PROXYARP_WIFI);
|
||||
BRPORT_ATTR_FLAG(multicast_flood, BR_MCAST_FLOOD);
|
||||
BRPORT_ATTR_FLAG(broadcast_flood, BR_BCAST_FLOOD);
|
||||
BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS);
|
||||
BRPORT_ATTR_FLAG(isolated, BR_ISOLATED);
|
||||
BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPIN_MODE_BIT);
|
||||
BRPORT_ATTR_FLAG(bpdu_guard, BR_BPDU_GUARD_BIT);
|
||||
BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLOCK_BIT);
|
||||
BRPORT_ATTR_FLAG(learning, BR_LEARNING_BIT);
|
||||
BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD_BIT);
|
||||
BRPORT_ATTR_FLAG(proxyarp, BR_PROXYARP_BIT);
|
||||
BRPORT_ATTR_FLAG(proxyarp_wifi, BR_PROXYARP_WIFI_BIT);
|
||||
BRPORT_ATTR_FLAG(multicast_flood, BR_MCAST_FLOOD_BIT);
|
||||
BRPORT_ATTR_FLAG(broadcast_flood, BR_BCAST_FLOOD_BIT);
|
||||
BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS_BIT);
|
||||
BRPORT_ATTR_FLAG(isolated, BR_ISOLATED_BIT);
|
||||
|
||||
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
||||
static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
|
||||
@@ -273,8 +277,8 @@ static int store_multicast_router(struct net_bridge_port *p,
|
||||
static BRPORT_ATTR(multicast_router, 0644, show_multicast_router,
|
||||
store_multicast_router);
|
||||
|
||||
BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
|
||||
BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST);
|
||||
BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE_BIT);
|
||||
BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST_BIT);
|
||||
#endif
|
||||
|
||||
static const struct brport_attribute *brport_attrs[] = {
|
||||
|
||||
Reference in New Issue
Block a user