[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug 1884719] [NEW] Function not implemented when using libaio
From: |
Stefan Hajnoczi |
Subject: |
Re: [Bug 1884719] [NEW] Function not implemented when using libaio |
Date: |
Mon, 29 Jun 2020 11:43:08 +0100 |
On Tue, Jun 23, 2020 at 07:39:58AM -0000, Martin Grigorov wrote:
> Public bug reported:
CCing Filip and Laurent, who may be interested in adding Linux AIO
syscalls to qemu-user.
>
> Hello
>
> I experience "Function not implemented" errors when trying to use Linux
> libaio library in foreign architecture, e.g. aarch64.
>
> I've faced this problem while using
> https://github.com/multiarch/qemu-user-static, i.e. Docker+QEMU.
> I understand that I do not use plain QEMU and you may count this report as a
> "distribution of QEMU"! Just let me know what are the steps to test it with
> plain QEMU and I will test and update this ticket!
>
>
> Here are the steps to reproduce the issue:
>
> 1) On x86_64 machine register QEMU:
>
> `docker run -it --rm --privileged multiarch/qemu-user-static --reset
> --credential yes --persistent yes`
>
> 2) Start a Docker image with foreign CPU architecture, e.g. aarch64
>
> `docker run -it arm64v8/centos:8 bash`
>
> 3) Inside the Docker container install GCC and libaio
>
> `yum install gcc libaio libaio-devel`
>
> 4) Compile the following C program
>
> ```
> #include <stdio.h>
> #include <errno.h>
> #include <libaio.h>
> #include <stdlib.h>
>
> struct io_control {
> io_context_t ioContext;
> };
>
> int main() {
> int queueSize = 10;
>
> struct io_control * theControl = (struct io_control *)
> malloc(sizeof(struct io_control));
> if (theControl == NULL) {
> printf("theControl is NULL");
> return 123;
> }
>
> int res = io_queue_init(queueSize, &theControl->ioContext);
> io_queue_release(theControl->ioContext);
> free(theControl);
> printf("res is: %d", res);
> }
> ```
>
> ```
> cat > test.c
> [PASTE THE CODE ABOVE HERE]
> ^D
> ```
>
> `gcc test.c -o out -laio && ./out`
>
>
> When executed directly on aarch64 machine (i.e. without emulation) or on
> x86_64 Docker image (e.g. centos:8) it prints `res is: 0`, i.e. it
> successfully initialized a LibAIO queue.
>
> But when executed on Docker image with foreign/emulated CPU architecture
> it prints `res is: -38` (ENOSYS). `man io_queue_init` says that error
> ENOSYS is returned when "Not implemented."
>
> Environment:
>
> QEMU version: 5.0.0.2
> (https://github.com/multiarch/qemu-user-static/blob/master/.travis.yml#L24-L28)
> Container application: Docker
> Output of `docker --version`:
>
> ```
> Client:
> Version: 19.03.8
> API version: 1.40
> Go version: go1.13.8
> Git commit: afacb8b7f0
> Built: Wed Mar 11 23:42:35 2020
> OS/Arch: linux/amd64
> Experimental: false
>
> Server:
> Engine:
> Version: 19.03.8
> API version: 1.40 (minimum version 1.12)
> Go version: go1.13.8
> Git commit: afacb8b7f0
> Built: Wed Mar 11 22:48:33 2020
> OS/Arch: linux/amd64
> Experimental: false
> containerd:
> Version: 1.3.3-0ubuntu2
> GitCommit:
> runc:
> Version: spec: 1.0.1-dev
> GitCommit:
> docker-init:
> Version: 0.18.0
> GitCommit:
> ```
>
> Same happens with Ubuntu (arm64v8/ubuntu:focal).
>
> I've tried to `strace` it but :
>
> ```
> /usr/bin/strace: ptrace(PTRACE_TRACEME, ...): Function not implemented
> /usr/bin/strace: PTRACE_SETOPTIONS: Function not implemented
> /usr/bin/strace: detach: waitpid(112): No child processes
> /usr/bin/strace: Process 112 detached
> ```
>
> Here are the steps to reproduce the problem with strace:
>
> ```
> docker run --rm -it --security-opt seccomp:unconfined --security-opt
> apparmor:unconfined --privileged --cap-add ALL arm64v8/centos:8 bash
>
> yum install -y strace`
>
> strace echo Test
> ```
>
> Note: I used --privileged, disabled seccomp and apparmor, and added all
> capabilities
>
> Disabling security solves the "Permission denied" problem but then comes
> the "Not implemented" one.
>
>
> Any idea what could be the problem and how to work it around ?
> I've googled a lot but I wasn't able to find any problems related to libaio
> on QEMU.
>
> Thank you!
> Martin
>
> ** Affects: qemu
> Importance: Undecided
> Status: New
>
> --
> You received this bug notification because you are a member of qemu-
> devel-ml, which is subscribed to QEMU.
> https://bugs.launchpad.net/bugs/1884719
>
> Title:
> Function not implemented when using libaio
>
> Status in QEMU:
> New
>
> Bug description:
> Hello
>
> I experience "Function not implemented" errors when trying to use
> Linux libaio library in foreign architecture, e.g. aarch64.
>
> I've faced this problem while using
> https://github.com/multiarch/qemu-user-static, i.e. Docker+QEMU.
> I understand that I do not use plain QEMU and you may count this report as
> a "distribution of QEMU"! Just let me know what are the steps to test it with
> plain QEMU and I will test and update this ticket!
>
>
> Here are the steps to reproduce the issue:
>
> 1) On x86_64 machine register QEMU:
>
> `docker run -it --rm --privileged multiarch/qemu-user-static
> --reset --credential yes --persistent yes`
>
> 2) Start a Docker image with foreign CPU architecture, e.g. aarch64
>
> `docker run -it arm64v8/centos:8 bash`
>
> 3) Inside the Docker container install GCC and libaio
>
> `yum install gcc libaio libaio-devel`
>
> 4) Compile the following C program
>
> ```
> #include <stdio.h>
> #include <errno.h>
> #include <libaio.h>
> #include <stdlib.h>
>
> struct io_control {
> io_context_t ioContext;
> };
>
> int main() {
> int queueSize = 10;
>
> struct io_control * theControl = (struct io_control *)
> malloc(sizeof(struct io_control));
> if (theControl == NULL) {
> printf("theControl is NULL");
> return 123;
> }
>
> int res = io_queue_init(queueSize, &theControl->ioContext);
> io_queue_release(theControl->ioContext);
> free(theControl);
> printf("res is: %d", res);
> }
> ```
>
> ```
> cat > test.c
> [PASTE THE CODE ABOVE HERE]
> ^D
> ```
>
> `gcc test.c -o out -laio && ./out`
>
>
> When executed directly on aarch64 machine (i.e. without emulation) or on
> x86_64 Docker image (e.g. centos:8) it prints `res is: 0`, i.e. it
> successfully initialized a LibAIO queue.
>
> But when executed on Docker image with foreign/emulated CPU
> architecture it prints `res is: -38` (ENOSYS). `man io_queue_init`
> says that error ENOSYS is returned when "Not implemented."
>
> Environment:
>
> QEMU version: 5.0.0.2
> (https://github.com/multiarch/qemu-user-static/blob/master/.travis.yml#L24-L28)
> Container application: Docker
> Output of `docker --version`:
>
> ```
> Client:
> Version: 19.03.8
> API version: 1.40
> Go version: go1.13.8
> Git commit: afacb8b7f0
> Built: Wed Mar 11 23:42:35 2020
> OS/Arch: linux/amd64
> Experimental: false
>
> Server:
> Engine:
> Version: 19.03.8
> API version: 1.40 (minimum version 1.12)
> Go version: go1.13.8
> Git commit: afacb8b7f0
> Built: Wed Mar 11 22:48:33 2020
> OS/Arch: linux/amd64
> Experimental: false
> containerd:
> Version: 1.3.3-0ubuntu2
> GitCommit:
> runc:
> Version: spec: 1.0.1-dev
> GitCommit:
> docker-init:
> Version: 0.18.0
> GitCommit:
> ```
>
> Same happens with Ubuntu (arm64v8/ubuntu:focal).
>
> I've tried to `strace` it but :
>
> ```
> /usr/bin/strace: ptrace(PTRACE_TRACEME, ...): Function not implemented
> /usr/bin/strace: PTRACE_SETOPTIONS: Function not implemented
> /usr/bin/strace: detach: waitpid(112): No child processes
> /usr/bin/strace: Process 112 detached
> ```
>
> Here are the steps to reproduce the problem with strace:
>
> ```
> docker run --rm -it --security-opt seccomp:unconfined --security-opt
> apparmor:unconfined --privileged --cap-add ALL arm64v8/centos:8 bash
>
> yum install -y strace`
>
> strace echo Test
> ```
>
> Note: I used --privileged, disabled seccomp and apparmor, and added
> all capabilities
>
> Disabling security solves the "Permission denied" problem but then
> comes the "Not implemented" one.
>
>
> Any idea what could be the problem and how to work it around ?
> I've googled a lot but I wasn't able to find any problems related to libaio
> on QEMU.
>
> Thank you!
> Martin
>
> To manage notifications about this bug go to:
> https://bugs.launchpad.net/qemu/+bug/1884719/+subscriptions
>
signature.asc
Description: PGP signature