Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

proc: test /proc/thread-self symlink

Same story: I have WIP patch to make it faster, so better have a test
as well.

Link: http://lkml.kernel.org/r/20180627195209.GC18113@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alexey Dobriyan and committed by
Linus Torvalds
2cd36fb3 61d47c4e

+71
+1
tools/testing/selftests/proc/.gitignore
··· 10 10 /proc-uptime-002 11 11 /read 12 12 /self 13 + /thread-self
+1
tools/testing/selftests/proc/Makefile
··· 14 14 TEST_GEN_PROGS += proc-uptime-002 15 15 TEST_GEN_PROGS += read 16 16 TEST_GEN_PROGS += self 17 + TEST_GEN_PROGS += thread-self 17 18 18 19 include ../lib.mk
+5
tools/testing/selftests/proc/proc.h
··· 14 14 return syscall(SYS_getpid); 15 15 } 16 16 17 + static inline pid_t sys_gettid(void) 18 + { 19 + return syscall(SYS_gettid); 20 + } 21 + 17 22 static inline bool streq(const char *s1, const char *s2) 18 23 { 19 24 return strcmp(s1, s2) == 0;
+64
tools/testing/selftests/proc/thread-self.c
··· 1 + /* 2 + * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com> 3 + * 4 + * Permission to use, copy, modify, and distribute this software for any 5 + * purpose with or without fee is hereby granted, provided that the above 6 + * copyright notice and this permission notice appear in all copies. 7 + * 8 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 + */ 16 + // Test that /proc/thread-self gives correct TGID/PID. 17 + #undef NDEBUG 18 + #include <assert.h> 19 + #include <sched.h> 20 + #include <stdio.h> 21 + #include <unistd.h> 22 + #include <sys/mman.h> 23 + #include <sys/wait.h> 24 + 25 + #include "proc.h" 26 + 27 + int f(void *arg) 28 + { 29 + char buf1[64], buf2[64]; 30 + pid_t pid, tid; 31 + ssize_t rv; 32 + 33 + pid = sys_getpid(); 34 + tid = sys_gettid(); 35 + snprintf(buf1, sizeof(buf1), "%u/task/%u", pid, tid); 36 + 37 + rv = readlink("/proc/thread-self", buf2, sizeof(buf2)); 38 + assert(rv == strlen(buf1)); 39 + buf2[rv] = '\0'; 40 + assert(streq(buf1, buf2)); 41 + 42 + if (arg) 43 + exit(0); 44 + return 0; 45 + } 46 + 47 + int main(void) 48 + { 49 + const int PAGE_SIZE = sysconf(_SC_PAGESIZE); 50 + pid_t pid; 51 + void *stack; 52 + 53 + /* main thread */ 54 + f((void *)0); 55 + 56 + stack = mmap(NULL, 2 * PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 57 + assert(stack != MAP_FAILED); 58 + /* side thread */ 59 + pid = clone(f, stack + PAGE_SIZE, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM, (void *)1); 60 + assert(pid > 0); 61 + pause(); 62 + 63 + return 0; 64 + }