RE: [PATCH] Bluetooth: remove btusb_work related workqueue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcel,

> -----Original Message-----
> From: Marcel Holtmann [mailto:marcel@xxxxxxxxxxxx]
> Sent: Sunday, October 25, 2015 7:57 PM
> To: Pawlak, KubaX T
> Cc: linux-bluetooth@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] Bluetooth: remove btusb_work related workqueue
> 
> Hi Kuba,
> 
> >>>>>> Workqueue handling btusb_work is no longer needed as btusb_notify
> >>>>>> can sleep.
> >>>>>>
> >>>>>> Signed-off-by: Kuba Pawlak <kubax.t.pawlak@xxxxxxxxx>
> >>>>>> ---
> >>>>>> drivers/bluetooth/btusb.c | 14 +++++---------
> >>>>>> 1 file changed, 5 insertions(+), 9 deletions(-)
> >>>>>>
> >>>>>> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> >>>>>> index
> >>>>>
> >>
> 247b1062cb9affc67d9e7f7a0234c167f90f4b79..98c616ddd7bac53b2d5d5f8b3dcc
> >>>>> 2dca2b201e63 100644
> >>>>>> --- a/drivers/bluetooth/btusb.c
> >>>>>> +++ b/drivers/bluetooth/btusb.c
> >>>>>> @@ -350,7 +350,6 @@ struct btusb_data {
> >>>>>>
> >>>>>> 	unsigned long flags;
> >>>>>>
> >>>>>> -	struct work_struct work;
> >>>>>> 	struct work_struct waker;
> >>>>>>
> >>>>>> 	struct usb_anchor deferred;
> >>>>>> @@ -980,7 +979,6 @@ static int btusb_close(struct hci_dev *hdev)
> >>>>>>
> >>>>>> 	BT_DBG("%s", hdev->name);
> >>>>>>
> >>>>>> -	cancel_work_sync(&data->work);
> >>>>>> 	cancel_work_sync(&data->waker);
> >>>>>>
> >>>>>> 	clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
> >>>>>> @@ -1181,6 +1179,8 @@ static int btusb_send_frame(struct hci_dev
> >> *hdev,
> >>>>> struct sk_buff *skb)
> >>>>>> 	return -EILSEQ;
> >>>>>> }
> >>>>>>
> >>>>>> +static void btusb_sco_change(struct btusb_data *data);
> >>>>>> +
> >>>>>
> >>>>> do we need this forward declaration or can we just move code around
> to
> >> avoid
> >>>>> it?
> >>>>>
> >>>>>> static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
> >>>>>> {
> >>>>>> 	struct btusb_data *data = hci_get_drvdata(hdev);
> >>>>>> @@ -1189,7 +1189,7 @@ static void btusb_notify(struct hci_dev
> *hdev,
> >>>>> unsigned int evt)
> >>>>>>
> >>>>>> 	if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
> >>>>>> 		data->sco_num = hci_conn_num(hdev, SCO_LINK);
> >>>>>> -		schedule_work(&data->work);
> >>>>>> +		btusb_sco_change(data);
> >>>>>> 	}
> >>>>>> }
> >>>>>>
> >>>>>> @@ -1236,9 +1236,8 @@ static inline int __set_isoc_interface(struct
> >> hci_dev
> >>>>> *hdev, int altsetting)
> >>>>>> 	return 0;
> >>>>>> }
> >>>>>>
> >>>>>> -static void btusb_work(struct work_struct *work)
> >>>>>> +static void btusb_sco_change(struct btusb_data *data)
> >>>>>> {
> >>>>>> -	struct btusb_data *data = container_of(work, struct
> btusb_data,
> >>>>> work);
> >>>>>> 	struct hci_dev *hdev = data->hdev;
> >>>>>> 	int new_alts;
> >>>>>> 	int err;
> >>>>>> @@ -2618,7 +2617,6 @@ static int btusb_probe(struct usb_interface
> >> *intf,
> >>>>>> 	data->udev = interface_to_usbdev(intf);
> >>>>>> 	data->intf = intf;
> >>>>>>
> >>>>>> -	INIT_WORK(&data->work, btusb_work);
> >>>>>> 	INIT_WORK(&data->waker, btusb_waker);
> >>>>>> 	init_usb_anchor(&data->deferred);
> >>>>>> 	init_usb_anchor(&data->tx_anchor);
> >>>>>> @@ -2848,8 +2846,6 @@ static int btusb_suspend(struct usb_interface
> >> *intf,
> >>>>> pm_message_t message)
> >>>>>> 		return -EBUSY;
> >>>>>> 	}
> >>>>>>
> >>>>>> -	cancel_work_sync(&data->work);
> >>>>>> -
> >>>>>> 	btusb_stop_traffic(data);
> >>>>>> 	usb_kill_anchored_urbs(&data->tx_anchor);
> >>>>>>
> >>>>>> @@ -2922,7 +2918,7 @@ static int btusb_resume(struct usb_interface
> >> *intf)
> >>>>>> 	play_deferred(data);
> >>>>>> 	clear_bit(BTUSB_SUSPENDING, &data->flags);
> >>>>>> 	spin_unlock_irq(&data->txlock);
> >>>>>> -	schedule_work(&data->work);
> >>>>>> +	btusb_sco_change(data);
> >>>>>
> >>>>> Can we actually sleep in the resume callbacks? I think so, but I have not
> >> testing
> >>>>> runtime power management in a while.
> >>>>
> >>>> Apparently we can't, so workqueue needs to stay and this patch is invalid.
> >>>
> >>> I think that removing the usage of the workqueue in btusb_notify is still a
> >> good thing since it reduces the latency when establishing SCO connections.
> >>
> >> actually I wonder if the call to usb_set_interface is needed on resume in the
> >> first place. Maybe this is actually not needed and we just need to restart the
> >> URBs.
> >>
> >> Do you have the chance to test and see if the alternate setting actually
> changed
> >> over resume?
> >
> > Our platform does not support suspend/resume. I have an Ellisys analyser
> with external WP module connected through it over USB, so I can trace what
> altsettings are set and when. I will look into a possibility of testing this using a
> laptop, but I don’t know how to easily make phone open SCO channel, so I
> don't need to port our PulseAudio.
> 
> any update here? I would really get of this workqueue usage in btusb driver.

Sorry for the delay, but I'm stuck in some internal project stuff. I used Ellisys and a laptop running Fedora 21 as our system does not support any type of suspend. To create bogus SCO link I use 'scotest -n <phone MAC>'. There is no data flowing, but at least stream is set up. On stream creation AltSettings change to 2 as expected. On laptop suspend there is nothing there, looks like we don't change settings. Controller remains active. On resume we get:
GetDescriptor(Device), SetAddress (2), GetDescriptor(Device), GetDescriptor(Configuration),SetConfiguration(1),SetInterface (1, AltSet2), GetStatus(Device).
So it looks like we are changing altsetting in resume to whatever was set before suspend. At btusb_work can sleep and resume does not, it looks like we can't remove this workqueue from there. I don’t know USB at all so I can’t say what to do with that. Does active SCO link over suspend/resume makes sense?

There is also an annoying Ellisys bug in here. When creating SCO link with scotest, there is no update to overview, no matter what I do to grouping. Only after resume, all messages are pushed to the overview and I can see what happened.

Kuba
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Prof. Dr. Hermann Eul
Chairperson of the Supervisory Board: Tiffany Doon Silva
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
��.n��������+%������w��{.n�����{����^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�

[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux