Re: [PATCH] Bluetooth: remove btusb_work related workqueue

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

 



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.

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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