Message ID | 20161019124954.29232-2-emilio.lopez@collabora.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Emilio, 2016-10-19 Emilio López <emilio.lopez@collabora.co.uk>: > These tests are based on the libsync test suite from Android. > This commit lays the ground for future tests, as well as includes > tests for a variety of basic allocation commands. > > Signed-off-by: Emilio López <emilio.lopez@collabora.co.uk> > --- > tools/testing/selftests/Makefile | 1 + > tools/testing/selftests/sync/.gitignore | 1 + > tools/testing/selftests/sync/Makefile | 18 +++ > tools/testing/selftests/sync/sw_sync.h | 46 +++++++ > tools/testing/selftests/sync/sync.c | 221 ++++++++++++++++++++++++++++++ > tools/testing/selftests/sync/sync.h | 40 ++++++ > tools/testing/selftests/sync/sync_alloc.c | 74 ++++++++++ > tools/testing/selftests/sync/sync_test.c | 71 ++++++++++ > tools/testing/selftests/sync/synctest.h | 47 +++++++ > 9 files changed, 519 insertions(+) > create mode 100644 tools/testing/selftests/sync/.gitignore > create mode 100644 tools/testing/selftests/sync/Makefile > create mode 100644 tools/testing/selftests/sync/sw_sync.h > create mode 100644 tools/testing/selftests/sync/sync.c > create mode 100644 tools/testing/selftests/sync/sync.h > create mode 100644 tools/testing/selftests/sync/sync_alloc.c > create mode 100644 tools/testing/selftests/sync/sync_test.c > create mode 100644 tools/testing/selftests/sync/synctest.h > > diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile > index f770dba..69cf1a6 100644 > --- a/tools/testing/selftests/Makefile > +++ b/tools/testing/selftests/Makefile > @@ -23,6 +23,7 @@ TARGETS += seccomp > TARGETS += sigaltstack > TARGETS += size > TARGETS += static_keys > +TARGETS += sync > TARGETS += sysctl > ifneq (1, $(quicktest)) > TARGETS += timers > diff --git a/tools/testing/selftests/sync/.gitignore b/tools/testing/selftests/sync/.gitignore > new file mode 100644 > index 0000000..f5091e7 > --- /dev/null > +++ b/tools/testing/selftests/sync/.gitignore > @@ -0,0 +1 @@ > +sync_test > diff --git a/tools/testing/selftests/sync/Makefile b/tools/testing/selftests/sync/Makefile > new file mode 100644 > index 0000000..620a59a > --- /dev/null > +++ b/tools/testing/selftests/sync/Makefile > @@ -0,0 +1,18 @@ > +CFLAGS += -O2 -g -std=gnu89 -pthread -Wall -Wextra > +CFLAGS += -I../../../../usr/include/ > +LDFLAGS += -pthread > + > +TEST_PROGS = sync_test > + > +all: $(TEST_PROGS) > + > +include ../lib.mk > + > +OBJS = sync_test.o sync.o > + > +TESTS += sync_alloc.o > + > +sync_test: $(OBJS) $(TESTS) > + > +clean: > + $(RM) sync_test $(OBJS) $(TESTS) > diff --git a/tools/testing/selftests/sync/sw_sync.h b/tools/testing/selftests/sync/sw_sync.h > new file mode 100644 > index 0000000..e2cfc6ba > --- /dev/null > +++ b/tools/testing/selftests/sync/sw_sync.h > @@ -0,0 +1,46 @@ > +/* > + * sw_sync abstraction > + * > + * Copyright 2015-2016 Collabora Ltd. > + * > + * Based on the implementation from the Android Open Source Project, > + * > + * Copyright 2013 Google, Inc > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > +#ifndef SELFTESTS_SW_SYNC_H > +#define SELFTESTS_SW_SYNC_H > + > +/* > + * sw_sync is mainly intended for testing and should not be compiled into > + * production kernels > + */ > + > +int sw_sync_timeline_create(void); > +int sw_sync_timeline_is_valid(int fd); > +int sw_sync_timeline_inc(int fd, unsigned int count); > +void sw_sync_timeline_destroy(int fd); > + > +int sw_sync_fence_create(int fd, const char *name, unsigned int value); > +int sw_sync_fence_is_valid(int fd); > +void sw_sync_fence_destroy(int fd); > + > +#endif > diff --git a/tools/testing/selftests/sync/sync.c b/tools/testing/selftests/sync/sync.c > new file mode 100644 > index 0000000..f3d599f > --- /dev/null > +++ b/tools/testing/selftests/sync/sync.c > @@ -0,0 +1,221 @@ > +/* > + * sync / sw_sync abstraction > + * Copyright 2015-2016 Collabora Ltd. > + * > + * Based on the implementation from the Android Open Source Project, > + * > + * Copyright 2012 Google, Inc > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > +#include <fcntl.h> > +#include <malloc.h> > +#include <poll.h> > +#include <stdint.h> > +#include <string.h> > +#include <unistd.h> > + > +#include <sys/ioctl.h> > +#include <sys/stat.h> > +#include <sys/types.h> > + > +#include "sync.h" > +#include "sw_sync.h" > + > +#include <linux/sync_file.h> > + > + > +/* SW_SYNC ioctls */ > +struct sw_sync_create_fence_data { > + __u32 value; > + char name[32]; > + __s32 fence; > +}; > + > +#define SW_SYNC_IOC_MAGIC 'W' > +#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\ > + struct sw_sync_create_fence_data) > +#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32) > + > + > +int sync_wait(int fd, int timeout) > +{ > + struct pollfd fds; > + > + fds.fd = fd; > + fds.events = POLLIN | POLLERR; > + > + return poll(&fds, 1, timeout); > +} I think it is a good idea to keep the sync_wait behaviour similar to what it was on android libsync. It should be something like this: int sw_sync_wait(int fd, int timeout) { struct pollfd fds = {0}; int ret; fds.fd = fd; fds.events = POLLIN; do { ret = poll(&fds, 1, timeout); if (ret > 0) { if (fds.revents & (POLLERR | POLLNVAL)) { errno = EINVAL; return -1; } return 0; } else if (ret == 0) { errno = ETIME; return -1; } } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); return ret; } Gustavo
Hi Gustavo, On 11/01/2016 10:18 AM, Gustavo Padovan wrote: > Hi Emilio, > > 2016-10-19 Emilio López <emilio.lopez@collabora.co.uk>: > >> These tests are based on the libsync test suite from Android. >> This commit lays the ground for future tests, as well as includes >> tests for a variety of basic allocation commands. >> >> Signed-off-by: Emilio López <emilio.lopez@collabora.co.uk> >> --- >> tools/testing/selftests/Makefile | 1 + >> tools/testing/selftests/sync/.gitignore | 1 + >> tools/testing/selftests/sync/Makefile | 18 +++ >> tools/testing/selftests/sync/sw_sync.h | 46 +++++++ >> tools/testing/selftests/sync/sync.c | 221 ++++++++++++++++++++++++++++++ >> tools/testing/selftests/sync/sync.h | 40 ++++++ >> tools/testing/selftests/sync/sync_alloc.c | 74 ++++++++++ >> tools/testing/selftests/sync/sync_test.c | 71 ++++++++++ >> tools/testing/selftests/sync/synctest.h | 47 +++++++ >> 9 files changed, 519 insertions(+) >> create mode 100644 tools/testing/selftests/sync/.gitignore >> create mode 100644 tools/testing/selftests/sync/Makefile >> create mode 100644 tools/testing/selftests/sync/sw_sync.h >> create mode 100644 tools/testing/selftests/sync/sync.c >> create mode 100644 tools/testing/selftests/sync/sync.h >> create mode 100644 tools/testing/selftests/sync/sync_alloc.c >> create mode 100644 tools/testing/selftests/sync/sync_test.c >> create mode 100644 tools/testing/selftests/sync/synctest.h >> >> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile >> index f770dba..69cf1a6 100644 >> --- a/tools/testing/selftests/Makefile >> +++ b/tools/testing/selftests/Makefile >> @@ -23,6 +23,7 @@ TARGETS += seccomp >> TARGETS += sigaltstack >> TARGETS += size >> TARGETS += static_keys >> +TARGETS += sync >> TARGETS += sysctl >> ifneq (1, $(quicktest)) >> TARGETS += timers >> diff --git a/tools/testing/selftests/sync/.gitignore b/tools/testing/selftests/sync/.gitignore >> new file mode 100644 >> index 0000000..f5091e7 >> --- /dev/null >> +++ b/tools/testing/selftests/sync/.gitignore >> @@ -0,0 +1 @@ >> +sync_test >> diff --git a/tools/testing/selftests/sync/Makefile b/tools/testing/selftests/sync/Makefile >> new file mode 100644 >> index 0000000..620a59a >> --- /dev/null >> +++ b/tools/testing/selftests/sync/Makefile >> @@ -0,0 +1,18 @@ >> +CFLAGS += -O2 -g -std=gnu89 -pthread -Wall -Wextra >> +CFLAGS += -I../../../../usr/include/ >> +LDFLAGS += -pthread >> + >> +TEST_PROGS = sync_test >> + >> +all: $(TEST_PROGS) >> + >> +include ../lib.mk >> + >> +OBJS = sync_test.o sync.o >> + >> +TESTS += sync_alloc.o >> + >> +sync_test: $(OBJS) $(TESTS) >> + >> +clean: >> + $(RM) sync_test $(OBJS) $(TESTS) >> diff --git a/tools/testing/selftests/sync/sw_sync.h b/tools/testing/selftests/sync/sw_sync.h >> new file mode 100644 >> index 0000000..e2cfc6ba >> --- /dev/null >> +++ b/tools/testing/selftests/sync/sw_sync.h >> @@ -0,0 +1,46 @@ >> +/* >> + * sw_sync abstraction >> + * >> + * Copyright 2015-2016 Collabora Ltd. >> + * >> + * Based on the implementation from the Android Open Source Project, >> + * >> + * Copyright 2013 Google, Inc >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining a >> + * copy of this software and associated documentation files (the "Software"), >> + * to deal in the Software without restriction, including without limitation >> + * the rights to use, copy, modify, merge, publish, distribute, sublicense, >> + * and/or sell copies of the Software, and to permit persons to whom the >> + * Software is furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice shall be included in >> + * all copies or substantial portions of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL >> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, >> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR >> + * OTHER DEALINGS IN THE SOFTWARE. >> + */ >> + >> +#ifndef SELFTESTS_SW_SYNC_H >> +#define SELFTESTS_SW_SYNC_H >> + >> +/* >> + * sw_sync is mainly intended for testing and should not be compiled into >> + * production kernels >> + */ >> + >> +int sw_sync_timeline_create(void); >> +int sw_sync_timeline_is_valid(int fd); >> +int sw_sync_timeline_inc(int fd, unsigned int count); >> +void sw_sync_timeline_destroy(int fd); >> + >> +int sw_sync_fence_create(int fd, const char *name, unsigned int value); >> +int sw_sync_fence_is_valid(int fd); >> +void sw_sync_fence_destroy(int fd); >> + >> +#endif >> diff --git a/tools/testing/selftests/sync/sync.c b/tools/testing/selftests/sync/sync.c >> new file mode 100644 >> index 0000000..f3d599f >> --- /dev/null >> +++ b/tools/testing/selftests/sync/sync.c >> @@ -0,0 +1,221 @@ >> +/* >> + * sync / sw_sync abstraction >> + * Copyright 2015-2016 Collabora Ltd. >> + * >> + * Based on the implementation from the Android Open Source Project, >> + * >> + * Copyright 2012 Google, Inc >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining a >> + * copy of this software and associated documentation files (the "Software"), >> + * to deal in the Software without restriction, including without limitation >> + * the rights to use, copy, modify, merge, publish, distribute, sublicense, >> + * and/or sell copies of the Software, and to permit persons to whom the >> + * Software is furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice shall be included in >> + * all copies or substantial portions of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL >> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, >> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR >> + * OTHER DEALINGS IN THE SOFTWARE. >> + */ >> + >> +#include <fcntl.h> >> +#include <malloc.h> >> +#include <poll.h> >> +#include <stdint.h> >> +#include <string.h> >> +#include <unistd.h> >> + >> +#include <sys/ioctl.h> >> +#include <sys/stat.h> >> +#include <sys/types.h> >> + >> +#include "sync.h" >> +#include "sw_sync.h" >> + >> +#include <linux/sync_file.h> >> + >> + >> +/* SW_SYNC ioctls */ >> +struct sw_sync_create_fence_data { >> + __u32 value; >> + char name[32]; >> + __s32 fence; >> +}; >> + >> +#define SW_SYNC_IOC_MAGIC 'W' >> +#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\ >> + struct sw_sync_create_fence_data) >> +#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32) >> + >> + >> +int sync_wait(int fd, int timeout) >> +{ >> + struct pollfd fds; >> + >> + fds.fd = fd; >> + fds.events = POLLIN | POLLERR; >> + >> + return poll(&fds, 1, timeout); >> +} > > I think it is a good idea to keep the sync_wait behaviour similar to > what it was on android libsync. It should be something like this: I didn't notice that this comment wasn't addressed. I will go ahead and continue with the plan to get these into 4.10-rc1. If you want to send me patch for this behavior, please do. We can address that as a fix in 4.10-rc2 > > int sw_sync_wait(int fd, int timeout) > { > struct pollfd fds = {0}; > int ret; > > fds.fd = fd; > fds.events = POLLIN; > > do { > ret = poll(&fds, 1, timeout); > if (ret > 0) { > if (fds.revents & (POLLERR | POLLNVAL)) { > errno = EINVAL; > return -1; > } > return 0; > } else if (ret == 0) { > errno = ETIME; > return -1; > } > } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); > > return ret; > } > > > Gustavo > thanks, -- Shuah
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index f770dba..69cf1a6 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -23,6 +23,7 @@ TARGETS += seccomp TARGETS += sigaltstack TARGETS += size TARGETS += static_keys +TARGETS += sync TARGETS += sysctl ifneq (1, $(quicktest)) TARGETS += timers diff --git a/tools/testing/selftests/sync/.gitignore b/tools/testing/selftests/sync/.gitignore new file mode 100644 index 0000000..f5091e7 --- /dev/null +++ b/tools/testing/selftests/sync/.gitignore @@ -0,0 +1 @@ +sync_test diff --git a/tools/testing/selftests/sync/Makefile b/tools/testing/selftests/sync/Makefile new file mode 100644 index 0000000..620a59a --- /dev/null +++ b/tools/testing/selftests/sync/Makefile @@ -0,0 +1,18 @@ +CFLAGS += -O2 -g -std=gnu89 -pthread -Wall -Wextra +CFLAGS += -I../../../../usr/include/ +LDFLAGS += -pthread + +TEST_PROGS = sync_test + +all: $(TEST_PROGS) + +include ../lib.mk + +OBJS = sync_test.o sync.o + +TESTS += sync_alloc.o + +sync_test: $(OBJS) $(TESTS) + +clean: + $(RM) sync_test $(OBJS) $(TESTS) diff --git a/tools/testing/selftests/sync/sw_sync.h b/tools/testing/selftests/sync/sw_sync.h new file mode 100644 index 0000000..e2cfc6ba --- /dev/null +++ b/tools/testing/selftests/sync/sw_sync.h @@ -0,0 +1,46 @@ +/* + * sw_sync abstraction + * + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2013 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SELFTESTS_SW_SYNC_H +#define SELFTESTS_SW_SYNC_H + +/* + * sw_sync is mainly intended for testing and should not be compiled into + * production kernels + */ + +int sw_sync_timeline_create(void); +int sw_sync_timeline_is_valid(int fd); +int sw_sync_timeline_inc(int fd, unsigned int count); +void sw_sync_timeline_destroy(int fd); + +int sw_sync_fence_create(int fd, const char *name, unsigned int value); +int sw_sync_fence_is_valid(int fd); +void sw_sync_fence_destroy(int fd); + +#endif diff --git a/tools/testing/selftests/sync/sync.c b/tools/testing/selftests/sync/sync.c new file mode 100644 index 0000000..f3d599f --- /dev/null +++ b/tools/testing/selftests/sync/sync.c @@ -0,0 +1,221 @@ +/* + * sync / sw_sync abstraction + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2012 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <fcntl.h> +#include <malloc.h> +#include <poll.h> +#include <stdint.h> +#include <string.h> +#include <unistd.h> + +#include <sys/ioctl.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include "sync.h" +#include "sw_sync.h" + +#include <linux/sync_file.h> + + +/* SW_SYNC ioctls */ +struct sw_sync_create_fence_data { + __u32 value; + char name[32]; + __s32 fence; +}; + +#define SW_SYNC_IOC_MAGIC 'W' +#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\ + struct sw_sync_create_fence_data) +#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32) + + +int sync_wait(int fd, int timeout) +{ + struct pollfd fds; + + fds.fd = fd; + fds.events = POLLIN | POLLERR; + + return poll(&fds, 1, timeout); +} + +int sync_merge(const char *name, int fd1, int fd2) +{ + struct sync_merge_data data = {}; + int err; + + data.fd2 = fd2; + strncpy(data.name, name, sizeof(data.name) - 1); + data.name[sizeof(data.name) - 1] = '\0'; + + err = ioctl(fd1, SYNC_IOC_MERGE, &data); + if (err < 0) + return err; + + return data.fence; +} + +static struct sync_file_info *sync_file_info(int fd) +{ + struct sync_file_info *info; + struct sync_fence_info *fence_info; + int err, num_fences; + + info = calloc(1, sizeof(*info)); + if (info == NULL) + return NULL; + + err = ioctl(fd, SYNC_IOC_FILE_INFO, info); + if (err < 0) { + free(info); + return NULL; + } + + num_fences = info->num_fences; + + if (num_fences) { + info->flags = 0; + info->num_fences = num_fences; + + fence_info = calloc(num_fences, sizeof(*fence_info)); + if (!fence_info) { + free(info); + return NULL; + } + + info->sync_fence_info = (uint64_t)fence_info; + + err = ioctl(fd, SYNC_IOC_FILE_INFO, info); + if (err < 0) { + free(fence_info); + free(info); + return NULL; + } + } + + return info; +} + +static void sync_file_info_free(struct sync_file_info *info) +{ + free((void *)info->sync_fence_info); + free(info); +} + +int sync_fence_size(int fd) +{ + int count; + struct sync_file_info *info = sync_file_info(fd); + + if (!info) + return 0; + + count = info->num_fences; + + sync_file_info_free(info); + + return count; +} + +int sync_fence_count_with_status(int fd, int status) +{ + unsigned int i, count = 0; + struct sync_fence_info *fence_info = NULL; + struct sync_file_info *info = sync_file_info(fd); + + if (!info) + return -1; + + fence_info = (struct sync_fence_info *)info->sync_fence_info; + for (i = 0 ; i < info->num_fences ; i++) { + if (fence_info[i].status == status) + count++; + } + + sync_file_info_free(info); + + return count; +} + +int sw_sync_timeline_create(void) +{ + return open("/sys/kernel/debug/sync/sw_sync", O_RDWR); +} + +int sw_sync_timeline_inc(int fd, unsigned int count) +{ + __u32 arg = count; + + return ioctl(fd, SW_SYNC_IOC_INC, &arg); +} + +int sw_sync_timeline_is_valid(int fd) +{ + int status; + + if (fd == -1) + return 0; + + status = fcntl(fd, F_GETFD, 0); + return (status >= 0); +} + +void sw_sync_timeline_destroy(int fd) +{ + if (sw_sync_timeline_is_valid(fd)) + close(fd); +} + +int sw_sync_fence_create(int fd, const char *name, unsigned int value) +{ + struct sw_sync_create_fence_data data = {}; + int err; + + data.value = value; + strncpy(data.name, name, sizeof(data.name) - 1); + data.name[sizeof(data.name) - 1] = '\0'; + + err = ioctl(fd, SW_SYNC_IOC_CREATE_FENCE, &data); + if (err < 0) + return err; + + return data.fence; +} + +int sw_sync_fence_is_valid(int fd) +{ + /* Same code! */ + return sw_sync_timeline_is_valid(fd); +} + +void sw_sync_fence_destroy(int fd) +{ + if (sw_sync_fence_is_valid(fd)) + close(fd); +} diff --git a/tools/testing/selftests/sync/sync.h b/tools/testing/selftests/sync/sync.h new file mode 100644 index 0000000..fb71561 --- /dev/null +++ b/tools/testing/selftests/sync/sync.h @@ -0,0 +1,40 @@ +/* + * sync abstraction + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2012 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SELFTESTS_SYNC_H +#define SELFTESTS_SYNC_H + +#define FENCE_STATUS_ERROR (-1) +#define FENCE_STATUS_ACTIVE (0) +#define FENCE_STATUS_SIGNALED (1) + +int sync_wait(int fd, int timeout); +int sync_merge(const char *name, int fd1, int fd2); +int sync_fence_size(int fd); +int sync_fence_count_with_status(int fd, int status); + +#endif diff --git a/tools/testing/selftests/sync/sync_alloc.c b/tools/testing/selftests/sync/sync_alloc.c new file mode 100644 index 0000000..66a28af --- /dev/null +++ b/tools/testing/selftests/sync/sync_alloc.c @@ -0,0 +1,74 @@ +/* + * sync allocation tests + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2012 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "sync.h" +#include "sw_sync.h" +#include "synctest.h" + +int test_alloc_timeline(void) +{ + int timeline, valid; + + timeline = sw_sync_timeline_create(); + valid = sw_sync_timeline_is_valid(timeline); + ASSERT(valid, "Failure allocating timeline\n"); + + sw_sync_timeline_destroy(timeline); + return 0; +} + +int test_alloc_fence(void) +{ + int timeline, fence, valid; + + timeline = sw_sync_timeline_create(); + valid = sw_sync_timeline_is_valid(timeline); + ASSERT(valid, "Failure allocating timeline\n"); + + fence = sw_sync_fence_create(timeline, "allocFence", 1); + valid = sw_sync_fence_is_valid(fence); + ASSERT(valid, "Failure allocating fence\n"); + + sw_sync_fence_destroy(fence); + sw_sync_timeline_destroy(timeline); + return 0; +} + +int test_alloc_fence_negative(void) +{ + int fence, timeline; + + timeline = sw_sync_timeline_create(); + ASSERT(timeline > 0, "Failure allocating timeline\n"); + + fence = sw_sync_fence_create(-1, "fence", 1); + ASSERT(fence < 0, "Success allocating negative fence\n"); + + sw_sync_fence_destroy(fence); + sw_sync_timeline_destroy(timeline); + return 0; +} diff --git a/tools/testing/selftests/sync/sync_test.c b/tools/testing/selftests/sync/sync_test.c new file mode 100644 index 0000000..e471ba9 --- /dev/null +++ b/tools/testing/selftests/sync/sync_test.c @@ -0,0 +1,71 @@ +/* + * sync test runner + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2012 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/wait.h> + +#include "synctest.h" + +static int run_test(int (*test)(void), char *name) +{ + int result; + pid_t childpid; + + fflush(stdout); + childpid = fork(); + + if (childpid) { + waitpid(childpid, &result, 0); + if (WIFEXITED(result)) + return WEXITSTATUS(result); + return 1; + } + + printf("[RUN]\tExecuting %s\n", name); + exit(test()); +} + +int main(void) +{ + int err = 0; + + printf("[RUN]\tTesting sync framework\n"); + + err += RUN_TEST(test_alloc_timeline); + err += RUN_TEST(test_alloc_fence); + err += RUN_TEST(test_alloc_fence_negative); + + if (err) + printf("[FAIL]\tsync errors: %d\n", err); + else + printf("[OK]\tsync\n"); + + return !!err; +} diff --git a/tools/testing/selftests/sync/synctest.h b/tools/testing/selftests/sync/synctest.h new file mode 100644 index 0000000..7d2d8ce --- /dev/null +++ b/tools/testing/selftests/sync/synctest.h @@ -0,0 +1,47 @@ +/* + * sync tests + * Copyright 2015-2016 Collabora Ltd. + * + * Based on the implementation from the Android Open Source Project, + * + * Copyright 2012 Google, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SELFTESTS_SYNCTEST_H +#define SELFTESTS_SYNCTEST_H + +#include <stdio.h> + +#define ASSERT(cond, msg) do { \ + if (!(cond)) { \ + printf("[BAD]\t%s", (msg)); \ + return 1; \ + } \ +} while (0) + +#define RUN_TEST(x) run_test((x), #x) + +/* Allocation tests */ +int test_alloc_timeline(void); +int test_alloc_fence(void); +int test_alloc_fence_negative(void); + +#endif
These tests are based on the libsync test suite from Android. This commit lays the ground for future tests, as well as includes tests for a variety of basic allocation commands. Signed-off-by: Emilio López <emilio.lopez@collabora.co.uk> --- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/sync/.gitignore | 1 + tools/testing/selftests/sync/Makefile | 18 +++ tools/testing/selftests/sync/sw_sync.h | 46 +++++++ tools/testing/selftests/sync/sync.c | 221 ++++++++++++++++++++++++++++++ tools/testing/selftests/sync/sync.h | 40 ++++++ tools/testing/selftests/sync/sync_alloc.c | 74 ++++++++++ tools/testing/selftests/sync/sync_test.c | 71 ++++++++++ tools/testing/selftests/sync/synctest.h | 47 +++++++ 9 files changed, 519 insertions(+) create mode 100644 tools/testing/selftests/sync/.gitignore create mode 100644 tools/testing/selftests/sync/Makefile create mode 100644 tools/testing/selftests/sync/sw_sync.h create mode 100644 tools/testing/selftests/sync/sync.c create mode 100644 tools/testing/selftests/sync/sync.h create mode 100644 tools/testing/selftests/sync/sync_alloc.c create mode 100644 tools/testing/selftests/sync/sync_test.c create mode 100644 tools/testing/selftests/sync/synctest.h