net-sysctl: factor-out rpm mask manipulation helpers
Will simplify the following patch. No functional change intended. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Simon Horman <simon.horman@corigine.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
135746c61f
commit
370ca718fd
|
@ -9,6 +9,7 @@ struct net_device;
|
|||
struct netdev_bpf;
|
||||
struct netdev_phys_item_id;
|
||||
struct netlink_ext_ack;
|
||||
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 */
|
||||
|
@ -134,4 +135,5 @@ static inline void netif_set_gro_ipv4_max_size(struct net_device *dev,
|
|||
WRITE_ONCE(dev->gro_ipv4_max_size, size);
|
||||
}
|
||||
|
||||
int rps_cpumask_housekeeping(struct cpumask *mask);
|
||||
#endif
|
||||
|
|
|
@ -831,42 +831,18 @@ static ssize_t show_rps_map(struct netdev_rx_queue *queue, char *buf)
|
|||
return len < PAGE_SIZE ? len : -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t store_rps_map(struct netdev_rx_queue *queue,
|
||||
const char *buf, size_t len)
|
||||
static int netdev_rx_queue_set_rps_mask(struct netdev_rx_queue *queue,
|
||||
cpumask_var_t mask)
|
||||
{
|
||||
struct rps_map *old_map, *map;
|
||||
cpumask_var_t mask;
|
||||
int err, cpu, i;
|
||||
static DEFINE_MUTEX(rps_map_mutex);
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
|
||||
if (err) {
|
||||
free_cpumask_var(mask);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!cpumask_empty(mask)) {
|
||||
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_DOMAIN));
|
||||
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_WQ));
|
||||
if (cpumask_empty(mask)) {
|
||||
free_cpumask_var(mask);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
struct rps_map *old_map, *map;
|
||||
int cpu, i;
|
||||
|
||||
map = kzalloc(max_t(unsigned int,
|
||||
RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
|
||||
GFP_KERNEL);
|
||||
if (!map) {
|
||||
free_cpumask_var(mask);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
for_each_cpu_and(cpu, mask, cpu_online_mask)
|
||||
|
@ -893,9 +869,45 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue,
|
|||
|
||||
if (old_map)
|
||||
kfree_rcu(old_map, rcu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rps_cpumask_housekeeping(struct cpumask *mask)
|
||||
{
|
||||
if (!cpumask_empty(mask)) {
|
||||
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_DOMAIN));
|
||||
cpumask_and(mask, mask, housekeeping_cpumask(HK_TYPE_WQ));
|
||||
if (cpumask_empty(mask))
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t store_rps_map(struct netdev_rx_queue *queue,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
cpumask_var_t mask;
|
||||
int err;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!alloc_cpumask_var(&mask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rps_cpumask_housekeeping(mask);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = netdev_rx_queue_set_rps_mask(queue, mask);
|
||||
|
||||
out:
|
||||
free_cpumask_var(mask);
|
||||
return len;
|
||||
return err ? : len;
|
||||
}
|
||||
|
||||
static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
|
||||
|
|
Loading…
Reference in New Issue