Launchpad has imported 15 comments from the remote bug at
https://bugzilla.kernel.org/show_bug.cgi?id=204275.

If you reply to an imported comment from within Launchpad, your comment
will be sent to the remote bug automatically. Read more about
Launchpad's inter-bugtracker facilities at
https://help.launchpad.net/InterBugTracking.

------------------------------------------------------------------------
On 2019-07-22T13:36:29+00:00 steve wrote:

Many bluetooth HID keyboard profile devices disconnect on idle to save
power, I have two such devices:

Logitech Y-X5A77 keyboard

Sony PS3 bluetooth remote control

When the device disconnects on idle the g_io_channels get disconnected

bluetoothd[3167]: profiles/input/device.c:ctrl_watch_cb() Device 
00:07:61:F6:C9:7D disconnected
bluetoothd[3167]: profiles/input/device.c:intr_watch_cb() Device 
00:07:61:F6:C9:7D disconnected

But, something isn't closed properly (possibly g_io_add_watch) since
bluetoothd then spins at 100% CPU in g_main_loop_run() until the device
reconnects, at which point every works normally again until the device
next idles.

This bug has been present for at least 2 years, I'm certain it's much
longer:

https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/11

------------------------------------------------------------------------
On 2019-07-22T14:22:28+00:00 steve wrote:

I've tried adding g_source_remove()s for ctrl_watch and intr_watch
before shutting down the io channels but it doesn't make any difference.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/12

------------------------------------------------------------------------
On 2019-07-22T19:36:06+00:00 steve wrote:

strace results in continuous repeating:

poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7,
events=POLLIN}, {fd=8, events=POLLIN}, {fd=10, events=POLLIN}, {fd=11,
events=POLLIN}, {fd=12, events=POLLIN}, {fd=16, events=POLLIN}, {fd=17,
events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}, {fd=20,
events=POLLIN}, {fd=21, events=POLLIN}, {fd=22, events=POLLIN}, {fd=23,
events=POLLIN}, {fd=42, events=POLLIN}, {fd=43, events=POLLIN}, {fd=44,
events=POLLIN}, {fd=45, events=POLLIN}, {fd=46, events=POLLIN}, {fd=47,
events=POLLIN}, {fd=48, events=POLLIN}, {fd=49, events=POLLIN}, {fd=50,
events=POLLIN}, {fd=51, events=POLLIN}, {fd=52, events=POLLIN}, {fd=53,
events=POLLIN}, {fd=55, events=POLLOUT}], 28, -1) = 1 ([{fd=55,
revents=POLLNVAL}])

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/13

------------------------------------------------------------------------
On 2019-07-22T20:54:45+00:00 steve wrote:

Ahhh...

I was already aware that on first connect the HID input device wasn't
created, but I hadn't realised it's part of the same bug.

What's happening is that on initial connect:

 dev->sec_watch = g_io_add_watch(idev->intr_io, G_IO_OUT,
                                                        encrypt_notify, idev);

creates the notify callback.  But it never triggers.  On second
connection the callback gets triggered, but the connect code gets run
again so another refcount is added.  This means the intr channel never
gets closed which means it's stuck on the last event.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/14

------------------------------------------------------------------------
On 2019-07-22T21:00:23+00:00 steve wrote:

I flipped the G_IO_OUT to G_IO_IN and it started working on first
connect.  I don't know why it was G_IO_OUT?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/15

------------------------------------------------------------------------
On 2019-07-22T23:56:16+00:00 steve wrote:

Created attachment 283925
Patch to fix high CPU usage with HID keyboard and other devices

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/16

------------------------------------------------------------------------
On 2019-07-24T11:14:41+00:00 luiz.dentz wrote:

Ive sent a fix upstream:

https://lore.kernel.org/linux-
bluetooth/20190724110151.4258-1-luiz.de...@gmail.com/T/#u

Let me know if that works.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/17

