Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Function not implemented when using libaio #114

Open
martin-g opened this issue Jun 18, 2020 · 5 comments
Open

Function not implemented when using libaio #114

martin-g opened this issue Jun 18, 2020 · 5 comments

Comments

@martin-g
Copy link

martin-g commented Jun 18, 2020

/kind question

Function not implemented when trying to use Linux libaio in foreign architecture.

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. 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]
  ^D

  gcc test.c -o out -laio && ./out

When executed on aarch64 machine 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: I am not sure how to get that information. I use fresh download of multiarch/qemu-user-static Docker image
  • 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:        

Additional information optionally:

Same happens with Ubuntu (arm64v8/ubuntu:focal).

Any idea what could be the problem ?
I've googled a lot but I wasn't able to find any problems related to libaio on QEMU.

Thank you!

@martin-g
Copy link
Author

martin-g commented Jun 19, 2020

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:

  1. docker run --rm -it --security-opt seccomp:unconfined --security-opt apparmor:unconfined --privileged --cap-add ALL arm64v8/centos:8 bash
    Note: I used --privileged, disabled seccomp and apparmor, and added all capabilities
  2. yum install -y strace
  3. strace echo Test

Disabling security solves the "Permission denied" problem but then comes the "Not implemented" one.

@umarcor
Copy link

umarcor commented Jun 20, 2020

@martin-g, this seems to be a missing feature upstream. I suggest to open a report in https://bugs.launchpad.net/qemu.

@martin-g
Copy link
Author

Thanks for the response, @umarcor !

One question before I do that:
How to find out which version of QEMU is being used by multiarch/qemu-user-static ?

@umarcor
Copy link

umarcor commented Jun 22, 2020

@martin-g
Copy link
Author

https://bugs.launchpad.net/qemu/+bug/1884719

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants