mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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:
committed by
Jakub Kicinski
parent
135746c61f
commit
370ca718fd
@@ -9,6 +9,7 @@ struct net_device;
|
|||||||
struct netdev_bpf;
|
struct netdev_bpf;
|
||||||
struct netdev_phys_item_id;
|
struct netdev_phys_item_id;
|
||||||
struct netlink_ext_ack;
|
struct netlink_ext_ack;
|
||||||
|
struct cpumask;
|
||||||
|
|
||||||
/* Random bits of netdevice that don't need to be exposed */
|
/* Random bits of netdevice that don't need to be exposed */
|
||||||
#define FLOW_LIMIT_HISTORY (1 << 7) /* must be ^2 and !overflow buckets */
|
#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);
|
WRITE_ONCE(dev->gro_ipv4_max_size, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rps_cpumask_housekeeping(struct cpumask *mask);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -831,42 +831,18 @@ static ssize_t show_rps_map(struct netdev_rx_queue *queue, char *buf)
|
|||||||
return len < PAGE_SIZE ? len : -EINVAL;
|
return len < PAGE_SIZE ? len : -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t store_rps_map(struct netdev_rx_queue *queue,
|
static int netdev_rx_queue_set_rps_mask(struct netdev_rx_queue *queue,
|
||||||
const char *buf, size_t len)
|
cpumask_var_t mask)
|
||||||
{
|
{
|
||||||
struct rps_map *old_map, *map;
|
|
||||||
cpumask_var_t mask;
|
|
||||||
int err, cpu, i;
|
|
||||||
static DEFINE_MUTEX(rps_map_mutex);
|
static DEFINE_MUTEX(rps_map_mutex);
|
||||||
|
struct rps_map *old_map, *map;
|
||||||
if (!capable(CAP_NET_ADMIN))
|
int cpu, i;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
map = kzalloc(max_t(unsigned int,
|
map = kzalloc(max_t(unsigned int,
|
||||||
RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
|
RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!map) {
|
if (!map)
|
||||||
free_cpumask_var(mask);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for_each_cpu_and(cpu, mask, cpu_online_mask)
|
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)
|
if (old_map)
|
||||||
kfree_rcu(old_map, rcu);
|
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);
|
free_cpumask_var(mask);
|
||||||
return len;
|
return err ? : len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
|
static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
|
||||||
|
Reference in New Issue
Block a user