net: add network priority cgroup infrastructure (v4)
This patch adds in the infrastructure code to create the network priority cgroup. The cgroup, in addition to the standard processes file creates two control files: 1) prioidx - This is a read-only file that exports the index of this cgroup. This is a value that is both arbitrary and unique to a cgroup in this subsystem, and is used to index the per-device priority map 2) priomap - This is a writeable file. On read it reports a table of 2-tuples <name:priority> where name is the name of a network interface and priority is indicates the priority assigned to frames egresessing on the named interface and originating from a pid in this cgroup This cgroup allows for skb priority to be set prior to a root qdisc getting selected. This is benenficial for DCB enabled systems, in that it allows for any application to use dcb configured priorities so without application modification Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: John Fastabend <john.r.fastabend@intel.com> CC: Robert Love <robert.w.love@intel.com> CC: "David S. Miller" <davem@davemloft.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
202ff1c26c
commit
5bc1421e34
@@ -125,6 +125,7 @@
|
||||
#include <net/xfrm.h>
|
||||
#include <linux/ipsec.h>
|
||||
#include <net/cls_cgroup.h>
|
||||
#include <net/netprio_cgroup.h>
|
||||
|
||||
#include <linux/filter.h>
|
||||
|
||||
@@ -221,10 +222,16 @@ __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX;
|
||||
int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512);
|
||||
EXPORT_SYMBOL(sysctl_optmem_max);
|
||||
|
||||
#if defined(CONFIG_CGROUPS) && !defined(CONFIG_NET_CLS_CGROUP)
|
||||
#if defined(CONFIG_CGROUPS)
|
||||
#if !defined(CONFIG_NET_CLS_CGROUP)
|
||||
int net_cls_subsys_id = -1;
|
||||
EXPORT_SYMBOL_GPL(net_cls_subsys_id);
|
||||
#endif
|
||||
#if !defined(CONFIG_NETPRIO_CGROUP)
|
||||
int net_prio_subsys_id = -1;
|
||||
EXPORT_SYMBOL_GPL(net_prio_subsys_id);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
|
||||
{
|
||||
@@ -1120,6 +1127,18 @@ void sock_update_classid(struct sock *sk)
|
||||
sk->sk_classid = classid;
|
||||
}
|
||||
EXPORT_SYMBOL(sock_update_classid);
|
||||
|
||||
void sock_update_netprioidx(struct sock *sk)
|
||||
{
|
||||
struct cgroup_netprio_state *state;
|
||||
if (in_interrupt())
|
||||
return;
|
||||
rcu_read_lock();
|
||||
state = task_netprio_state(current);
|
||||
sk->sk_cgrp_prioidx = state ? state->prioidx : 0;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sock_update_netprioidx);
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -1147,6 +1166,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
|
||||
atomic_set(&sk->sk_wmem_alloc, 1);
|
||||
|
||||
sock_update_classid(sk);
|
||||
sock_update_netprioidx(sk);
|
||||
}
|
||||
|
||||
return sk;
|
||||
|
Reference in New Issue
Block a user