]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: sas: Convert timers to use timer_setup()
authorKees Cook <keescook@chromium.org>
Tue, 22 Aug 2017 23:05:14 +0000 (16:05 -0700)
committerKees Cook <keescook@chromium.org>
Wed, 1 Nov 2017 18:43:47 +0000 (11:43 -0700)
In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly. This requires adding a pointer to
hold the timer's target task, as there isn't a link back from slow_task.

Cc: John Garry <john.garry@huawei.com>
Cc: "James E.J. Bottomley" <jejb@linux.vnet.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Jack Wang <jinpu.wang@profitbricks.com>
Cc: lindar_liu@usish.com
Cc: Jens Axboe <axboe@fb.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Benjamin Block <bblock@linux.vnet.ibm.com>
Cc: Baoyou Xie <baoyou.xie@linaro.org>
Cc: Wei Yongjun <weiyongjun1@huawei.com>
Cc: linux-scsi@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Acked-by: John Garry <john.garry@huawei.com> # for hisi_sas part
Tested-by: John Garry <john.garry@huawei.com> # basic sanity test for hisi_sas
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
13 files changed:
drivers/scsi/hisi_sas/hisi_sas.h
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
drivers/scsi/libsas/sas_expander.c
drivers/scsi/libsas/sas_init.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/mvsas/mv_init.c
drivers/scsi/mvsas/mv_sas.c
drivers/scsi/mvsas/mv_sas.h
drivers/scsi/pm8001/pm8001_sas.c
include/scsi/libsas.h

index 07f4a4cfbec1b3275280eb0193009fbf3e72b264..15692ea05cedd401917b6521fd8805e94897c2e4 100644 (file)
@@ -103,7 +103,6 @@ struct hisi_sas_phy {
        struct hisi_sas_port    *port;
        struct asd_sas_phy      sas_phy;
        struct sas_identify     identify;
-       struct timer_list       timer;
        struct work_struct      phyup_ws;
        u64             port_id; /* from hw */
        u64             dev_sas_addr;
index 16664f2e15fbadd77d30439d723f1d972d0efbbf..37c838be47577e26cb8c88fc6b402c142cc5c1e7 100644 (file)
@@ -627,7 +627,6 @@ static void hisi_sas_phy_init(struct hisi_hba *hisi_hba, int phy_no)
 
        phy->hisi_hba = hisi_hba;
        phy->port = NULL;
-       init_timer(&phy->timer);
        sas_phy->enabled = (phy_no < hisi_hba->n_phy) ? 1 : 0;
        sas_phy->class = SAS;
        sas_phy->iproto = SAS_PROTOCOL_ALL;
@@ -792,9 +791,10 @@ static void hisi_sas_task_done(struct sas_task *task)
        complete(&task->slow_task->completion);
 }
 
-static void hisi_sas_tmf_timedout(unsigned long data)
+static void hisi_sas_tmf_timedout(struct timer_list *t)
 {
-       struct sas_task *task = (struct sas_task *)data;
+       struct sas_task_slow *slow = from_timer(slow, t, timer);
+       struct sas_task *task = slow->task;
        unsigned long flags;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
@@ -833,8 +833,7 @@ static int hisi_sas_exec_internal_tmf_task(struct domain_device *device,
                }
                task->task_done = hisi_sas_task_done;
 
-               task->slow_task->timer.data = (unsigned long) task;
-               task->slow_task->timer.function = hisi_sas_tmf_timedout;
+               task->slow_task->timer.function = (TIMER_FUNC_TYPE)hisi_sas_tmf_timedout;
                task->slow_task->timer.expires = jiffies + TASK_TIMEOUT*HZ;
                add_timer(&task->slow_task->timer);
 
@@ -1447,8 +1446,7 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
        task->dev = device;
        task->task_proto = device->tproto;
        task->task_done = hisi_sas_task_done;
-       task->slow_task->timer.data = (unsigned long)task;
-       task->slow_task->timer.function = hisi_sas_tmf_timedout;
+       task->slow_task->timer.function = (TIMER_FUNC_TYPE)hisi_sas_tmf_timedout;
        task->slow_task->timer.expires = jiffies + msecs_to_jiffies(110);
        add_timer(&task->slow_task->timer);
 
@@ -1877,7 +1875,7 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
        hisi_hba->shost = shost;
        SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
 
-       init_timer(&hisi_hba->timer);
+       timer_setup(&hisi_hba->timer, NULL, 0);
 
        if (hisi_sas_get_fw_info(hisi_hba) < 0)
                goto err_out;
index 08eca20b0b81812a8ef32ac23d47a5ccbbb4f5ab..9385554e43a6095537f2852f02960fa0b8dbad92 100644 (file)
@@ -807,9 +807,9 @@ static void phy_hard_reset_v1_hw(struct hisi_hba *hisi_hba, int phy_no)
        start_phy_v1_hw(hisi_hba, phy_no);
 }
 
