Hi,
Here are some patches to fix some warnings/issues on 32bit arch (e.g. arm).
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 3GB 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 3GB on 32bit arch like i386 and arm.
Signed-off-by: Masami Hiramatsu mhiramat@kernel.org Cc: Alexey Dobriyan adobriyan@gmail.com --- .../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..d517f8c479fb 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 (3UL << 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 Tue, Oct 08, 2019 at 12:10:26AM +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 3GB on 32bit arch like i386 and arm.
IIRC i386 had 1G/3G split, so 3GB would be too much still.
--- a/tools/testing/selftests/proc/proc-self-map-files-002.c +++ b/tools/testing/selftests/proc/proc-self-map-files-002.c
+#if __BITS_PER_LONG == 32 +# define VA_MAX (3UL << 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;
This limit doesn't need to be precise, 1GB is "big enough".
On Tue, 8 Oct 2019 20:59:16 +0300 Alexey Dobriyan adobriyan@gmail.com wrote:
On Tue, Oct 08, 2019 at 12:10:26AM +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 3GB on 32bit arch like i386 and arm.
IIRC i386 had 1G/3G split, so 3GB would be too much still.
Hmm, would you know what is the best value for that? i386 can also be configured 3G/1G, 2G/2G and 1G/3G, so it depends on the build configuration. Would 1G is enough for test?
Thank you,
--- a/tools/testing/selftests/proc/proc-self-map-files-002.c +++ b/tools/testing/selftests/proc/proc-self-map-files-002.c
+#if __BITS_PER_LONG == 32 +# define VA_MAX (3UL << 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;
This limit doesn't need to be precise, 1GB is "big enough".
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++;
On 10/7/19 9:10 AM, Masami Hiramatsu wrote:
Hi,
Here are some patches to fix some warnings/issues on 32bit arch (e.g. arm).
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 3GB 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
Hi Masami,
I would love to pull these in. But looks like these are spread out across several sub-systems.
There are some comments on vm patch. Do you mind sending them again cc'ing everybody on the cover-letter. Looks like these are getting lost in the noise.
thanks, -- Shuah
Hi Shuah,
On Fri, 18 Oct 2019 15:45:56 -0600 shuah shuah@kernel.org wrote:
On 10/7/19 9:10 AM, Masami Hiramatsu wrote:
Hi,
Here are some patches to fix some warnings/issues on 32bit arch (e.g. arm).
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 3GB 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
Hi Masami,
I would love to pull these in. But looks like these are spread out across several sub-systems.
Right.
There are some comments on vm patch. Do you mind sending them again cc'ing everybody on the cover-letter. Looks like these are getting lost in the noise.
OK, I'll update it and resend.
Thank you,
thanks, -- Shuah
linux-kselftest-mirror@lists.linaro.org