Commit 5a685cd9 authored by Cong Wang's avatar Cong Wang Committed by Alexei Starovoitov
Browse files

skmsg: Get rid of struct sk_psock_parser



struct sk_psock_parser is embedded in sk_psock, it is
unnecessary as skb verdict also uses ->saved_data_ready.
We can simply fold these fields into sk_psock, and get rid
of ->enabled.

Signed-off-by: default avatarCong Wang <cong.wang@bytedance.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Acked-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
Link: https://lore.kernel.org/bpf/20210223184934.6054-3-xiyou.wangcong@gmail.com
parent 88759609
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -70,14 +70,6 @@ struct sk_psock_link {
	void				*link_raw;
};

struct sk_psock_parser {
#if IS_ENABLED(CONFIG_BPF_STREAM_PARSER)
	struct strparser		strp;
#endif
	bool				enabled;
	void (*saved_data_ready)(struct sock *sk);
};

struct sk_psock_work_state {
	struct sk_buff			*skb;
	u32				len;
@@ -92,7 +84,9 @@ struct sk_psock {
	u32				eval;
	struct sk_msg			*cork;
	struct sk_psock_progs		progs;
	struct sk_psock_parser		parser;
#if IS_ENABLED(CONFIG_BPF_STREAM_PARSER)
	struct strparser		strp;
#endif
	struct sk_buff_head		ingress_skb;
	struct list_head		ingress_msg;
	unsigned long			state;
@@ -102,6 +96,7 @@ struct sk_psock {
	void (*saved_unhash)(struct sock *sk);
	void (*saved_close)(struct sock *sk, long timeout);
	void (*saved_write_space)(struct sock *sk);
	void (*saved_data_ready)(struct sock *sk);
	struct proto			*sk_proto;
	struct sk_psock_work_state	work_state;
	struct work_struct		work;
@@ -418,8 +413,8 @@ static inline void sk_psock_put(struct sock *sk, struct sk_psock *psock)

static inline void sk_psock_data_ready(struct sock *sk, struct sk_psock *psock)
{
	if (psock->parser.enabled)
		psock->parser.saved_data_ready(sk);
	if (psock->saved_data_ready)
		psock->saved_data_ready(sk);
	else
		sk->sk_data_ready(sk);
}
@@ -458,6 +453,6 @@ static inline bool sk_psock_strp_enabled(struct sk_psock *psock)
{
	if (!psock)
		return false;
	return psock->parser.enabled;
	return !!psock->saved_data_ready;
}
#endif /* _LINUX_SKMSG_H */
+16 −37
Original line number Diff line number Diff line
@@ -907,17 +907,9 @@ static int sk_psock_strp_read_done(struct strparser *strp, int err)
	return err;
}

static struct sk_psock *sk_psock_from_strp(struct strparser *strp)
{
	struct sk_psock_parser *parser;

	parser = container_of(strp, struct sk_psock_parser, strp);
	return container_of(parser, struct sk_psock, parser);
}

static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb)
{
	struct sk_psock *psock = sk_psock_from_strp(strp);
	struct sk_psock *psock = container_of(strp, struct sk_psock, strp);
	struct bpf_prog *prog;
	int ret = skb->len;

@@ -941,10 +933,10 @@ static void sk_psock_strp_data_ready(struct sock *sk)
	psock = sk_psock(sk);
	if (likely(psock)) {
		if (tls_sw_has_ctx_rx(sk)) {
			psock->parser.saved_data_ready(sk);
			psock->saved_data_ready(sk);
		} else {
			write_lock_bh(&sk->sk_callback_lock);
			strp_data_ready(&psock->parser.strp);
			strp_data_ready(&psock->strp);
			write_unlock_bh(&sk->sk_callback_lock);
		}
	}
@@ -959,41 +951,34 @@ int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
		.parse_msg	= sk_psock_strp_parse,
	};

	psock->parser.enabled = false;
	return strp_init(&psock->parser.strp, sk, &cb);
	return strp_init(&psock->strp, sk, &cb);
}

void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
{
	struct sk_psock_parser *parser = &psock->parser;

	if (parser->enabled)
	if (psock->saved_data_ready)
		return;

	parser->saved_data_ready = sk->sk_data_ready;
	psock->saved_data_ready = sk->sk_data_ready;
	sk->sk_data_ready = sk_psock_strp_data_ready;
	sk->sk_write_space = sk_psock_write_space;
	parser->enabled = true;
}

void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
{
	struct sk_psock_parser *parser = &psock->parser;

	if (!parser->enabled)
	if (!psock->saved_data_ready)
		return;

	sk->sk_data_ready = parser->saved_data_ready;
	parser->saved_data_ready = NULL;
	strp_stop(&parser->strp);
	parser->enabled = false;
	sk->sk_data_ready = psock->saved_data_ready;
	psock->saved_data_ready = NULL;
	strp_stop(&psock->strp);
}

static void sk_psock_done_strp(struct sk_psock *psock)
{
	/* Parser has been stopped */
	if (psock->progs.skb_parser)
		strp_done(&psock->parser.strp);
		strp_done(&psock->strp);
}
#else
static void sk_psock_done_strp(struct sk_psock *psock)
@@ -1054,25 +1039,19 @@ static void sk_psock_verdict_data_ready(struct sock *sk)

void sk_psock_start_verdict(struct sock *sk, struct sk_psock *psock)
{
	struct sk_psock_parser *parser = &psock->parser;

	if (parser->enabled)
	if (psock->saved_data_ready)
		return;

	parser->saved_data_ready = sk->sk_data_ready;
	psock->saved_data_ready = sk->sk_data_ready;
	sk->sk_data_ready = sk_psock_verdict_data_ready;
	sk->sk_write_space = sk_psock_write_space;
	parser->enabled = true;
}

void sk_psock_stop_verdict(struct sock *sk, struct sk_psock *psock)
{
	struct sk_psock_parser *parser = &psock->parser;

	if (!parser->enabled)
	if (!psock->saved_data_ready)
		return;

	sk->sk_data_ready = parser->saved_data_ready;
	parser->saved_data_ready = NULL;
	parser->enabled = false;
	sk->sk_data_ready = psock->saved_data_ready;
	psock->saved_data_ready = NULL;
}
+4 −4
Original line number Diff line number Diff line
@@ -148,9 +148,9 @@ static void sock_map_del_link(struct sock *sk,
			struct bpf_map *map = link->map;
			struct bpf_stab *stab = container_of(map, struct bpf_stab,
							     map);
			if (psock->parser.enabled && stab->progs.skb_parser)
			if (psock->saved_data_ready && stab->progs.skb_parser)
				strp_stop = true;
			if (psock->parser.enabled && stab->progs.skb_verdict)
			if (psock->saved_data_ready && stab->progs.skb_verdict)
				verdict_stop = true;
			list_del(&link->list);
			sk_psock_free_link(link);
@@ -283,14 +283,14 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
		goto out_drop;

	write_lock_bh(&sk->sk_callback_lock);
	if (skb_parser && skb_verdict && !psock->parser.enabled) {
	if (skb_parser && skb_verdict && !psock->saved_data_ready) {
		ret = sk_psock_init_strp(sk, psock);
		if (ret)
			goto out_unlock_drop;
		psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
		psock_set_prog(&psock->progs.skb_parser, skb_parser);
		sk_psock_start_strp(sk, psock);
	} else if (!skb_parser && skb_verdict && !psock->parser.enabled) {
	} else if (!skb_parser && skb_verdict && !psock->saved_data_ready) {
		psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
		sk_psock_start_verdict(sk,psock);
	}