-static void start_phys_v1_hw(unsigned long data)
+static void start_phys_v1_hw(struct timer_list *t)
 {
-       struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
+       struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
        int i;
 
        for (i = 0; i < hisi_hba->n_phy; i++) {
@@ -828,7 +828,7 @@ static void phys_init_v1_hw(struct hisi_hba *hisi_hba)
                hisi_sas_phy_read32(hisi_hba, i, CHL_INT2_MSK);
        }
 
-       setup_timer(timer, start_phys_v1_hw, (unsigned long)hisi_hba);
+       timer_setup(timer, start_phys_v1_hw, 0);
        mod_timer(timer, jiffies + HZ);
 }
 
index 779af979b6db93380386210c4a19f6231ecf8fc1..b1f097dabd0187f55b8990b0939dda6614fcba8f 100644 (file)
@@ -728,7 +728,7 @@ enum {
 #define ERR_ON_RX_PHASE(err_phase) (err_phase == 0x10 || \
                err_phase == 0x20 || err_phase == 0x40)
 
-static void link_timeout_disable_link(unsigned long data);
+static void link_timeout_disable_link(struct timer_list *t);
 
 static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
 {
@@ -1270,9 +1270,9 @@ static void init_reg_v2_hw(struct hisi_hba *hisi_hba)
                         upper_32_bits(hisi_hba->initial_fis_dma));
 }
 
-static void link_timeout_enable_link(unsigned long data)
+static void link_timeout_enable_link(struct timer_list *t)
 {
-       struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
+       struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
        int i, reg_val;
 
        for (i = 0; i < hisi_hba->n_phy; i++) {
@@ -1287,13 +1287,13 @@ static void link_timeout_enable_link(unsigned long data)
                }
        }
 
-       hisi_hba->timer.function = link_timeout_disable_link;
+       hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_disable_link;
        mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(900));
 }
 
-static void link_timeout_disable_link(unsigned long data)
+static void link_timeout_disable_link(struct timer_list *t)
 {
-       struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
+       struct hisi_hba *hisi_hba = from_timer(hisi_hba, t, timer);
        int i, reg_val;
 
        reg_val = hisi_sas_read32(hisi_hba, PHY_STATE);
@@ -1308,14 +1308,13 @@ static void link_timeout_disable_link(unsigned long data)
                }
        }
 
-       hisi_hba->timer.function = link_timeout_enable_link;
+       hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_enable_link;
        mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(100));
 }
 
 static void set_link_timer_quirk(struct hisi_hba *hisi_hba)
 {
-       hisi_hba->timer.data = (unsigned long)hisi_hba;
-       hisi_hba->timer.function = link_timeout_disable_link;
+       hisi_hba->timer.function = (TIMER_FUNC_TYPE)link_timeout_disable_link;
        hisi_hba->timer.expires = jiffies + msecs_to_jiffies(1000);
        add_timer(&hisi_hba->timer);
 }
@@ -2574,9 +2573,9 @@ static int prep_ata_v2_hw(struct hisi_hba *hisi_hba,
        return 0;
 }
 
