On Thu, 9 Jan 2025 17:43:59 +0800 Jiayuan Chen wrote: > However, for programs where both stream_parser and stream_verdict are > active(strparser purpose), tcp_read_sock() was used instead of > tcp_read_skb() (sk_data_ready->strp_data_ready->tcp_read_sock) > tcp_read_sock() now still update 'sk->copied_seq', leading to duplicated > updates. To state the obvious feels like the abstraction between TCP and psock has broken down pretty severely at this stage. You're modifying TCP and straight up calling TCP functions from skmsg.c :( > +int tcp_read_sock_noack(struct sock *sk, read_descriptor_t *desc, > + sk_read_actor_t recv_actor, u32 noack, > + u32 *copied_seq) > +{ > + return __tcp_read_sock(sk, desc, recv_actor, > + noack, copied_seq); > +} > +EXPORT_SYMBOL(tcp_read_sock_noack); Pretty sure you don't have to export this. skmsg can't be a module.