------------------------------------------------------------------------
On 2019-07-24T15:31:20+00:00 steve wrote:

(In reply to Luiz Von Dentz from comment #6)
> Ive sent a fix upstream:
> 
> https://lore.kernel.org/linux-bluetooth/20190724110151.4258-1-luiz.
> de...@gmail.com/T/#u
> 
> Let me know if that works.

That will prevent the channel getting left dangling, but it doesn't
address the issue of the callback not happening on initial connect,
which is AFAICT what results in that part of the bug for me.

Is it really supposed to be waiting for G_IO_OUT?  It seems it only gets
triggered for me when a second connection is attempted on the dangling
channel, presumably during handshake..?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/18

------------------------------------------------------------------------
On 2019-07-25T09:04:46+00:00 steve wrote:

Luiz, did you see (In reply to Luiz Von Dentz from comment #6)
> Ive sent a fix upstream:
> 
> https://lore.kernel.org/linux-bluetooth/20190724110151.4258-1-luiz.
> de...@gmail.com/T/#u
> 
> Let me know if that works.

Luiz, did you see the patch I attached?  Perhaps it's better to remove
the old watcher first than not add another if it exists, but it
shouldn't happen anyway.  The explicit remove should happen to catch the
case where the connection is broken before being fully initialised but
the callback should get triggered once data starts to flow over the
encrypted channel.

In my tests, allowing the channel to fully close by removing the
sec_watch prevents the keyboard from ever connecting, this is because
the callback never gets triggered.  I believe the bug is caused by the
refcount sec_watch creates not being automatically removed because the
callback is left pending, it doesn't get removed on channel shutdown,
but has the side-effect of making it work with the channel being already
open when the device reconnects because it triggers the callback.

What made it work every time is changing sec_watch to wait for G_IO_IN
instead of G_IO_OUT, but presumably it is G_IO_OUT for a reason?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/19

------------------------------------------------------------------------
On 2019-07-25T13:13:34+00:00 luiz.dentz wrote:

Im not sure we even need the watch in the first place, the kernel should
block any in/out until the connection is encrypted (BT_SK_SUSPEND) so it
might be possible to get rid of sec_watch altogether.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/20

------------------------------------------------------------------------
On 2019-07-29T13:52:47+00:00 steve wrote:

(In reply to Luiz Von Dentz from comment #9)
> Im not sure we even need the watch in the first place, the kernel should
> block any in/out until the connection is encrypted (BT_SK_SUSPEND) so it
> might be possible to get rid of sec_watch altogether.

Going through the history it originally worked that way, I'm not sure
why it was changed..?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/21

------------------------------------------------------------------------
On 2019-07-29T13:56:22+00:00 luiz.dentz wrote:

(In reply to Steven Newbury from comment #10)
> (In reply to Luiz Von Dentz from comment #9)
> > Im not sure we even need the watch in the first place, the kernel should
> > block any in/out until the connection is encrypted (BT_SK_SUSPEND) so it
> > might be possible to get rid of sec_watch altogether.
> 
> Going through the history it originally worked that way, I'm not sure why it
> was changed..?

Well lets try to remove it then and see if that fix the problem.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/22

------------------------------------------------------------------------
On 2019-08-01T18:03:14+00:00 steve wrote:

(In reply to Luiz Von Dentz from comment #11)
> (In reply to Steven Newbury from comment #10)
> > (In reply to Luiz Von Dentz from comment #9)
> > > Im not sure we even need the watch in the first place, the kernel should
> > > block any in/out until the connection is encrypted (BT_SK_SUSPEND) so it
> > > might be possible to get rid of sec_watch altogether.
> > 
> > Going through the history it originally worked that way, I'm not sure why
> it
> > was changed..?
> 
> Well lets try to remove it then and see if that fix the problem.

That works.  I'll attach a patch on here.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/23

------------------------------------------------------------------------
On 2019-08-01T18:12:12+00:00 steve wrote:

Created attachment 284073
Remove sec_watch, instead attempt immediate connection

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/24

------------------------------------------------------------------------
On 2019-08-10T07:40:08+00:00 luiz.dentz wrote:

(In reply to Steven Newbury from comment #13)
> Created attachment 284073 [details]
> Remove sec_watch, instead attempt immediate connection

Could you please send as a patch to linux-bluetooth?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1717796/comments/25


** Changed in: bluez
       Status: Unknown => Confirmed

** Changed in: bluez
   Importance: Unknown => Medium

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to bluez in Ubuntu.
https://bugs.launchpad.net/bugs/1717796

Title:
  Bluetoothd fills 100% CPU when bluetooth keyboard goes in idle

Status in Bluez Utilities:
  Confirmed
Status in The Ubuntu Power Consumption Project:
  Confirmed
Status in bluez package in Ubuntu:
  Confirmed

Bug description:
  When bluetooth keyboard goes in idle bluetoothd fills 100% CPU. At
  this point you have to press any key to reconnect the device and let
  bluetoothd to return to work normally.

  ProblemType: Bug
  DistroRelease: Ubuntu 16.04
  Package: bluez 5.37-0ubuntu5.1
  ProcVersionSignature: Ubuntu 4.4.0-93.116-generic 4.4.79
  Uname: Linux 4.4.0-93-generic x86_64
  ApportVersion: 2.20.1-0ubuntu2.10
  Architecture: amd64
  Date: Sun Sep 17 19:02:40 2017
  ExecutablePath: /usr/lib/bluetooth/bluetoothd
  InstallationDate: Installed on 2016-08-06 (406 days ago)
  InstallationMedia: Ubuntu 16.04 LTS "Xenial Xerus" - Release amd64 
(20160420.1)
  InterestingModules: rfcomm bnep btusb bluetooth
  MachineType: GIGABYTE GB-BXBT-2807
  ProcEnviron:
   LANG=it_IT.UTF-8
   PATH=(custom, no user)
  ProcKernelCmdLine: BOOT_IMAGE=/boot/vmlinuz-4.4.0-93-generic.efi.signed 
root=UUID=8931ead4-8d43-4aef-8946-c7845c63c7d3 ro quiet splash vt.handoff=7
  SourcePackage: bluez
  UpgradeStatus: No upgrade log present (probably fresh install)
  dmi.bios.date: 10/22/2015
  dmi.bios.vendor: American Megatrends Inc.
  dmi.bios.version: F8
  dmi.board.asset.tag: To be filled by O.E.M.
  dmi.board.name: MZBAYAP-00
  dmi.board.vendor: GIGABYTE
  dmi.board.version: 1.x
  dmi.chassis.asset.tag: To Be Filled By O.E.M.
  dmi.chassis.type: 3
  dmi.chassis.vendor: To Be Filled By O.E.M.
  dmi.chassis.version: To Be Filled By O.E.M.
  dmi.modalias: 
dmi:bvnAmericanMegatrendsInc.:bvrF8:bd10/22/2015:svnGIGABYTE:pnGB-BXBT-2807:pvr1.x:rvnGIGABYTE:rnMZBAYAP-00:rvr1.x:cvnToBeFilledByO.E.M.:ct3:cvrToBeFilledByO.E.M.:
  dmi.product.name: GB-BXBT-2807
  dmi.product.version: 1.x
  dmi.sys.vendor: GIGABYTE
  hciconfig:
   hci0:        Type: BR/EDR  Bus: USB
        BD Address: DC:85:DE:FD:2F:BC  ACL MTU: 820:8  SCO MTU: 255:16
        UP RUNNING PSCAN ISCAN 
        RX bytes:528225 acl:32183 sco:0 events:1134 errors:0
        TX bytes:33849 acl:338 sco:0 commands:388 errors:1

To manage notifications about this bug go to:
https://bugs.launchpad.net/bluez/+bug/1717796/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to