-static void hisi_sas_internal_abort_quirk_timeout(unsigned long data)
+static void hisi_sas_internal_abort_quirk_timeout(struct timer_list *t)
 {
-       struct hisi_sas_slot *slot = (struct hisi_sas_slot *)data;
+       struct hisi_sas_slot *slot = from_timer(slot, t, internal_abort_timer);
        struct hisi_sas_port *port = slot->port;
        struct asd_sas_port *asd_sas_port;
        struct asd_sas_phy *sas_phy;
@@ -2619,8 +2618,7 @@ static int prep_abort_v2_hw(struct hisi_hba *hisi_hba,
        struct timer_list *timer = &slot->internal_abort_timer;
 
        /* setup the quirk timer */
-       setup_timer(timer, hisi_sas_internal_abort_quirk_timeout,
-                   (unsigned long)slot);
+       timer_setup(timer, hisi_sas_internal_abort_quirk_timeout, 0);
        /* Set the timeout to 10ms less than internal abort timeout */
        mod_timer(timer, jiffies + msecs_to_jiffies(100));
 
index 2e5fa9717be89acdcc3b1565c0b1c85a5ab089c1..3f2f0baf2a5edf234749fcab089648c7b14cae17 100644 (file)
@@ -1823,7 +1823,7 @@ hisi_sas_shost_alloc_pci(struct pci_dev *pdev)
        hisi_hba->shost = shost;
        SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
 
-       init_timer(&hisi_hba->timer);
+       timer_setup(&hisi_hba->timer, NULL, 0);
 
        if (hisi_sas_get_fw_info(hisi_hba) < 0)
                goto err_out;
index 6b4fd2375178588b5d6b899ae32da25766e0f3dd..174e5eff615579d3c2822692de37e59a0b219b03 100644 (file)
@@ -41,9 +41,10 @@ static int sas_disable_routing(struct domain_device *dev,  u8 *sas_addr);
 
 /* ---------- SMP task management ---------- */
 
-static void smp_task_timedout(unsigned long _task)
+static void smp_task_timedout(struct timer_list *t)
 {
-       struct sas_task *task = (void *) _task;
+       struct sas_task_slow *slow = from_timer(slow, t, timer);
+       struct sas_task *task = slow->task;
        unsigned long flags;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
@@ -91,8 +92,7 @@ static int smp_execute_task_sg(struct domain_device *dev,
 
                task->task_done = smp_task_done;
 
-               task->slow_task->timer.data = (unsigned long) task;
-               task->slow_task->timer.function = smp_task_timedout;
+               task->slow_task->timer.function = (TIMER_FUNC_TYPE)smp_task_timedout;
                task->slow_task->timer.expires = jiffies + SMP_TIMEOUT*HZ;
                add_timer(&task->slow_task->timer);
 
index 64e9cdda1c3ca01d47d60fcbf535dea44507fdb3..681fcb837354ec497fdc5facbe1040418f279a72 100644 (file)
@@ -66,7 +66,8 @@ struct sas_task *sas_alloc_slow_task(gfp_t flags)
        }
 
        task->slow_task = slow;
-       init_timer(&slow->timer);
+       slow->task = task;
+       timer_setup(&slow->timer, NULL, 0);
        init_completion(&slow->completion);
 
        return task;
index ea8ad06ff582eef292a0b11d42248502aaef8b33..91795eb56206603bb0a52baa62237e9787dd2bcf 100644 (file)
@@ -919,7 +919,7 @@ void sas_task_abort(struct sas_task *task)
                        return;
                if (!del_timer(&slow->timer))
                        return;
-               slow->timer.function(slow->timer.data);
+               slow->timer.function((TIMER_DATA_TYPE)&slow->timer);
                return;
        }
 
index 718c88de328bff527c37ce1edd33f03208b8e711..8c91637cd598d971afd11b2ae5e4aceb024a7b22 100644 (file)
@@ -95,7 +95,7 @@ static void mvs_phy_init(struct mvs_info *mvi, int phy_id)
 
        phy->mvi = mvi;
        phy->port = NULL;
-       init_timer(&phy->timer);
+       timer_setup(&phy->timer, NULL, 0);
        sas_phy->enabled = (phy_id < mvi->chip->n_phy) ? 1 : 0;
        sas_phy->class = SAS;
        sas_phy->iproto = SAS_PROTOCOL_ALL;
@@ -248,7 +248,6 @@ static int mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
                mvi->devices[i].dev_type = SAS_PHY_UNUSED;
                mvi->devices[i].device_id = i;
                mvi->devices[i].dev_status = MVS_DEV_NORMAL;
-               init_timer(&mvi->devices[i].timer);
        }
 
        /*
index ee81d10252e043fa1ed505d429ed7a7dbcebde3d..cff1c37b8d2e46374ffda812b97877851b1cea2c 100644 (file)
@@ -1283,9 +1283,10 @@ static void mvs_task_done(struct sas_task *task)
        complete(&task->slow_task->completion);
 }
 
-static void mvs_tmf_timedout(unsigned long data)
+static void mvs_tmf_timedout(struct timer_list *t)
 {
-       struct sas_task *task = (struct sas_task *)data;
+       struct sas_task_slow *slow = from_timer(slow, t, timer);
+       struct sas_task *task = slow->task;
 
        task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        complete(&task->slow_task->completion);
@@ -1309,8 +1310,7 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev,
                memcpy(&task->ssp_task, parameter, para_len);
                task->task_done = mvs_task_done;
 
-               task->slow_task->timer.data = (unsigned long) task;
-               task->slow_task->timer.function = mvs_tmf_timedout;
+               task->slow_task->timer.function = (TIMER_FUNC_TYPE)mvs_tmf_timedout;
                task->slow_task->timer.expires = jiffies + MVS_TASK_TIMEOUT*HZ;
                add_timer(&task->slow_task->timer);
 
@@ -1954,9 +1954,9 @@ static int mvs_handle_event(struct mvs_info *mvi, void *data, int handler)
        return ret;
 }
 
-static void mvs_sig_time_out(unsigned long tphy)
+static void mvs_sig_time_out(struct timer_list *t)
 {
-       struct mvs_phy *phy = (struct mvs_phy *)tphy;
+       struct mvs_phy *phy = from_timer(phy, t, timer);
        struct mvs_info *mvi = phy->mvi;
        u8 phy_no;
 
@@ -2020,8 +2020,7 @@ void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events)
                MVS_CHIP_DISP->write_port_irq_mask(mvi, phy_no,
                                        tmp | PHYEV_SIG_FIS);
                if (phy->timer.function == NULL) {
-                       phy->timer.data = (unsigned long)phy;
-                       phy->timer.function = mvs_sig_time_out;
+                       phy->timer.function = (TIMER_FUNC_TYPE)mvs_sig_time_out;
                        phy->timer.expires = jiffies + 5*HZ;
                        add_timer(&phy->timer);
                }
index f9afd4cdd4c4e9784e2bf83736ca5c48ed675f7e..080676c1c9e5a1322829dcea71edd62e993b33c5 100644 (file)
@@ -247,7 +247,6 @@ struct mvs_device {
        enum sas_device_type dev_type;
        struct mvs_info *mvi_info;
        struct domain_device *sas_device;
-       struct timer_list timer;
        u32 attached_phy;
        u32 device_id;
        u32 running_req;
index ce584c31d36e505a005b2e09aab8ccbaa6e4025c..7b2f92ae986602e2ffba558ff069f05c3685c8e4 100644 (file)
@@ -656,9 +656,10 @@ void pm8001_task_done(struct sas_task *task)
        complete(&task->slow_task->completion);
 }
 
-static void pm8001_tmf_timedout(unsigned long data)
+static void pm8001_tmf_timedout(struct timer_list *t)
 {
-       struct sas_task *task = (struct sas_task *)data;
+       struct sas_task_slow *slow = from_timer(slow, t, timer);
+       struct sas_task *task = slow->task;
 
        task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        complete(&task->slow_task->completion);
@@ -694,8 +695,7 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev,
                task->task_proto = dev->tproto;
                memcpy(&task->ssp_task, parameter, para_len);
                task->task_done = pm8001_task_done;
-               task->slow_task->timer.data = (unsigned long)task;
-               task->slow_task->timer.function = pm8001_tmf_timedout;
+               task->slow_task->timer.function = (TIMER_FUNC_TYPE)pm8001_tmf_timedout;
                task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ;
                add_timer(&task->slow_task->timer);
 
@@ -781,8 +781,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
                task->dev = dev;
                task->task_proto = dev->tproto;
                task->task_done = pm8001_task_done;
-               task->slow_task->timer.data = (unsigned long)task;
-               task->slow_task->timer.function = pm8001_tmf_timedout;
+               task->slow_task->timer.function = (TIMER_FUNC_TYPE)pm8001_tmf_timedout;
                task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ;
                add_timer(&task->slow_task->timer);
 
index 6c0dc6155ee757b5e066b075316dc899f6dddddc..388aaf72b48023506e5037f52fcfea915ff03de9 100644 (file)
@@ -629,6 +629,7 @@ struct sas_task_slow {
         */
        struct timer_list     timer;
        struct completion     completion;
+       struct sas_task       *task;
 };
 
 #define SAS_TASK_STATE_PENDING      1