Without the patch, vmw_vsock_vmci_transport.ko can automatically load when an application creates an AF_VSOCK socket. This is the expected good behavior on VMware hypervisor, but as we are going to add hv_sock.ko (i.e. Hyper-V transport for AF_VSOCK), we should make sure vmw_vsock_vmci_transport.ko can't load on Hyper-V, otherwise there is a -EBUSY conflict when both vmw_vsock_vmci_transport.ko and hv_sock.ko try to call vsock_core_init() on Hyper-V. On the other hand, hv_sock.ko can only load on Hyper-V, because it depends on hv_vmbus.ko, which detects Hyper-V in hv_acpi_init(). KVM's vsock_virtio_transport doesn't have the issue because it doesn't define MODULE_ALIAS_NETPROTO(PF_VSOCK). The patch also adds a module parameter "skip_hypervisor_check" for vmw_vsock_vmci_transport.ko. Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx> Cc: Alok Kataria <akataria@xxxxxxxxxx> Cc: Andy King <acking@xxxxxxxxxx> Cc: Adit Ranadive <aditr@xxxxxxxxxx> Cc: George Zhang <georgezhang@xxxxxxxxxx> Cc: Jorgen Hansen <jhansen@xxxxxxxxxx> Cc: K. Y. Srinivasan <kys@xxxxxxxxxxxxx> Cc: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> Cc: Stephen Hemminger <sthemmin@xxxxxxxxxxxxx> --- net/vmw_vsock/Kconfig | 2 +- net/vmw_vsock/vmci_transport.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/net/vmw_vsock/Kconfig b/net/vmw_vsock/Kconfig index a24369d..3f52929 100644 --- a/net/vmw_vsock/Kconfig +++ b/net/vmw_vsock/Kconfig @@ -17,7 +17,7 @@ config VSOCKETS config VMWARE_VMCI_VSOCKETS tristate "VMware VMCI transport for Virtual Sockets" - depends on VSOCKETS && VMWARE_VMCI + depends on VSOCKETS && VMWARE_VMCI && HYPERVISOR_GUEST help This module implements a VMCI transport for Virtual Sockets. diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 10ae782..c068873 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -16,6 +16,7 @@ #include <linux/types.h> #include <linux/bitops.h> #include <linux/cred.h> +#include <linux/hypervisor.h> #include <linux/init.h> #include <linux/io.h> #include <linux/kernel.h> @@ -73,6 +74,10 @@ struct vmci_transport_recv_pkt_info { struct vmci_transport_packet pkt; }; +static bool skip_hypervisor_check; +module_param(skip_hypervisor_check, bool, 0444); +MODULE_PARM_DESC(hot_add, "If set, attempt to load on non-VMware platforms"); + static LIST_HEAD(vmci_transport_cleanup_list); static DEFINE_SPINLOCK(vmci_transport_cleanup_lock); static DECLARE_WORK(vmci_transport_cleanup_work, vmci_transport_cleanup); @@ -2085,6 +2090,12 @@ static int __init vmci_transport_init(void) { int err; + /* Check if we are running on VMware's hypervisor and bail out + * if we are not. + */ + if (!skip_hypervisor_check && x86_hyper != &x86_hyper_vmware) + return -ENODEV; + /* Create the datagram handle that we will use to send and receive all * VSocket control messages for this context. */ -- 2.7.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel