]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scm: use masked_user_access_begin() in put_cmsg()
authorEric Dumazet <edumazet@google.com>
Thu, 25 Sep 2025 22:49:14 +0000 (22:49 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 30 Sep 2025 01:03:42 +0000 (18:03 -0700)
Use the greatest and latest uaccess construct to get an optimal code.

Before :

lea    (%r9,%rcx,1),%r10
movabs $<USER_PTR_MAX>,%r11
mov    $0xfffffff2,%eax
cmp    %rcx,%r10
jb     ffffffff81cdc312 <put_cmsg+0x152>
cmp    %r11,%r10
ja     ffffffff81cdc312 <put_cmsg+0x152>
stac
lfence
mov    %r9,(%rcx)

After:

movabs $<USER_PTR_MAX>,%r9
cmp    %r9,%rax
cmova  %r9,%rax
stac
mov    %rcx,(%rax)

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250925224914.3590290-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/scm.c

index 072d5742440adae36757592c102657a9a93391be..66eaee783e8be8ed650a1679a15d0a41309f9f0d 100644 (file)
@@ -273,7 +273,9 @@ int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data)
 
                check_object_size(data, cmlen - sizeof(*cm), true);
 
-               if (!user_write_access_begin(cm, cmlen))
+               if (can_do_masked_user_access())
+                       cm = masked_user_access_begin(cm);
+               else if (!user_write_access_begin(cm, cmlen))
                        goto efault;
 
                unsafe_put_user(cmlen, &cm->cmsg_len, efault_end);