Re: [RFC 2/2] Bluetooth: Process HCI callbacks in a workqueue

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

 



Hi Andrei,

> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx>
> ---
>  include/net/bluetooth/hci_core.h |    2 +
>  net/bluetooth/hci_core.c         |   42 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 44 insertions(+), 0 deletions(-)
> 
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 2ef515e..47f1631 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -1103,5 +1103,7 @@ int hci_cmd_cb(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param,
>  	void (*cb)(struct hci_dev *hdev, struct cb_cmd *cmd), void *opt,
>  				void (*destructor)(struct cb_cmd *cmd));
>  void hci_remove_cb(struct cb_cmd *cmd);
> +void hci_queue_cb(struct hci_dev *hdev, struct cb_cmd *cmd,
> +					struct workqueue_struct *workqueue);
>  
>  #endif /* __HCI_CORE_H */
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index cdc0220..2bd97b4 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -2273,6 +2273,48 @@ struct cb_cmd *hci_find_cb(struct hci_dev *hdev, __u16 opcode)
>  	return NULL;
>  }
>  
> +struct cb_work {
> +	struct work_struct work;
> +	struct hci_dev *hdev;
> +	struct cb_cmd *cmd;
> +};
> +
> +static void hci_cb_work(struct work_struct *w)
> +{
> +	struct cb_work *work = (struct cb_work *) w;
> +	struct cb_cmd *cmd = work->cmd;
> +	struct hci_dev *hdev = work->hdev;
> +
> +	cmd->cb(hdev, cmd);
> +
> +	hci_dev_put(hdev);
> +
> +	hci_remove_cb(cmd);
> +	kfree(w);
> +}
> +
> +void hci_queue_cb(struct hci_dev *hdev, struct cb_cmd *cmd,
> +					struct workqueue_struct *workqueue)
> +{
> +	struct cb_work *work;
> +
> +	BT_ERR("Queue cmd %p opt %p", cmd, cmd->opt);

BT_DBG I guess?

> +
> +	work = kmalloc(sizeof(*work), GFP_ATOMIC);
> +	if (!work)
> +		return;
> +
> +	INIT_WORK(&work->work, hci_cb_work);
> +	work->hdev = hdev;
> +	work->cmd = cmd;
> +	hci_dev_hold(hdev);
> +
> +	if (!queue_work(workqueue, &work->work)) {
> +		kfree(work);
> +		hci_dev_put(hdev);
> +	}
> +}
> +
>  void hci_remove_cb(struct cb_cmd *cmd)
>  {
>  	list_del(&cmd->list);
> 

-- 
BR
Szymon Janc
--
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