[PATCH] Back off if we detect a vmmouse kernel driver v3
Sinclair Yeh
syeh at vmware.com
Tue Oct 7 08:01:08 PDT 2014
Reviewed-by: Sinclair Yeh <syeh at vmware.com>
On Mon, Oct 06, 2014 at 10:30:12PM +0200, Thomas Hellstrom wrote:
> On 10/06/2014 04:59 PM, Sinclair Yeh wrote:
> > On Mon, Oct 06, 2014 at 01:17:13PM +0200, Thomas Hellstrom wrote:
> >> If a vmmouse kernel driver is active, vmmouse input is handled by the Xorg
> >> evdev driver and not by the vmmouse driver, so make sure the vmmouse_detect
> >> utility doesn't detect a vmmouse if a kernel driver is active.
> >>
> >> v2: Change the vmmouse kernel device name, fix comment.
> >> v3: Fix up libudev error handling.
> >>
> >> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> >> ---
> >> configure.ac | 14 +++++++
> >> tools/Makefile.am | 7 +++-
> >> tools/vmmouse_detect.c | 5 +++
> >> tools/vmmouse_udev.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++
> >> 4 files changed, 129 insertions(+), 2 deletions(-)
> >> create mode 100644 tools/vmmouse_udev.c
> >>
> >> diff --git a/configure.ac b/configure.ac
> >> index ad05504..1197555 100644
> >> --- a/configure.ac
> >> +++ b/configure.ac
> >> @@ -105,6 +105,20 @@ XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
> >> XORG_DRIVER_CHECK_EXT(XINPUT, inputproto)
> >>
> >> # Checks for pkg-config packages
> >> +libudev_check=yes
> >> +AC_ARG_WITH([libudev],
> >> + [AS_HELP_STRING([--without-libudev],
> >> + [Use to build without libudev on linux])],
> >> + [if test x$withval = xno; then libudev_check=no; fi]
> >> + [])
> >> +
> >> +if test x`uname` = xLinux -a $libudev_check = yes; then
> >> + PKG_CHECK_MODULES(LIBUDEV, [libudev],
> >> + [AC_DEFINE([HAVE_LIBUDEV], 1,
> >> + [Has libudev installed])],
> >> + []);
> >> +fi
> >> +
> >> PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.1] xproto $REQUIRED_MODULES)
> >>
> >> PKG_CHECK_EXISTS([xorg-server >= 1.1.0],
> >> diff --git a/tools/Makefile.am b/tools/Makefile.am
> >> index 8ae5516..a1396ba 100644
> >> --- a/tools/Makefile.am
> >> +++ b/tools/Makefile.am
> >> @@ -22,8 +22,11 @@ bin_PROGRAMS = @DRIVER_NAME at _detect
> >>
> >> AM_CPPFLAGS = -I$(top_srcdir)/shared $(XORG_CFLAGS)
> >>
> >> - at DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c
> >> - at DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib at DRIVER_NAME@.la
> >> + at DRIVER_NAME@_detect_SOURCES = vmmouse_detect.c vmmouse_udev.c
> >> + at DRIVER_NAME@_detect_LDADD = $(top_builddir)/shared/lib at DRIVER_NAME@.la \
> >> + @LIBUDEV_LIBS@
> >> + at DRIVER_NAME@_detect_CFLAGS = @LIBUDEV_CFLAGS@
> >> +
> >>
> >> calloutsdir=$(HAL_CALLOUTS_DIR)
> >> callouts_SCRIPTS = hal-probe-vmmouse
> >> diff --git a/tools/vmmouse_detect.c b/tools/vmmouse_detect.c
> >> index 7939ff8..b743b2d 100644
> >> --- a/tools/vmmouse_detect.c
> >> +++ b/tools/vmmouse_detect.c
> >> @@ -34,6 +34,8 @@
> >> #include <signal.h>
> >> #include "vmmouse_client.h"
> >>
> >> +extern int vmmouse_uses_kernel_driver(void);
> >> +
> >> void
> >> segvCB(int sig)
> >> {
> >> @@ -46,6 +48,9 @@ segvCB(int sig)
> >> int
> >> main(void)
> >> {
> >> + if (vmmouse_uses_kernel_driver())
> >> + return 1;
> >> +
> >> /*
> >> * If the vmmouse test is not run in a VMware virtual machine, it
> >> * will segfault instead of successfully accessing the port.
> >> diff --git a/tools/vmmouse_udev.c b/tools/vmmouse_udev.c
> >> new file mode 100644
> >> index 0000000..4e51dd6
> >> --- /dev/null
> >> +++ b/tools/vmmouse_udev.c
> >> @@ -0,0 +1,105 @@
> >> +/*
> >> + * Copyright 2014 by VMware, Inc.
> >> + *
> >> + * Permission is hereby granted, free of charge, to any person obtaining a
> >> + * copy of this software and associated documentation files (the "Software"),
> >> + * to deal in the Software without restriction, including without limitation
> >> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> >> + * and/or sell copies of the Software, and to permit persons to whom the
> >> + * Software is furnished to do so, subject to the following conditions:
> >> + *
> >> + * The above copyright notice and this permission notice shall be included in
> >> + * all copies or substantial portions of the Software.
> >> + *
> >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> >> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> >> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> >> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> >> + * OTHER DEALINGS IN THE SOFTWARE.
> >> + *
> >> + * Except as contained in this notice, the name of the copyright holder(s)
> >> + * and author(s) shall not be used in advertising or otherwise to promote
> >> + * the sale, use or other dealings in this Software without prior written
> >> + * authorization from the copyright holder(s) and author(s).
> >> + */
> >> +
> >> +#ifdef HAVE_CONFIG_H
> >> +#include "config.h"
> >> +#endif
> >> +
> >> +#ifdef HAVE_LIBUDEV
> >> +#include <libudev.h>
> >> +#include <stdlib.h>
> >> +#include <string.h>
> >> +
> >> +#define KERNEL_DEVNAME "VirtualPS/2 VMware VMMouse"
> >> +
> >> +/**
> >> + * vmmouse_uses_kernel_driver - Check whether there's an active
> >> + * vmmouse driver in the kernel.
> >> + *
> >> + * Returns 0 if there was no kernel driver found.
> >> + * Returns non-zero on error or if there was an active driver found.
> >> + *
> >> + * Scans the input subsystem for devices matching KERNEL_DEVNAME. These
> >> + * devices are assumed to be active vmmouse drivers.
> >> + */
> >> +int vmmouse_uses_kernel_driver(void)
> >> +{
> >> + struct udev *udev;
> >> + struct udev_enumerate *enumerate;
> >> + struct udev_list_entry *devices, *dev_list_entry;
> >> + struct udev_device *dev;
> >> +
> >> + udev = udev_new();
> >> + if (!udev)
> >> + return 1;
> >> +
> >> + /*
> >> + * Udev error return codes that are not caught immediately are
> >> + * typically caught in the input argument check in the udev
> >> + * function calls following the failing call!
> >> + */
> >> + enumerate = udev_enumerate_new(udev);
> >> + if (udev_enumerate_add_match_subsystem(enumerate, "input"))
> >> + goto out_err;
> >> + if (udev_enumerate_scan_devices(enumerate))
> >> + goto out_err;
> >> +
> >> + devices = udev_enumerate_get_list_entry(enumerate);
> >> + udev_list_entry_foreach(dev_list_entry, devices) {
> >> + const char *path, *name;
> >> +
> >> + path = udev_list_entry_get_name(dev_list_entry);
> >> + dev = udev_device_new_from_syspath(udev, path);
> >> + if (!dev)
> >> + goto out_err;
> >> + name = udev_device_get_sysattr_value(dev, "name");
> >> + if (name && !strcasecmp(name, KERNEL_DEVNAME))
> >> + goto out_found;
> >> +
> >> + udev_device_unref(dev);
> >> + }
> >> +
> >> + out_not_found:
> >> + udev_enumerate_unref(enumerate);
> >> + udev_unref(udev);
> >> +
> >> + return 0;
> >> +
> >> + out_found:
> >> + udev_device_unref(dev);
> >> + out_err:
> >> + udev_enumerate_unref(enumerate);
> >> + udev_unref(udev);
> > If there's an error, would it make sense to let the vmmouse driver try
> > to drive it, e.g. return 0?
>
> If udev errors, and we enable the user-space vmmouse driver, it might
> clash with a kernel driver which is a bad situation. If we instead back
> off, the mouse will be treated as a normal ps/2 mouse. We'll lose the
> VMMouse features, but the mouse will still work.
>
> >
> > It seems to me that the failure case should return the same value as
> > the case when udev is not enabled.
> The --without-libudev option is intended for the situation where the
> distro maintainer knows for sure that there will be no kernel vmmouse
> driver enabled and where he doesn't want to or can't introduce a libudev
> dependency. In that situation, we always enable the vmmouse.
>
> > I'm not sure how udev is used in vmmouse driver, so maybe it'll run
> > into the same failure on its side. In that case the code looks okay
> > to me.
>
> The vmmouse driver itself doesn't use libudev, so the errors are treated
> the way they are only because of the above considerations.
>
> > Sinclair
> >
> >
>
> Thanks,
> Thomas
>
>
>
> >> +
> >> + return 1;
> >> +}
> >> +#else
> >> +int vmmouse_uses_kernel_driver(void)
> >> +{
> >> + return 0;
> >> +}
> >> +#endif
> >> --
> >> 1.8.3.2
> >>
>
More information about the xorg-devel
mailing list