From: Jakub Kicinski Date: Tue, 28 Oct 2025 01:05:01 +0000 (-0700) Subject: Merge branch 'sctp-avoid-redundant-initialisation-in-sctp_accept-and-sctp_do_peeloff' X-Git-Tag: v6.19-rc1~170^2~304 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c5a644d254d887a5ebc7544e0c2c41abd11b96a9;p=thirdparty%2Fkernel%2Flinux.git Merge branch 'sctp-avoid-redundant-initialisation-in-sctp_accept-and-sctp_do_peeloff' Kuniyuki Iwashima says: ==================== sctp: Avoid redundant initialisation in sctp_accept() and sctp_do_peeloff(). When sctp_accept() and sctp_do_peeloff() allocates a new socket, somehow sk_alloc() is used, and the new socket goes through full initialisation, but most of the fields are overwritten later. 1) sctp_accept() |- sctp_v[46]_create_accept_sk() | |- sk_alloc() | |- sock_init_data() | |- sctp_copy_sock() | `- newsk->sk_prot->init() / sctp_init_sock() | `- sctp_sock_migrate() `- sctp_copy_descendant(newsk, oldsk) sock_init_data() initialises struct sock, but many fields are overwritten by sctp_copy_sock(), which inherits fields of struct sock and inet_sock from the parent socket. sctp_init_sock() fully initialises struct sctp_sock, but later sctp_copy_descendant() inherits most fields from the parent's struct sctp_sock by memcpy(). 2) sctp_do_peeloff() |- sock_create() | | | ... | |- sk_alloc() | |- sock_init_data() | ... | `- newsk->sk_prot->init() / sctp_init_sock() | |- sctp_copy_sock() `- sctp_sock_migrate() `- sctp_copy_descendant(newsk, oldsk) sock_create() creates a brand new socket, but sctp_copy_sock() and sctp_sock_migrate() overwrite most of the fields. So, sk_alloc(), sock_init_data(), sctp_copy_sock(), and sctp_copy_descendant() can be replaced with a single function like sk_clone_lock(). This series does the conversion and removes TODO comment added by commit 4a997d49d92ad ("tcp: Save lock_sock() for memcg in inet_csk_accept()."). Tested accept() and SCTP_SOCKOPT_PEELOFF and both work properly. socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP) = 3 bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 listen(3, -1) = 0 getsockname(3, {sa_family=AF_INET, sin_port=htons(49460), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP) = 4 connect(4, {sa_family=AF_INET, sin_port=htons(49460), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 accept(3, NULL, NULL) = 5 ... socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP) = 3 bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 listen(3, -1) = 0 getsockname(3, {sa_family=AF_INET, sin_port=htons(48240), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP) = 4 connect(4, {sa_family=AF_INET, sin_port=htons(48240), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 getsockopt(3, SOL_SCTP, SCTP_SOCKOPT_PEELOFF, "*\0\0\0\5\0\0\0", [8]) = 5 v1: https://lore.kernel.org/20251021214422.1941691-1-kuniyu@google.com ==================== Link: https://patch.msgid.link/20251023231751.4168390-1-kuniyu@google.com Signed-off-by: Jakub Kicinski --- c5a644d254d887a5ebc7544e0c2c41abd11b96a9