Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a56a1fe authored by Tejun Heo's avatar Tejun Heo Committed by David S. Miller
Browse files

net: wrap sock->sk_cgrp_prioidx and ->sk_classid inside a struct



Introduce sock->sk_cgrp_data which is a struct sock_cgroup_data.
->sk_cgroup_prioidx and ->sk_classid are moved into it.  The struct
and its accessors are defined in cgroup-defs.h.  This is to prepare
for overloading the fields with a cgroup pointer.

This patch mostly performs equivalent conversions but the followings
are noteworthy.

* Equality test before updating classid is removed from
  sock_update_classid().  This shouldn't make any noticeable
  difference and a similar test will be implemented on the helper side
  later.

* sock_update_netprioidx() now takes struct sock_cgroup_data and can
  be moved to netprio_cgroup.h without causing include dependency
  loop.  Moved.

* The dummy version of sock_update_netprioidx() converted to a static
  inline function while at it.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 297dbde1
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -542,4 +542,40 @@ static inline void cgroup_threadgroup_change_end(struct task_struct *tsk) {}

#endif	/* CONFIG_CGROUPS */

#ifdef CONFIG_SOCK_CGROUP_DATA

struct sock_cgroup_data {
	u16	prioidx;
	u32	classid;
};

static inline u16 sock_cgroup_prioidx(struct sock_cgroup_data *skcd)
{
	return skcd->prioidx;
}

static inline u32 sock_cgroup_classid(struct sock_cgroup_data *skcd)
{
	return skcd->classid;
}

static inline void sock_cgroup_set_prioidx(struct sock_cgroup_data *skcd,
					   u16 prioidx)
{
	skcd->prioidx = prioidx;
}

static inline void sock_cgroup_set_classid(struct sock_cgroup_data *skcd,
					   u32 classid)
{
	skcd->classid = classid;
}

#else	/* CONFIG_SOCK_CGROUP_DATA */

struct sock_cgroup_data {
};

#endif	/* CONFIG_SOCK_CGROUP_DATA */

#endif	/* _LINUX_CGROUP_DEFS_H */
+5 −6
Original line number Diff line number Diff line
@@ -41,13 +41,12 @@ static inline u32 task_cls_classid(struct task_struct *p)
	return classid;
}

static inline void sock_update_classid(struct sock *sk)
static inline void sock_update_classid(struct sock_cgroup_data *skcd)
{
	u32 classid;

	classid = task_cls_classid(current);
	if (classid != sk->sk_classid)
		sk->sk_classid = classid;
	sock_cgroup_set_classid(skcd, classid);
}

static inline u32 task_get_classid(const struct sk_buff *skb)
@@ -64,17 +63,17 @@ static inline u32 task_get_classid(const struct sk_buff *skb)
	 * softirqs always disables bh.
	 */
	if (in_serving_softirq()) {
		/* If there is an sk_classid we'll use that. */
		/* If there is an sock_cgroup_classid we'll use that. */
		if (!skb->sk)
			return 0;

		classid = skb->sk->sk_classid;
		classid = sock_cgroup_classid(&skb->sk->sk_cgrp_data);
	}

	return classid;
}
#else /* !CONFIG_CGROUP_NET_CLASSID */
static inline void sock_update_classid(struct sock *sk)
static inline void sock_update_classid(struct sock_cgroup_data *skcd)
{
}

+13 −3
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ struct netprio_map {
	u32 priomap[];
};

void sock_update_netprioidx(struct sock *sk);

static inline u32 task_netprioidx(struct task_struct *p)
{
	struct cgroup_subsys_state *css;
@@ -38,13 +36,25 @@ static inline u32 task_netprioidx(struct task_struct *p)
	rcu_read_unlock();
	return idx;
}

static inline void sock_update_netprioidx(struct sock_cgroup_data *skcd)
{
	if (in_interrupt())
		return;

	sock_cgroup_set_prioidx(skcd, task_netprioidx(current));
}

#else /* !CONFIG_CGROUP_NET_PRIO */

static inline u32 task_netprioidx(struct task_struct *p)
{
	return 0;
}

#define sock_update_netprioidx(sk)
static inline void sock_update_netprioidx(struct sock_cgroup_data *skcd)
{
}

#endif /* CONFIG_CGROUP_NET_PRIO */
#endif  /* _NET_CLS_CGROUP_H */
+3 −8
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@
#include <linux/static_key.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/cgroup-defs.h>

#include <linux/filter.h>
#include <linux/rculist_nulls.h>
@@ -308,8 +309,7 @@ struct cg_proto;
  *	@sk_send_head: front of stuff to transmit
  *	@sk_security: used by security modules
  *	@sk_mark: generic packet mark
  *	@sk_cgrp_prioidx: socket group's priority map index
  *	@sk_classid: this socket's cgroup classid
  *	@sk_cgrp_data: cgroup data for this cgroup
  *	@sk_cgrp: this socket's cgroup-specific proto data
  *	@sk_write_pending: a write to stream socket waits to start
  *	@sk_state_change: callback to indicate change in the state of the sock
@@ -443,12 +443,7 @@ struct sock {
#ifdef CONFIG_SECURITY
	void			*sk_security;
#endif
#if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)
	u16			sk_cgrp_prioidx;
#endif
#ifdef CONFIG_CGROUP_NET_CLASSID
	u32			sk_classid;
#endif
	struct sock_cgroup_data	sk_cgrp_data;
	struct cg_proto		*sk_cgrp;
	void			(*sk_state_change)(struct sock *sk);
	void			(*sk_data_ready)(struct sock *sk);
+6 −0
Original line number Diff line number Diff line
@@ -250,9 +250,14 @@ config XPS
	depends on SMP
	default y

config SOCK_CGROUP_DATA
	bool
	default n

config CGROUP_NET_PRIO
	bool "Network priority cgroup"
	depends on CGROUPS
	select SOCK_CGROUP_DATA
	---help---
	  Cgroup subsystem for use in assigning processes to network priorities on
	  a per-interface basis.
@@ -260,6 +265,7 @@ config CGROUP_NET_PRIO
config CGROUP_NET_CLASSID
	bool "Network classid cgroup"
	depends on CGROUPS
	select SOCK_CGROUP_DATA
	---help---
	  Cgroup subsystem for use as general purpose socket classid marker that is
	  being used in cls_cgroup and for netfilter matching.
Loading