Hi,
Here are the 2nd version of kselftest fixes some on 32bit arch (e.g. arm). In this version, I updated [1/5] to make va_max 1GB instead of 3GB, according to Alexey's comment.
When I built the ksefltest on arm, I hit some 32bit related warnings. Here are the patches to fix those issues.
- [1/5] va_max was set 2^32 even on 32bit arch. This can make va_max == 0 and always fail. Make it 3GB on 32bit. - [2/5] Some VM tests requires 64bit user space, which should not run on 32bit arch. - [3/5] For counting the size of large file, we should use size_t instead of unsinged long. - [4/5] Gcc warns printf format for size_t and int64_t on 32bit arch. Use %llu and cast it. - [5/5] Gcc warns __u64 and pointer type castings. It should once translated to unsigned long.
Thank you,
---
Masami Hiramatsu (5): selftests: proc: Make va_max 1GB on 32bit arch selftests: vm: Build/Run 64bit tests only on 64bit arch selftests: net: Use size_t and ssize_t for counting file size selftests: net: Fix printf format warnings on arm selftests: sync: Fix cast warnings on arm
tools/testing/selftests/net/so_txtime.c | 4 ++-- tools/testing/selftests/net/tcp_mmap.c | 8 ++++---- tools/testing/selftests/net/udpgso.c | 3 ++- tools/testing/selftests/net/udpgso_bench_tx.c | 3 ++- .../selftests/proc/proc-self-map-files-002.c | 11 ++++++++++- tools/testing/selftests/sync/sync.c | 6 +++--- tools/testing/selftests/vm/Makefile | 5 +++++ tools/testing/selftests/vm/run_vmtests | 10 ++++++++++ 8 files changed, 38 insertions(+), 12 deletions(-)
-- Masami Hiramatsu (Linaro) mhiramat@kernel.org
Currently proc-self-map-files-002.c sets va_max (max test address of user virtual address) to 4GB, but it is too big for 32bit arch and 1UL << 32 is overflow on 32bit long.
Make va_max 1GB on 32bit arch like i386 and arm.
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Alexey Dobriyan adobriyan@gmail.com --- Changes in v2: - Make the va_max 1GB according to Alexey's comment. --- .../selftests/proc/proc-self-map-files-002.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/proc/proc-self-map-files-002.c b/tools/testing/selftests/proc/proc-self-map-files-002.c index 47b7473dedef..5d372d66d6ad 100644 --- a/tools/testing/selftests/proc/proc-self-map-files-002.c +++ b/tools/testing/selftests/proc/proc-self-map-files-002.c @@ -22,6 +22,7 @@ #include <unistd.h> #include <sys/mman.h> #include <stdlib.h> +#include <asm/bitsperlong.h>
static void pass(const char *fmt, unsigned long a, unsigned long b) { @@ -44,10 +45,18 @@ static void fail(const char *fmt, unsigned long a, unsigned long b) exit(1); }
+#if __BITS_PER_LONG == 32 +# define VA_MAX (1UL << 30) +#elif __BITS_PER_LONG == 64 +# define VA_MAX (1UL << 32) +#else +# define VA_MAX 0 +#endif + int main(void) { const int PAGE_SIZE = sysconf(_SC_PAGESIZE); - const unsigned long va_max = 1UL << 32; + const unsigned long va_max = VA_MAX; unsigned long va; void *p; int fd;
On Mon, Oct 21, 2019 at 05:28:09PM +0900, Masami Hiramatsu wrote:
Currently proc-self-map-files-002.c sets va_max (max test address of user virtual address) to 4GB, but it is too big for 32bit arch and 1UL << 32 is overflow on 32bit long.
Make va_max 1GB on 32bit arch like i386 and arm.
+#if __BITS_PER_LONG == 32 +# define VA_MAX (1UL << 30) +#elif __BITS_PER_LONG == 64 +# define VA_MAX (1UL << 32) +#else +# define VA_MAX 0 +#endif
int main(void) { const int PAGE_SIZE = sysconf(_SC_PAGESIZE);
- const unsigned long va_max = 1UL << 32;
- const unsigned long va_max = VA_MAX;
No, just make it like 1MB unconditionally. This is not intended to cover all address space, just large enough part (larger than reasonable vm.mmap_min_addr)
On Mon, 21 Oct 2019 20:30:53 +0300 Alexey Dobriyan adobriyan@gmail.com wrote:
On Mon, Oct 21, 2019 at 05:28:09PM +0900, Masami Hiramatsu wrote:
Currently proc-self-map-files-002.c sets va_max (max test address of user virtual address) to 4GB, but it is too big for 32bit arch and 1UL << 32 is overflow on 32bit long.
Make va_max 1GB on 32bit arch like i386 and arm.
+#if __BITS_PER_LONG == 32 +# define VA_MAX (1UL << 30) +#elif __BITS_PER_LONG == 64 +# define VA_MAX (1UL << 32) +#else +# define VA_MAX 0 +#endif
int main(void) { const int PAGE_SIZE = sysconf(_SC_PAGESIZE);
- const unsigned long va_max = 1UL << 32;
- const unsigned long va_max = VA_MAX;
No, just make it like 1MB unconditionally.
Ah, I sse. BTW, would you mean 1GB?
This is not intended to cover all address space, just large enough part (larger than reasonable vm.mmap_min_addr)
Then, should we better to check the /proc/sys/vm/mmap_min_addr?
Thank you,
On Wed, 23 Oct 2019 10:56:18 +0900 Masami Hiramatsu mhiramat@kernel.org wrote:
On Mon, 21 Oct 2019 20:30:53 +0300 Alexey Dobriyan adobriyan@gmail.com wrote:
On Mon, Oct 21, 2019 at 05:28:09PM +0900, Masami Hiramatsu wrote:
Currently proc-self-map-files-002.c sets va_max (max test address of user virtual address) to 4GB, but it is too big for 32bit arch and 1UL << 32 is overflow on 32bit long.
Make va_max 1GB on 32bit arch like i386 and arm.
+#if __BITS_PER_LONG == 32 +# define VA_MAX (1UL << 30) +#elif __BITS_PER_LONG == 64 +# define VA_MAX (1UL << 32) +#else +# define VA_MAX 0 +#endif
int main(void) { const int PAGE_SIZE = sysconf(_SC_PAGESIZE);
- const unsigned long va_max = 1UL << 32;
- const unsigned long va_max = VA_MAX;
No, just make it like 1MB unconditionally.
Ah, I sse. BTW, would you mean 1GB?
I understand that 1MB will be good enough, since vm.mmap_min_addr is 64KB by default (except for arm/arm64 which is 32KB). OK, I'll update and resend.
Thank you,
This is not intended to cover all address space, just large enough part (larger than reasonable vm.mmap_min_addr)
Then, should we better to check the /proc/sys/vm/mmap_min_addr?
Thank you,
-- Masami Hiramatsu mhiramat@kernel.org
Some virtual address range tests requires 64bit address space, and we can not build and run those tests on the 32bit machine.
Filter the 64bit architectures in Makefile and run_vmtests, so that those tests are built/run only on 64bit archs.
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Anshuman Khandual khandual@linux.vnet.ibm.com Cc: Aneesh Kumar K.V aneesh.kumar@linux.vnet.ibm.com --- tools/testing/selftests/vm/Makefile | 5 +++++ tools/testing/selftests/vm/run_vmtests | 10 ++++++++++ 2 files changed, 15 insertions(+)
diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile index 9534dc2bc929..7f9a8a8c31da 100644 --- a/tools/testing/selftests/vm/Makefile +++ b/tools/testing/selftests/vm/Makefile @@ -1,5 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 # Makefile for vm selftests +uname_M := $(shell uname -m 2>/dev/null || echo not) +ARCH ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/')
CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS) LDLIBS = -lrt @@ -16,8 +18,11 @@ TEST_GEN_FILES += on-fault-limit TEST_GEN_FILES += thuge-gen TEST_GEN_FILES += transhuge-stress TEST_GEN_FILES += userfaultfd + +ifneq (,$(filter $(ARCH),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64)) TEST_GEN_FILES += va_128TBswitch TEST_GEN_FILES += virtual_address_range +endif
TEST_PROGS := run_vmtests
diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests index 951c507a27f7..a692ea828317 100755 --- a/tools/testing/selftests/vm/run_vmtests +++ b/tools/testing/selftests/vm/run_vmtests @@ -58,6 +58,14 @@ else exit 1 fi
+#filter 64bit architectures +ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64" +if [ -z $ARCH ]; then + ARCH=`uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/'` +fi +VADDR64=0 +echo "$ARCH64STR" | grep $ARCH && VADDR64=1 + mkdir $mnt mount -t hugetlbfs none $mnt
@@ -189,6 +197,7 @@ else echo "[PASS]" fi
+if [ $VADDR64 -ne 0 ]; then echo "-----------------------------" echo "running virtual_address_range" echo "-----------------------------" @@ -210,6 +219,7 @@ if [ $? -ne 0 ]; then else echo "[PASS]" fi +fi # VADDR64
echo "------------------------------------" echo "running vmalloc stability smoke test"
Use size_t and ssize_t correctly for counting send file size instead of unsigned long and long, because long is 32bit on 32bit arch, which is not enough for counting long file size (>4GB).
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Eric Dumazet edumazet@google.com Cc: David S. Miller davem@davemloft.net --- tools/testing/selftests/net/tcp_mmap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/tcp_mmap.c b/tools/testing/selftests/net/tcp_mmap.c index 31ced79f4f25..33035d1b3f6d 100644 --- a/tools/testing/selftests/net/tcp_mmap.c +++ b/tools/testing/selftests/net/tcp_mmap.c @@ -71,7 +71,7 @@ #define MSG_ZEROCOPY 0x4000000 #endif
-#define FILE_SZ (1UL << 35) +#define FILE_SZ (1ULL << 35) static int cfg_family = AF_INET6; static socklen_t cfg_alen = sizeof(struct sockaddr_in6); static int cfg_port = 8787; @@ -155,7 +155,7 @@ void *child_thread(void *arg) socklen_t zc_len = sizeof(zc); int res;
- zc.address = (__u64)addr; + zc.address = (__u64)((unsigned long)addr); zc.length = chunk_size; zc.recv_skip_hint = 0; res = getsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, @@ -302,7 +302,7 @@ int main(int argc, char *argv[]) { struct sockaddr_storage listenaddr, addr; unsigned int max_pacing_rate = 0; - unsigned long total = 0; + size_t total = 0; char *host = NULL; int fd, c, on = 1; char *buffer; @@ -417,7 +417,7 @@ int main(int argc, char *argv[]) zflg = 0; } while (total < FILE_SZ) { - long wr = FILE_SZ - total; + ssize_t wr = FILE_SZ - total;
if (wr > chunk_size) wr = chunk_size;
Fix printf format warnings on arm (and other 32bit arch).
- udpgso.c and udpgso_bench_tx use %lu for size_t but it should be unsigned long long on 32bit arch.
- so_txtime.c uses %ld for int64_t, but it should be unsigned long long on 32bit arch.
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Willem de Bruijn willemb@google.com Cc: David S. Miller davem@davemloft.net --- tools/testing/selftests/net/so_txtime.c | 4 ++-- tools/testing/selftests/net/udpgso.c | 3 ++- tools/testing/selftests/net/udpgso_bench_tx.c | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/so_txtime.c b/tools/testing/selftests/net/so_txtime.c index 53f598f06647..34df4c8882af 100644 --- a/tools/testing/selftests/net/so_txtime.c +++ b/tools/testing/selftests/net/so_txtime.c @@ -105,8 +105,8 @@ static void do_recv_one(int fdr, struct timed_send *ts) tstop = (gettime_ns() - glob_tstart) / 1000; texpect = ts->delay_us >= 0 ? ts->delay_us : 0;
- fprintf(stderr, "payload:%c delay:%ld expected:%ld (us)\n", - rbuf[0], tstop, texpect); + fprintf(stderr, "payload:%c delay:%lld expected:%lld (us)\n", + rbuf[0], (long long)tstop, (long long)texpect);
if (rbuf[0] != ts->data) error(1, 0, "payload mismatch. expected %c", ts->data); diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c index b8265ee9923f..cab334e51ac1 100644 --- a/tools/testing/selftests/net/udpgso.c +++ b/tools/testing/selftests/net/udpgso.c @@ -448,7 +448,8 @@ static bool __send_one(int fd, struct msghdr *msg, int flags) if (ret == -1) error(1, errno, "sendmsg"); if (ret != msg->msg_iov->iov_len) - error(1, 0, "sendto: %d != %lu", ret, msg->msg_iov->iov_len); + error(1, 0, "sendto: %d != %llu", ret, + (unsigned long long)msg->msg_iov->iov_len); if (msg->msg_flags) error(1, 0, "sendmsg: return flags 0x%x\n", msg->msg_flags);
diff --git a/tools/testing/selftests/net/udpgso_bench_tx.c b/tools/testing/selftests/net/udpgso_bench_tx.c index ada99496634a..17512a43885e 100644 --- a/tools/testing/selftests/net/udpgso_bench_tx.c +++ b/tools/testing/selftests/net/udpgso_bench_tx.c @@ -405,7 +405,8 @@ static int send_udp_segment(int fd, char *data) if (ret == -1) error(1, errno, "sendmsg"); if (ret != iov.iov_len) - error(1, 0, "sendmsg: %u != %lu\n", ret, iov.iov_len); + error(1, 0, "sendmsg: %u != %llu\n", ret, + (unsigned long long)iov.iov_len);
return 1; }
Fix warnings on __u64 and pointer translation on arm and other 32bit architectures. Since the pointer is 32bits on those archs, we should not directly cast those types.
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Emilio López emilio.lopez@collabora.co.uk --- tools/testing/selftests/sync/sync.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/sync/sync.c b/tools/testing/selftests/sync/sync.c index f3d599f249b9..7741c0518d18 100644 --- a/tools/testing/selftests/sync/sync.c +++ b/tools/testing/selftests/sync/sync.c @@ -109,7 +109,7 @@ static struct sync_file_info *sync_file_info(int fd) return NULL; }
- info->sync_fence_info = (uint64_t)fence_info; + info->sync_fence_info = (uint64_t)(unsigned long)fence_info;
err = ioctl(fd, SYNC_IOC_FILE_INFO, info); if (err < 0) { @@ -124,7 +124,7 @@ static struct sync_file_info *sync_file_info(int fd)
static void sync_file_info_free(struct sync_file_info *info) { - free((void *)info->sync_fence_info); + free((void *)(unsigned long)info->sync_fence_info); free(info); }
@@ -152,7 +152,7 @@ int sync_fence_count_with_status(int fd, int status) if (!info) return -1;
- fence_info = (struct sync_fence_info *)info->sync_fence_info; + fence_info = (struct sync_fence_info *)(unsigned long)info->sync_fence_info; for (i = 0 ; i < info->num_fences ; i++) { if (fence_info[i].status == status) count++;
linux-kselftest-mirror@lists.linaro.org