From 07a681f0d86c9980647d03265db68a4e7e3d8c10 Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Fri, 19 Aug 2016 04:13:35 +0300 Subject: [PATCH 1/4] lkl tools: add lkl_umount_timeout Signed-off-by: Octavian Purdila --- tools/lkl/include/lkl.h | 11 +++++++++++ tools/lkl/lib/fs.c | 30 +++++++++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/tools/lkl/include/lkl.h b/tools/lkl/include/lkl.h index 9d55adffbdf76b..dd6fc88e800db1 100644 --- a/tools/lkl/include/lkl.h +++ b/tools/lkl/include/lkl.h @@ -136,6 +136,17 @@ long lkl_mount_dev(unsigned int disk_id, const char *fs_type, int flags, */ long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms); +/** + * lkl_umount_timeout - umount filesystem with timeout + * + * @path - the path to unmount + * @flags - umount flags + * @timeout_ms - timeout to wait for the kernel to flush closed files so that + * umount can succeed + * @returns - 0 on success, a negative value on error + */ +long lkl_umount_timeout(char *path, int flags, long timeout_ms); + /** * lkl_opendir - open a directory * diff --git a/tools/lkl/lib/fs.c b/tools/lkl/lib/fs.c index fcc6a4164e9de1..f03c745f8afd67 100644 --- a/tools/lkl/lib/fs.c +++ b/tools/lkl/lib/fs.c @@ -130,31 +130,39 @@ long lkl_mount_dev(unsigned int disk_id, const char *fs_type, int flags, return 0; } -long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms) +long lkl_umount_timeout(char *path, int flags, long timeout_ms) { - char dev_str[] = { "/dev/xxxxxxxx" }; - char mnt_str[] = { "/mnt/xxxxxxxx" }; long incr = 10000000; /* 10 ms */ struct lkl_timespec ts = { .tv_sec = 0, .tv_nsec = incr, }; - unsigned int dev; - int err; - - dev = get_virtio_blkdev(disk_id); - - snprintf(dev_str, sizeof(dev_str), "/dev/%08x", dev); - snprintf(mnt_str, sizeof(mnt_str), "/mnt/%08x", dev); + long err; do { - err = lkl_sys_umount(mnt_str, flags); + err = lkl_sys_umount(path, flags); if (err == -LKL_EBUSY) { lkl_sys_nanosleep(&ts, NULL); timeout_ms -= incr / 1000000; } } while (err == -LKL_EBUSY && timeout_ms > 0); + return err; +} + +long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms) +{ + char dev_str[] = { "/dev/xxxxxxxx" }; + char mnt_str[] = { "/mnt/xxxxxxxx" }; + unsigned int dev; + int err; + + dev = get_virtio_blkdev(disk_id); + + snprintf(dev_str, sizeof(dev_str), "/dev/%08x", dev); + snprintf(mnt_str, sizeof(mnt_str), "/mnt/%08x", dev); + + err = lkl_umount_timeout(mnt_str, flags, timeout_ms); if (err) return err; From a191c83d2ff2c4a3e8769cf8e619af48835ae61b Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Fri, 19 Aug 2016 02:10:13 +0300 Subject: [PATCH 2/4] lkl tools: add tests for mount/umount_fs Signed-off-by: Octavian Purdila --- tools/lkl/tests/boot.c | 54 +++++++++++++++++++++++++++++++++++------- tools/lkl/tests/test.h | 29 +++++++++++------------ 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/tools/lkl/tests/boot.c b/tools/lkl/tests/boot.c index 2672fd3c122c8c..656e5b88a99e31 100644 --- a/tools/lkl/tests/boot.c +++ b/tools/lkl/tests/boot.c @@ -485,7 +485,7 @@ static int test_epoll(char *str, int len) static char mnt_point[32]; -static int test_mount(char *str, int len) +static int test_mount_dev(char *str, int len) { long ret; @@ -500,11 +500,11 @@ static int test_mount(char *str, int len) return TEST_FAILURE; } -static int test_chdir(char *str, int len) +static int test_chdir(char *str, int len, const char *path) { long ret; - ret = lkl_sys_chdir(mnt_point); + ret = lkl_sys_chdir(path); snprintf(str, len, "%ld", ret); @@ -556,7 +556,7 @@ static int test_getdents64(char *str, int len) return TEST_SUCCESS; } -static int test_umount(char *str, int len) +static int test_umount_dev(char *str, int len) { long ret, ret2, ret3; @@ -574,6 +574,36 @@ static int test_umount(char *str, int len) return TEST_FAILURE; } +static int test_mount_fs(char *str, int len, char *fs) +{ + long ret; + + ret = lkl_mount_fs(fs); + + snprintf(str, len, "%s: %ld", fs, ret); + + if (ret == 0) + return TEST_SUCCESS; + + return TEST_FAILURE; +} + +static int test_umount_fs(char *str, int len, char *fs) +{ + long ret, ret2, ret3; + + ret = lkl_sys_close(dir_fd); + ret2 = lkl_sys_chdir("/"); + ret3 = lkl_umount_timeout(fs, 0, 1000); + + snprintf(str, len, "%s: %ld %ld %ld", fs, ret, ret2, ret3); + + if (!ret && !ret2 && !ret3) + return TEST_SUCCESS; + + return TEST_FAILURE; +} + static int test_lo_ifup(char *str, int len) { long ret; @@ -781,7 +811,8 @@ int main(int argc, char **argv) lkl_host_ops.print = printk; - TEST(disk_add); + if (cla.disk_filename) + TEST(disk_add); #ifndef __MINGW32__ if (cla.tap_ifname) TEST(netdev_add); @@ -807,11 +838,18 @@ int main(int argc, char **argv) #endif /* __MINGW32__ */ TEST(pipe2); TEST(epoll); - TEST(mount); - TEST(chdir); + TEST(mount_fs, "proc"); + TEST(chdir, "proc"); TEST(opendir); TEST(getdents64); - TEST(umount); + TEST(umount_fs, "proc"); + if (cla.disk_filename) { + TEST(mount_dev); + TEST(chdir, mnt_point); + TEST(opendir); + TEST(getdents64); + TEST(umount_dev); + } TEST(lo_ifup); TEST(mutex); TEST(semaphore); diff --git a/tools/lkl/tests/test.h b/tools/lkl/tests/test.h index b2df2a184d9de8..1011cccbfa3219 100644 --- a/tools/lkl/tests/test.h +++ b/tools/lkl/tests/test.h @@ -2,20 +2,19 @@ #define TEST_FAILURE 0 #define MAX_MSG_LEN 60 - static int g_test_pass = 0; -#define TEST(name) { \ - int ret = do_test(#name, test_##name); \ - if (!ret) g_test_pass = -1; \ - } - -static int do_test(char *name, int (*fn)(char *, int)) -{ - char str[MAX_MSG_LEN]; - int result; - - result = fn(str, sizeof(str)); - printf("%-20s %s [%s]\n", name, - result == TEST_SUCCESS ? "passed" : "failed", str); - return result; +#define TEST(name, ...) \ +{ \ + char str[MAX_MSG_LEN]; \ + int (*fn)(char *str, int len, ...); \ + int ret; \ + \ + fn = (int (*)(char *str, int len, ...))test_##name; \ + ret = fn(str, sizeof(str), ##__VA_ARGS__); \ + if (!ret) \ + g_test_pass = -1; \ + \ + printf("%-20s %s [%s]\n", #name, \ + ret == TEST_SUCCESS ? "passed" : "failed", str); \ } + From 0869aa7e319aee146aea75c0165c19c5e631ea5b Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Fri, 19 Aug 2016 01:36:53 +0300 Subject: [PATCH 3/4] lkl tools: add lklfuse tests Signed-off-by: Octavian Purdila --- tools/lkl/tests/Makefile | 5 +++ tools/lkl/tests/lklfuse.sh | 71 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100755 tools/lkl/tests/lklfuse.sh diff --git a/tools/lkl/tests/Makefile b/tools/lkl/tests/Makefile index b93ae693d6363c..fbe1f8451120b5 100644 --- a/tools/lkl/tests/Makefile +++ b/tools/lkl/tests/Makefile @@ -13,6 +13,10 @@ define gdb_test TEST_CMD="gdb --args" ./boot.sh -t $1 endef +define lklfuse + for fs in $(FS_TYPES); do ./lklfuse.sh -t $$fs || exit 1; done +endef + define for_fs for fs in $(FS_TYPES); do $(call $1,$$fs); done endef @@ -41,6 +45,7 @@ endif test: $(call run,) + $(call lklfuse) $(HIJACK_TEST) ./net.sh diff --git a/tools/lkl/tests/lklfuse.sh b/tools/lkl/tests/lklfuse.sh new file mode 100755 index 00000000000000..f050ae2c13c8e8 --- /dev/null +++ b/tools/lkl/tests/lklfuse.sh @@ -0,0 +1,71 @@ +#!/bin/sh -e + +if ! [ -x ../lklfuse ]; then + echo "lklfuse not available, skipping tests" + exit 0 +fi + +if ! [ -e /dev/fuse ]; then + echo "fuse not available, skipping tests" + exit 0 +fi + +if [ "$1" = "-t" ]; then + shift + fstype=$1 + shift +fi + +if [ -z "$fstype" ]; then + fstype="ext4" +fi + +file=`mktemp` +dir=`mktemp -d` + +cleanup() +{ + cd $olddir + sleep 1 + fusermount -u $dir + rm $file + rmdir $dir +} + +basic() +{ + touch a + if ! [ -e ]; then exit 1; fi + rm a + mkdir a + if ! [ -d ]; then exit 1; fi + rmdir a +} + +trap cleanup EXIT + +olddir=`pwd` + +# create empty filesystem +dd if=/dev/zero of=$file bs=1024 seek=500000 count=1 +yes | mkfs.$fstype $file + +# mount with fuse +../lklfuse $file $dir -o type=$fstype + +cd $dir + +# run basic tests +basic + +# run stress-ng +if which stress-ng; then + if [ "$fstype" = "vfat" ]; then + exclude="chmod,filename,link,mknod,symlink,xattr" + fi + stress-ng --class filesystem --all 0 --timeout 10 \ + --exclude fiemap,$exclude --fallocate-bytes 50m \ + --sync-file-bytes 50m +else + echo "could not find stress-ng, skipping" +fi From 5c74652f85547d021edb492d1b2402311c2da298 Mon Sep 17 00:00:00 2001 From: Octavian Purdila Date: Fri, 19 Aug 2016 16:28:01 +0300 Subject: [PATCH 4/4] lkl tools: lklfuse: disabled multihreaded mode We can't properly support it because multithreading LKL leaks threads and the number of concurrent threads is limited to the maximum numbers of interrupts (64 on 64bit systems, 32 otherwise). Signed-off-by: Octavian Purdila --- tools/lkl/lklfuse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/lkl/lklfuse.c b/tools/lkl/lklfuse.c index 2c964195f8d2c3..de0e2fa267eca2 100644 --- a/tools/lkl/lklfuse.c +++ b/tools/lkl/lklfuse.c @@ -623,9 +623,9 @@ int main(int argc, char **argv) } if (mt) - ret = fuse_loop_mt(fuse); - else - ret = fuse_loop(fuse); + fprintf(stderr, "warning: multithreaded mode not supported\n"); + + ret = fuse_loop(fuse); stop_lkl();