Return-Path: Subject: Re: [PATCH] Wait for child devices to go away before deleting a connection From: Marcel Holtmann To: Brian Rogers Cc: linux-bluetooth@vger.kernel.org, Kay Sievers , David Woodhouse In-Reply-To: <4A711294.5010901@xyzw.org> References: <4A6424D8.3040306@xyzw.org> <1248077430.4549.97.camel@violet> <4A6864DE.5010501@xyzw.org> <1248901964.28545.242.camel@violet> <4A70CF45.1060706@xyzw.org> <1248921191.28545.251.camel@violet> <4A711294.5010901@xyzw.org> Content-Type: text/plain Date: Thu, 30 Jul 2009 05:49:12 +0200 Message-Id: <1248925752.28545.260.camel@violet> Mime-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org List-ID: Hi Brian, > >>>>> Kay, David, wouldn't be pinning of the parent device here be enough to > >>>>> get this done in a clean way? > >>>>> > >>>>> > >>>>> > >>>> If there's a way that the connection can be pinned until the child > >>>> devices go away, that definitely sounds cleaner to me. > >>>> > >>>> > >>> so I pushed some patches to bluetooth-testing tree that should fix this > >>> problem. They are not fully tested by me. Please test and report back > >>> the results. > >>> > >>> > >> Fails to compile if CONFIG_USB_HIDDEV=y : > >> > >> ERROR: "hiddev_disconnect" [net/bluetooth/hidp/hidp.ko] undefined! > >> > >> Ironically, the reference to hiddev_disconnect is fine if hiddev isn't > >> enabled because then hiddev.h supplies an empty static inline function. > >> > >> I'm going to test with a kernel without hiddev for now. > >> > > > > just take that piece out of the patch. It is not important. I just wanna > > now if the uevents are now coming in order. > > > > I just tried it without hiddev and observed that the input devices go > away, but the connection never gets deleted. Then when I turn my mouse > back on, bad stuff happens: I do have a typo here :( void hci_conn_hold_device(struct hci_conn *conn) { hci_conn_hold(conn); atomic_inc(&conn->devref); } EXPORT_SYMBOL(hci_conn_hold_device); void hci_conn_put_device(struct hci_conn *conn) { if (atomic_dec_and_test(&conn->refcnt)) hci_conn_del_sysfs(conn); hci_conn_put(conn); } EXPORT_SYMBOL(hci_conn_put_device); The atomic_dec_and_test() should operate on conn->devref. Can you change that and try again. Also if that doesn't help, remove the hci_conn_hold() and hci_conn_put() from the two functions above and try again. Regards Marcel