Bluetooth: Use delayed work for advertisiment cache timeout
Gustavo F. Padovan [Mon, 20 Jun 2011 19:39:29 +0000 (16:39 -0300)]
As HCI rx path is now done in process context it makes sense to do all the
timer in process context as well.

Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>

include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c
net/bluetooth/hci_event.c

index d915908..14b200b 100644 (file)
@@ -226,7 +226,7 @@ struct hci_dev {
        struct list_head        remote_oob_data;
 
        struct list_head        adv_entries;
-       struct timer_list       adv_timer;
+       struct delayed_work     adv_work;
 
        struct hci_dev_stats    stat;
 
index ec10191..6f5bb3c 100644 (file)
@@ -1340,9 +1340,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr)
        return mgmt_device_unblocked(hdev, bdaddr);
 }
 
-static void hci_clear_adv_cache(unsigned long arg)
+static void hci_clear_adv_cache(struct work_struct *work)
 {
-       struct hci_dev *hdev = (void *) arg;
+       struct hci_dev *hdev = container_of(work, struct hci_dev,
+                                                       adv_work.work);
 
        hci_dev_lock(hdev);
 
@@ -1488,9 +1489,8 @@ int hci_register_dev(struct hci_dev *hdev)
        INIT_LIST_HEAD(&hdev->remote_oob_data);
 
        INIT_LIST_HEAD(&hdev->adv_entries);
-       setup_timer(&hdev->adv_timer, hci_clear_adv_cache,
-                                               (unsigned long) hdev);
 
+       INIT_DELAYED_WORK(&hdev->adv_work, hci_clear_adv_cache);
        INIT_WORK(&hdev->power_on, hci_power_on);
        INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
 
@@ -1576,7 +1576,7 @@ void hci_unregister_dev(struct hci_dev *hdev)
 
        hci_del_sysfs(hdev);
 
-       del_timer(&hdev->adv_timer);
+       cancel_delayed_work_sync(&hdev->adv_work);
 
        destroy_workqueue(hdev->workqueue);
 
index 35cb56e..0a9501f 100644 (file)
@@ -1017,7 +1017,7 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
        if (cp->enable == 0x01) {
                set_bit(HCI_LE_SCAN, &hdev->dev_flags);
 
-               del_timer(&hdev->adv_timer);
+               cancel_delayed_work_sync(&hdev->adv_work);
 
                hci_dev_lock(hdev);
                hci_adv_entries_clear(hdev);
@@ -1025,7 +1025,9 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
        } else if (cp->enable == 0x00) {
                clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
 
-               mod_timer(&hdev->adv_timer, jiffies + ADV_CLEAR_TIMEOUT);
+               cancel_delayed_work_sync(&hdev->adv_work);
+               queue_delayed_work(hdev->workqueue, &hdev->adv_work,
+                                                jiffies + ADV_CLEAR_TIMEOUT);
        }
 }