[PATCH] qemu: modprobe vhost-vsock module

Nikolay Shirokovskiy posted 1 patch 3 years, 8 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/1595930287-902430-1-git-send-email-nshirokovskiy@virtuozzo.com
src/qemu/qemu_process.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
[PATCH] qemu: modprobe vhost-vsock module
Posted by Nikolay Shirokovskiy 3 years, 8 months ago
/dev/vhost-vsock is usable only if the module is loaded.  Let's load the module
just like in other places where kernel module is required (nbd, pci stub
driver).

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
---
 src/qemu/qemu_process.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ec6ca14..5aaa77c 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -92,6 +92,7 @@
 #include "viridentity.h"
 #include "virthreadjob.h"
 #include "virutil.h"
+#include "virkmod.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -6414,6 +6415,7 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
     return 0;
 }
 
+#define VHOST_VSOCK_MODULE "vhost-vsock"
 
 int
 qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
@@ -6422,6 +6424,22 @@ qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
     const char *vsock_path = "/dev/vhost-vsock";
     int fd;
 
+    if (virKModIsProhibited(VHOST_VSOCK_MODULE)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Failed to load vhost-vsock module: "
+                         "administratively prohibited"));
+        return -1;
+    } else {
+        g_autofree char *errbuf = NULL;
+
+        if ((errbuf = virKModLoad(VHOST_VSOCK_MODULE))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Failed to load vhost-vsock module: %s"),
+                           errbuf);
+            return -1;
+        }
+    }
+
     if ((fd = open(vsock_path, O_RDWR)) < 0) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        "%s", _("unable to open vhost-vsock device"));
-- 
1.8.3.1

Re: [PATCH] qemu: modprobe vhost-vsock module
Posted by Stefano Garzarella 3 years, 8 months ago
On Tue, Jul 28, 2020 at 12:58:07PM +0300, Nikolay Shirokovskiy wrote:
> /dev/vhost-vsock is usable only if the module is loaded.  Let's load the module
> just like in other places where kernel module is required (nbd, pci stub
> driver).

Just a note, starting from Linux 4.13 (f4660cc994e1 ("vhost/vsock: use static
minor number")) the kernel module should be automatically loaded when an
application try to open /dev/vhost-vsock.

Did you find a case where that doesn't happen?

Thanks,
Stefano

> 
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
> ---
>  src/qemu/qemu_process.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index ec6ca14..5aaa77c 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -92,6 +92,7 @@
>  #include "viridentity.h"
>  #include "virthreadjob.h"
>  #include "virutil.h"
> +#include "virkmod.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_QEMU
>  
> @@ -6414,6 +6415,7 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
>      return 0;
>  }
>  
> +#define VHOST_VSOCK_MODULE "vhost-vsock"
>  
>  int
>  qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
> @@ -6422,6 +6424,22 @@ qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
>      const char *vsock_path = "/dev/vhost-vsock";
>      int fd;
>  
> +    if (virKModIsProhibited(VHOST_VSOCK_MODULE)) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Failed to load vhost-vsock module: "
> +                         "administratively prohibited"));
> +        return -1;
> +    } else {
> +        g_autofree char *errbuf = NULL;
> +
> +        if ((errbuf = virKModLoad(VHOST_VSOCK_MODULE))) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Failed to load vhost-vsock module: %s"),
> +                           errbuf);
> +            return -1;
> +        }
> +    }
> +
>      if ((fd = open(vsock_path, O_RDWR)) < 0) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                         "%s", _("unable to open vhost-vsock device"));
> -- 
> 1.8.3.1
> 

Re: [PATCH] qemu: modprobe vhost-vsock module
Posted by Nikolay Shirokovskiy 3 years, 8 months ago

On 28.07.2020 13:12, Stefano Garzarella wrote:
> On Tue, Jul 28, 2020 at 12:58:07PM +0300, Nikolay Shirokovskiy wrote:
>> /dev/vhost-vsock is usable only if the module is loaded.  Let's load the module
>> just like in other places where kernel module is required (nbd, pci stub
>> driver).
> 
> Just a note, starting from Linux 4.13 (f4660cc994e1 ("vhost/vsock: use static
> minor number")) the kernel module should be automatically loaded when an
> application try to open /dev/vhost-vsock.
> 
> Did you find a case where that doesn't happen?
> 

Nope, it is just older kernel.

Nikolay

> 
>>
>> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
>> ---
>>  src/qemu/qemu_process.c | 18 ++++++++++++++++++
>>  1 file changed, 18 insertions(+)
>>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index ec6ca14..5aaa77c 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -92,6 +92,7 @@
>>  #include "viridentity.h"
>>  #include "virthreadjob.h"
>>  #include "virutil.h"
>> +#include "virkmod.h"
>>  
>>  #define VIR_FROM_THIS VIR_FROM_QEMU
>>  
>> @@ -6414,6 +6415,7 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
>>      return 0;
>>  }
>>  
>> +#define VHOST_VSOCK_MODULE "vhost-vsock"
>>  
>>  int
>>  qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
>> @@ -6422,6 +6424,22 @@ qemuProcessOpenVhostVsock(virDomainVsockDefPtr vsock)
>>      const char *vsock_path = "/dev/vhost-vsock";
>>      int fd;
>>  
>> +    if (virKModIsProhibited(VHOST_VSOCK_MODULE)) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                       _("Failed to load vhost-vsock module: "
>> +                         "administratively prohibited"));
>> +        return -1;
>> +    } else {
>> +        g_autofree char *errbuf = NULL;
>> +
>> +        if ((errbuf = virKModLoad(VHOST_VSOCK_MODULE))) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                           _("Failed to load vhost-vsock module: %s"),
>> +                           errbuf);
>> +            return -1;
>> +        }
>> +    }
>> +
>>      if ((fd = open(vsock_path, O_RDWR)) < 0) {
>>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>                         "%s", _("unable to open vhost-vsock device"));
>> -- 
>> 1.8.3.1
>>
>