![John Fastabend](/assets/img/avatar_default.png)
Instead of updating the sk_cgrp_prioidx struct field on every send this only updates the field when a task is moved via cgroup infrastructure. This allows sockets that may be used by a kernel worker thread to be managed. For example in the iscsi case today a user can put iscsid in a netprio cgroup and control traffic will be sent with the correct sk_cgrp_prioidx value set but as soon as data is sent the kernel worker thread isssues a send and sk_cgrp_prioidx is updated with the kernel worker threads value which is the default case. It seems more correct to only update the field when the user explicitly sets it via control group infrastructure. This allows the users to manage sockets that may be used with other threads. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
/*
|
|
* netprio_cgroup.h Control Group Priority set
|
|
*
|
|
*
|
|
* Authors: Neil Horman <nhorman@tuxdriver.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
*/
|
|
|
|
#ifndef _NETPRIO_CGROUP_H
|
|
#define _NETPRIO_CGROUP_H
|
|
#include <linux/cgroup.h>
|
|
#include <linux/hardirq.h>
|
|
#include <linux/rcupdate.h>
|
|
|
|
|
|
struct netprio_map {
|
|
struct rcu_head rcu;
|
|
u32 priomap_len;
|
|
u32 priomap[];
|
|
};
|
|
|
|
#ifdef CONFIG_CGROUPS
|
|
|
|
struct cgroup_netprio_state {
|
|
struct cgroup_subsys_state css;
|
|
u32 prioidx;
|
|
};
|
|
|
|
#ifndef CONFIG_NETPRIO_CGROUP
|
|
extern int net_prio_subsys_id;
|
|
#endif
|
|
|
|
extern void sock_update_netprioidx(struct sock *sk, struct task_struct *task);
|
|
|
|
#if IS_BUILTIN(CONFIG_NETPRIO_CGROUP)
|
|
|
|
static inline u32 task_netprioidx(struct task_struct *p)
|
|
{
|
|
struct cgroup_netprio_state *state;
|
|
u32 idx;
|
|
|
|
rcu_read_lock();
|
|
state = container_of(task_subsys_state(p, net_prio_subsys_id),
|
|
struct cgroup_netprio_state, css);
|
|
idx = state->prioidx;
|
|
rcu_read_unlock();
|
|
return idx;
|
|
}
|
|
|
|
#elif IS_MODULE(CONFIG_NETPRIO_CGROUP)
|
|
|
|
static inline u32 task_netprioidx(struct task_struct *p)
|
|
{
|
|
struct cgroup_netprio_state *state;
|
|
int subsys_id;
|
|
u32 idx = 0;
|
|
|
|
rcu_read_lock();
|
|
subsys_id = rcu_dereference_index_check(net_prio_subsys_id,
|
|
rcu_read_lock_held());
|
|
if (subsys_id >= 0) {
|
|
state = container_of(task_subsys_state(p, subsys_id),
|
|
struct cgroup_netprio_state, css);
|
|
idx = state->prioidx;
|
|
}
|
|
rcu_read_unlock();
|
|
return idx;
|
|
}
|
|
|
|
#else
|
|
|
|
static inline u32 task_netprioidx(struct task_struct *p)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_NETPRIO_CGROUP */
|
|
|
|
#else
|
|
#define sock_update_netprioidx(sk, task)
|
|
#endif
|
|
|
|
#endif /* _NET_CLS_CGROUP_H */
|