From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41674) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VTtVC-0006rR-Dh for qemu-devel@nongnu.org; Wed, 09 Oct 2013 09:08:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VTtV6-0002I7-Au for qemu-devel@nongnu.org; Wed, 09 Oct 2013 09:08:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56299) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VTtV6-0002Hw-2f for qemu-devel@nongnu.org; Wed, 09 Oct 2013 09:08:28 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r99D8Rk3027424 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 9 Oct 2013 09:08:27 -0400 Message-ID: <52555548.2050106@redhat.com> Date: Wed, 09 Oct 2013 15:08:24 +0200 From: Hans de Goede MIME-Version: 1.0 References: <1381262298-3241-1-git-send-email-hdegoede@redhat.com> <1381262298-3241-4-git-send-email-hdegoede@redhat.com> <1381308939.12583.27.camel@nilsson.home.kraxel.org> In-Reply-To: <1381308939.12583.27.camel@nilsson.home.kraxel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 03/13] usb-host-libusb: Detach kernel drivers earlier List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org Hi, On 10/09/2013 10:55 AM, Gerd Hoffmann wrote: > On Di, 2013-10-08 at 21:58 +0200, Hans de Goede wrote: >> If we detach the kernel drivers on the first set_config, then they will >> be still attached when the device gets its initial reset. Causing the drivers >> to re-initialize the device after the reset, dirtying the device state. > >> @@ -1051,7 +1055,6 @@ static void usb_host_set_config(USBHostDevice *s, int config, USBPacket *p) >> trace_usb_host_set_config(s->bus_num, s->addr, config); >> >> usb_host_release_interfaces(s); >> - usb_host_detach_kernel(s); >> rc = libusb_set_configuration(s->dh, config); >> if (rc != 0) { >> usb_host_libusb_error("libusb_set_configuration", rc); > > Sure we can safely remove the detach_kernel here? Yes. > Assuming we have a device with multiple configurations, each > configuration has a different set of interfaces, guest switches from one > config to another. Do we correctly unbind kernel / claim interfaces > then? Yes we still have a usb_host_detach_kernel() call in the beginning of usb_host_claim_interfaces(), which gets run on the new interfaces immediately after the libusb_set_configuration call. Doing a detach_kernel after a set_config has always been necessary, since the kernel will automatically bind drivers to the new interfaces if the set_config succeeds. Doing detach_kernel before set_config is necessary if kernel drivers are attached, because the kernel will not allow a set_config if any drivers are bound. But we already do a set_config for the current config on usb_host_open() now, and if a new config gets installed we immediately detach the kernel drivers again from usb_host_claim_interfaces() so when we enter usb_host_set_config no kernel drivers, other then usbfs (the userspace access driver) will be attached, and usbfs is detached by releasing the interfaces (*). Regards, Hans *) In recent libusb versions libusb will even disallow using libusb_detach_kernel_driver to detach usbfs, so as to stop a user space program from breaking anothers userspaces program claim on the interface by completelty detaching usbfs from the interface.