Skip to content

Commit 370ca71

Browse files
Paolo Abenikuba-moo
authored andcommitted
net-sysctl: factor-out rpm mask manipulation helpers
Will simplify the following patch. No functional change intended. Signed-off-by: Paolo Abeni <[email protected]> Reviewed-by: Simon Horman <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 135746c commit 370ca71

File tree

2 files changed

+44
-30
lines changed

2 files changed

+44
-30
lines changed

net/core/dev.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct net_device;
99
struct netdev_bpf;
1010
struct netdev_phys_item_id;
1111
struct netlink_ext_ack;
12+
struct cpumask;
1213

1314
/* Random bits of netdevice that don't need to be exposed */
1415
#define FLOW_LIMIT_HISTORY (1 << 7) /* must be ^2 and !overflow buckets */
@@ -134,4 +135,5 @@ static inline void netif_set_gro_ipv4_max_size(struct net_device *dev,
134135
WRITE_ONCE(dev->gro_ipv4_max_size, size);
135136
}
136137

138+
int rps_cpumask_housekeeping(struct cpumask *mask);
137139
#endif

net/core/net-sysfs.c

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -831,42 +831,18 @@ static ssize_t show_rps_map(struct netdev_rx_queue *queue, char *buf)
831831
return len < PAGE_SIZE ? len : -EINVAL;
832832
}
833833

834-
static ssize_t store_rps_map(struct netdev_rx_queue *queue,
835-
const char *buf, size_t len)
834+
static int netdev_rx_queue_set_rps_mask(struct netdev_rx_queue *queue,
835+
cpumask_var_t mask)
836836
{
837-
struct rps_map *old_map, *map;
838-
cpumask_var_t mask;
839-
int err, cpu, i;
840837
static DEFINE_MUTEX(rps_map_mutex);
841-
842-
if (!capable(CAP_NET_ADMIN))
843-
return -EPERM;
844-
845-
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
846-
return -ENOMEM;
847-
848-
err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
849-
if (err) {
850-
free_cpumask_var(mask);
851-
return err;
852-
}
853-
854-
if (!cpumask_empty(mask)) {
855-
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_DOMAIN));
856-
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_WQ));
857-
if (cpumask_empty(mask)) {
858-
free_cpumask_var(mask);
859-
return -EINVAL;
860-
}
861-
}
838+
struct rps_map *old_map, *map;
839+
int cpu, i;
862840

863841
map = kzalloc(max_t(unsigned int,
864842
RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
865843
GFP_KERNEL);
866-
if (!map) {
867-
free_cpumask_var(mask);
844+
if (!map)
868845
return -ENOMEM;
869-
}
870846

871847
i = 0;
872848
for_each_cpu_and(cpu, mask, cpu_online_mask)
@@ -893,9 +869,45 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue,
893869

894870
if (old_map)
895871
kfree_rcu(old_map, rcu);
872+
return 0;
873+
}
896874

875+
int rps_cpumask_housekeeping(struct cpumask *mask)
876+
{
877+
if (!cpumask_empty(mask)) {
878+
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_DOMAIN));
879+
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_WQ));
880+
if (cpumask_empty(mask))
881+
return -EINVAL;
882+
}
883+
return 0;
884+
}
885+
886+
static ssize_t store_rps_map(struct netdev_rx_queue *queue,
887+
const char *buf, size_t len)
888+
{
889+
cpumask_var_t mask;
890+
int err;
891+
892+
if (!capable(CAP_NET_ADMIN))
893+
return -EPERM;
894+
895+
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
896+
return -ENOMEM;
897+
898+
err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
899+
if (err)
900+
goto out;
901+
902+
err = rps_cpumask_housekeeping(mask);
903+
if (err)
904+
goto out;
905+
906+
err = netdev_rx_queue_set_rps_mask(queue, mask);
907+
908+
out:
897909
free_cpumask_var(mask);
898-
return len;
910+
return err ? : len;
899911
}
900912

901913
static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,

0 commit comments

Comments
 (0)