From 24ebca698a7e5b7a3cd05edf9b16ed68eb1b5a2d Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Fri, 1 Aug 2025 11:26:58 -0700 Subject: [PATCH 1/6] [SYCL][Test] Fix mock calls in render-group test Enhance the mock library used in the render-group SYCL test to support both standard and large file variants (glob, glob64, open, open64, globfree, globfree64). When large file support is enabled in the build, the mock library now correctly provides the required *64 symbols. Additionally, if files are not /dev/dri/renderD* then fallback to the real library functions, preserving rest of the sycl-ls functionality. This improves reliability across different build configurations. --- sycl/test/tools/Inputs/mock_renderd_access.c | 108 +++++++++++++++---- 1 file changed, 87 insertions(+), 21 deletions(-) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index 86ddd475548d5..c03af69380af8 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -1,5 +1,7 @@ #define _GNU_SOURCE +#include +#include #include #include #include @@ -10,7 +12,22 @@ int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); if (mock_mode && strcmp(mock_mode, "exists") == 0) { - // Simulate that /dev/dri/renderD* exists + pglob->gl_pathc = 2; + pglob->gl_pathv = malloc(2 * sizeof(char *)); + pglob->gl_pathv[0] = strdup("/dev/dri/renderD128"); + pglob->gl_pathv[1] = strdup("/dev/dri/renderD129"); + return 0; + } + // Default behavior: no matches + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + return 0; +} + +int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), + glob64_t *pglob) { + const char *mock_mode = getenv("MOCK_GLOB_MODE"); + if (mock_mode && strcmp(mock_mode, "exists") == 0) { pglob->gl_pathc = 2; pglob->gl_pathv = malloc(2 * sizeof(char *)); pglob->gl_pathv[0] = strdup("/dev/dri/renderD128"); @@ -34,31 +51,80 @@ void globfree(glob_t *pglob) { } } -int open(const char *pathname, int flags, ...) { +void globfree64(glob64_t *pglob) { + if (pglob->gl_pathv) { + for (size_t i = 0; i < pglob->gl_pathc; ++i) { + free(pglob->gl_pathv[i]); + } + free(pglob->gl_pathv); + pglob->gl_pathv = NULL; + pglob->gl_pathc = 0; + } +} + +static int (*real_open)(const char *, int, ...) = NULL; +static int (*real_open64)(const char *, int, ...) = NULL; + +#define DUMMY_FD_128 128 +#define DUMMY_FD_129 129 + +int mock_open_helper(const char *pathname) { const char *mock_mode = getenv("MOCK_OPEN_MODE"); - if (strstr(pathname, "renderD12")) { - if (mock_mode && strcmp(mock_mode, "deny") == 0) { + assert(mock_mode != NULL && "MOCK_OPEN_MODE environment variable is not set"); + if (strcmp(mock_mode, "deny") == 0) { + errno = EACCES; + return -1; + } + + if (strstr(pathname, "renderD128")) + return DUMMY_FD_128; + + if (strstr(pathname, "renderD129")) { + if (mock_mode && strcmp(mock_mode, "deny_second") == 0) { errno = EACCES; return -1; } + return DUMMY_FD_129; + } + assert(0 && "Unexpected pathname in mock_open_helper"); +} - if (mock_mode && strcmp(mock_mode, "deny_second") == 0) { - // Simulate that the second file is not accessible - if (strstr(pathname, "renderD129")) { - errno = EACCES; - return -1; - } else { - return 3; - } - } +int open(const char *pathname, int flags, ...) { + if (strstr(pathname, "renderD12")) + return mock_open_helper(pathname); - if (mock_mode && strcmp(mock_mode, "allow") == 0) { - return 3; // Dummy fd - } - } - // Default: permission denied - errno = EACCES; - return -1; + // Call the real open function if not renderD12*. + va_list ap; + va_start(ap, flags); + mode_t mode = va_arg(ap, mode_t); + va_end(ap); + if (!real_open) + real_open = dlsym(RTLD_NEXT, "open"); + return real_open(pathname, flags, mode); +} + +int open64(const char *pathname, int flags, ...) { + if (strstr(pathname, "renderD12")) + return mock_open_helper(pathname); + + // Call the real open function if not renderD12*. + va_list ap; + va_start(ap, flags); + mode_t mode = va_arg(ap, mode_t); + va_end(ap); + if (!real_open64) + real_open64 = dlsym(RTLD_NEXT, "open64"); + return real_open64(pathname, flags, mode); } -int close(int fd) { return 0; } +static int (*real_close)(int) = NULL; + +int close(int fd) { + if (fd == DUMMY_FD_128 || fd == DUMMY_FD_129) { + // Mock close for our dummy file descriptors. + return 0; + } + + int (*real_close)(int) = dlsym(RTLD_NEXT, "close"); + return real_close(fd); +} From fe488686f55ec0bb9699d192b177fa63c2648c59 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Mon, 4 Aug 2025 11:11:13 -0700 Subject: [PATCH 2/6] Address review --- sycl/test/tools/Inputs/mock_renderd_access.c | 87 ++++++++++++++------ 1 file changed, 64 insertions(+), 23 deletions(-) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index c03af69380af8..d6fe286fc0bad 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -8,51 +8,78 @@ #include #include +const char *renderd128 = "/dev/dri/renderD128"; +const char *renderd129 = "/dev/dri/renderD129"; +const char *renderd = "/dev/dri/renderD*"; + int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); - if (mock_mode && strcmp(mock_mode, "exists") == 0) { + if (mock_mode && strcmp(mock_mode, "exists") == 0 && + strstr(pattern, renderd)) { pglob->gl_pathc = 2; pglob->gl_pathv = malloc(2 * sizeof(char *)); - pglob->gl_pathv[0] = strdup("/dev/dri/renderD128"); - pglob->gl_pathv[1] = strdup("/dev/dri/renderD129"); + pglob->gl_pathv[0] = strdup(renderd128); + pglob->gl_pathv[1] = strdup(renderd129); return 0; } - // Default behavior: no matches - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - return 0; + // Default behavior: call real glob64 + int (*real_glob)(const char *, int, int (*)(const char *, int), glob_t *); + real_glob = dlsym(RTLD_NEXT, "glob"); + if (!real_glob) { + errno = ENOSYS; + return -1; + } + return real_glob(pattern, flags, errfunc, pglob); } int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), glob64_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); - if (mock_mode && strcmp(mock_mode, "exists") == 0) { + if (mock_mode && strcmp(mock_mode, "exists") == 0 && + strstr(pattern, renderd)) { pglob->gl_pathc = 2; pglob->gl_pathv = malloc(2 * sizeof(char *)); pglob->gl_pathv[0] = strdup("/dev/dri/renderD128"); pglob->gl_pathv[1] = strdup("/dev/dri/renderD129"); return 0; } - // Default behavior: no matches - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - return 0; + // Default behavior: call real glob64 + int (*real_glob64)(const char *, int, int (*)(const char *, int), glob64_t *); + real_glob64 = dlsym(RTLD_NEXT, "glob64"); + if (!real_glob64) { + errno = ENOSYS; + return -1; + } + return real_glob64(pattern, flags, errfunc, pglob); } void globfree(glob_t *pglob) { - if (pglob->gl_pathv) { + if (pglob->gl_pathc == 2 && pglob->gl_pathv && + strcmp(pglob->gl_pathv[0], renderd128) == 0 && + strcmp(pglob->gl_pathv[1], renderd129) == 0) { for (size_t i = 0; i < pglob->gl_pathc; ++i) { free(pglob->gl_pathv[i]); } free(pglob->gl_pathv); pglob->gl_pathv = NULL; pglob->gl_pathc = 0; + return; } + // Default behavior: call real globfree + void (*real_globfree)(glob_t *); + real_globfree = dlsym(RTLD_NEXT, "globfree"); + if (!real_globfree) { + errno = ENOSYS; + return; + } + real_globfree(pglob); } void globfree64(glob64_t *pglob) { - if (pglob->gl_pathv) { + if (pglob->gl_pathc == 2 && pglob->gl_pathv && + strcmp(pglob->gl_pathv[0], renderd128) == 0 && + strcmp(pglob->gl_pathv[1], renderd129) == 0) { for (size_t i = 0; i < pglob->gl_pathc; ++i) { free(pglob->gl_pathv[i]); } @@ -60,11 +87,15 @@ void globfree64(glob64_t *pglob) { pglob->gl_pathv = NULL; pglob->gl_pathc = 0; } + void (*real_globfree64)(glob64_t *); + real_globfree64 = dlsym(RTLD_NEXT, "globfree64"); + if (!real_globfree64) { + errno = ENOSYS; + return; + } + real_globfree64(pglob); } -static int (*real_open)(const char *, int, ...) = NULL; -static int (*real_open64)(const char *, int, ...) = NULL; - #define DUMMY_FD_128 128 #define DUMMY_FD_129 129 @@ -98,8 +129,12 @@ int open(const char *pathname, int flags, ...) { va_start(ap, flags); mode_t mode = va_arg(ap, mode_t); va_end(ap); - if (!real_open) - real_open = dlsym(RTLD_NEXT, "open"); + int (*real_open)(const char *, int, ...); + real_open = dlsym(RTLD_NEXT, "open"); + if (!real_open) { + errno = ENOSYS; + return -1; + } return real_open(pathname, flags, mode); } @@ -112,13 +147,15 @@ int open64(const char *pathname, int flags, ...) { va_start(ap, flags); mode_t mode = va_arg(ap, mode_t); va_end(ap); - if (!real_open64) - real_open64 = dlsym(RTLD_NEXT, "open64"); + int (*real_open64)(const char *, int, ...); + real_open64 = dlsym(RTLD_NEXT, "open64"); + if (!real_open64) { + errno = ENOSYS; + return -1; + } return real_open64(pathname, flags, mode); } -static int (*real_close)(int) = NULL; - int close(int fd) { if (fd == DUMMY_FD_128 || fd == DUMMY_FD_129) { // Mock close for our dummy file descriptors. @@ -126,5 +163,9 @@ int close(int fd) { } int (*real_close)(int) = dlsym(RTLD_NEXT, "close"); + if (!real_close) { + errno = ENOSYS; + return -1; + } return real_close(fd); } From 93cfb1d0b680230d6c8f8df5c20a0cee64512631 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Mon, 4 Aug 2025 11:39:09 -0700 Subject: [PATCH 3/6] Handle notfound in glob --- sycl/test/tools/Inputs/mock_renderd_access.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index d6fe286fc0bad..fcd8835759016 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -15,6 +15,11 @@ const char *renderd = "/dev/dri/renderD*"; int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); + if (mock_mode && strcmp(mock_mode, "notfound") == 0) { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + return 0; + } if (mock_mode && strcmp(mock_mode, "exists") == 0 && strstr(pattern, renderd)) { pglob->gl_pathc = 2; @@ -36,6 +41,11 @@ int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), glob64_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); + if (mock_mode && strcmp(mock_mode, "notfound") == 0) { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + return 0; + } if (mock_mode && strcmp(mock_mode, "exists") == 0 && strstr(pattern, renderd)) { pglob->gl_pathc = 2; From 157a413244bf8f5836b992c6a9ffa9edc870aea7 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Mon, 4 Aug 2025 11:55:09 -0700 Subject: [PATCH 4/6] Follow-up fix --- sycl/test/tools/Inputs/mock_renderd_access.c | 69 ++++++++++---------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index fcd8835759016..a6ae7b8d44565 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -15,53 +15,54 @@ const char *renderd = "/dev/dri/renderD*"; int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); - if (mock_mode && strcmp(mock_mode, "notfound") == 0) { + if (!mock_mode || (strcmp(pattern, renderd) != 0)) { + // Delegate to real glob + int (*real_glob)(const char *, int, int (*)(const char *, int), glob_t *); + real_glob = dlsym(RTLD_NEXT, "glob"); + if (!real_glob) { + errno = ENOSYS; + return -1; + } + return real_glob(pattern, flags, errfunc, pglob); + } + if (strcmp(mock_mode, "notfound") == 0) { pglob->gl_pathc = 0; pglob->gl_pathv = NULL; return 0; } - if (mock_mode && strcmp(mock_mode, "exists") == 0 && - strstr(pattern, renderd)) { - pglob->gl_pathc = 2; - pglob->gl_pathv = malloc(2 * sizeof(char *)); - pglob->gl_pathv[0] = strdup(renderd128); - pglob->gl_pathv[1] = strdup(renderd129); - return 0; - } - // Default behavior: call real glob64 - int (*real_glob)(const char *, int, int (*)(const char *, int), glob_t *); - real_glob = dlsym(RTLD_NEXT, "glob"); - if (!real_glob) { - errno = ENOSYS; - return -1; - } - return real_glob(pattern, flags, errfunc, pglob); + assert(strcmp(mock_mode, "exists") == 0); + pglob->gl_pathc = 2; + pglob->gl_pathv = malloc(2 * sizeof(char *)); + pglob->gl_pathv[0] = strdup(renderd128); + pglob->gl_pathv[1] = strdup(renderd129); + return 0; } int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), glob64_t *pglob) { const char *mock_mode = getenv("MOCK_GLOB_MODE"); - if (mock_mode && strcmp(mock_mode, "notfound") == 0) { + if (!mock_mode || (strcmp(pattern, renderd) != 0)) { + // Delegate to real glob64 + int (*real_glob64)(const char *, int, int (*)(const char *, int), + glob64_t *); + real_glob64 = dlsym(RTLD_NEXT, "glob64"); + if (!real_glob64) { + errno = ENOSYS; + return -1; + } + return real_glob64(pattern, flags, errfunc, pglob); + } + if (strcmp(mock_mode, "notfound") == 0) { pglob->gl_pathc = 0; pglob->gl_pathv = NULL; return 0; } - if (mock_mode && strcmp(mock_mode, "exists") == 0 && - strstr(pattern, renderd)) { - pglob->gl_pathc = 2; - pglob->gl_pathv = malloc(2 * sizeof(char *)); - pglob->gl_pathv[0] = strdup("/dev/dri/renderD128"); - pglob->gl_pathv[1] = strdup("/dev/dri/renderD129"); - return 0; - } - // Default behavior: call real glob64 - int (*real_glob64)(const char *, int, int (*)(const char *, int), glob64_t *); - real_glob64 = dlsym(RTLD_NEXT, "glob64"); - if (!real_glob64) { - errno = ENOSYS; - return -1; - } - return real_glob64(pattern, flags, errfunc, pglob); + assert(strcmp(mock_mode, "exists") == 0); + pglob->gl_pathc = 2; + pglob->gl_pathv = malloc(2 * sizeof(char *)); + pglob->gl_pathv[0] = strdup(renderd128); + pglob->gl_pathv[1] = strdup(renderd129); + return 0; } void globfree(glob_t *pglob) { From 8a00b0dc38005945743f277abc8a5fd994c91196 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Mon, 4 Aug 2025 13:36:48 -0700 Subject: [PATCH 5/6] Compare ptrs --- sycl/test/tools/Inputs/mock_renderd_access.c | 36 ++++++-------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index a6ae7b8d44565..b5829b05277e3 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -8,9 +8,9 @@ #include #include -const char *renderd128 = "/dev/dri/renderD128"; -const char *renderd129 = "/dev/dri/renderD129"; const char *renderd = "/dev/dri/renderD*"; +const char *mock_render_dirs[2] = {"/dev/dri/renderD128", + "/dev/dri/renderD129"}; int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) { @@ -32,9 +32,7 @@ int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), } assert(strcmp(mock_mode, "exists") == 0); pglob->gl_pathc = 2; - pglob->gl_pathv = malloc(2 * sizeof(char *)); - pglob->gl_pathv[0] = strdup(renderd128); - pglob->gl_pathv[1] = strdup(renderd129); + pglob->gl_pathv = mock_render_dirs; return 0; } @@ -60,19 +58,12 @@ int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), assert(strcmp(mock_mode, "exists") == 0); pglob->gl_pathc = 2; pglob->gl_pathv = malloc(2 * sizeof(char *)); - pglob->gl_pathv[0] = strdup(renderd128); - pglob->gl_pathv[1] = strdup(renderd129); + pglob->gl_pathv = mock_render_dirs; return 0; } void globfree(glob_t *pglob) { - if (pglob->gl_pathc == 2 && pglob->gl_pathv && - strcmp(pglob->gl_pathv[0], renderd128) == 0 && - strcmp(pglob->gl_pathv[1], renderd129) == 0) { - for (size_t i = 0; i < pglob->gl_pathc; ++i) { - free(pglob->gl_pathv[i]); - } - free(pglob->gl_pathv); + if (pglob->gl_pathv == mock_render_dirs) { pglob->gl_pathv = NULL; pglob->gl_pathc = 0; return; @@ -88,15 +79,10 @@ void globfree(glob_t *pglob) { } void globfree64(glob64_t *pglob) { - if (pglob->gl_pathc == 2 && pglob->gl_pathv && - strcmp(pglob->gl_pathv[0], renderd128) == 0 && - strcmp(pglob->gl_pathv[1], renderd129) == 0) { - for (size_t i = 0; i < pglob->gl_pathc; ++i) { - free(pglob->gl_pathv[i]); - } - free(pglob->gl_pathv); + if (pglob->gl_pathv == mock_render_dirs) { pglob->gl_pathv = NULL; pglob->gl_pathc = 0; + return; } void (*real_globfree64)(glob64_t *); real_globfree64 = dlsym(RTLD_NEXT, "globfree64"); @@ -118,10 +104,10 @@ int mock_open_helper(const char *pathname) { return -1; } - if (strstr(pathname, "renderD128")) + if (pathname == mock_render_dirs[0]) return DUMMY_FD_128; - if (strstr(pathname, "renderD129")) { + if (pathname == mock_render_dirs[1]) { if (mock_mode && strcmp(mock_mode, "deny_second") == 0) { errno = EACCES; return -1; @@ -132,7 +118,7 @@ int mock_open_helper(const char *pathname) { } int open(const char *pathname, int flags, ...) { - if (strstr(pathname, "renderD12")) + if (pathname == mock_render_dirs[0] || pathname == mock_render_dirs[1]) return mock_open_helper(pathname); // Call the real open function if not renderD12*. @@ -150,7 +136,7 @@ int open(const char *pathname, int flags, ...) { } int open64(const char *pathname, int flags, ...) { - if (strstr(pathname, "renderD12")) + if (pathname == mock_render_dirs[0] || pathname == mock_render_dirs[1]) return mock_open_helper(pathname); // Call the real open function if not renderD12*. From d97bc02cf4ef986c2a21a303f7f3b0ee4d19bcf9 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Mon, 4 Aug 2025 13:39:07 -0700 Subject: [PATCH 6/6] Small fix --- sycl/test/tools/Inputs/mock_renderd_access.c | 1 - 1 file changed, 1 deletion(-) diff --git a/sycl/test/tools/Inputs/mock_renderd_access.c b/sycl/test/tools/Inputs/mock_renderd_access.c index b5829b05277e3..572690233dcd0 100644 --- a/sycl/test/tools/Inputs/mock_renderd_access.c +++ b/sycl/test/tools/Inputs/mock_renderd_access.c @@ -57,7 +57,6 @@ int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), } assert(strcmp(mock_mode, "exists") == 0); pglob->gl_pathc = 2; - pglob->gl_pathv = malloc(2 * sizeof(char *)); pglob->gl_pathv = mock_render_dirs; return 0; }