From: Hannes Reinecke <hare@suse.de>
To: Christoph Hellwig <hch@lst.de>,
linux-scsi@vger.kernel.org, Chen Gang <gang.chen.5i5j@gmail.com>,
Dan Williams <dan.j.williams@intel.com>,
James Bottomley <JBottomley@Parallels.com>
Subject: Re: [PATCH] libsas: remove task_collector mode
Date: Mon, 24 Nov 2014 09:51:41 +0100 [thread overview]
Message-ID: <5472F19D.3070600@suse.de> (raw)
In-Reply-To: <1416818502-19584-1-git-send-email-hch@lst.de>
On 11/24/2014 09:41 AM, Christoph Hellwig wrote:
> The task_collector mode (or "latency_injector", (C) Dan Willians) is an
> optional I/O path in libsas that queues up scsi commands instead of
> directly sending it to the hardware. It generall increases latencies
> to in the optiomal case slightly reduce mmio traffic to the hardware.
>
> Only the obsolete aic94xx driver and the mvsas driver allowed to use
> it without recompiling the kernel, and most drivers didn't support it
> at all.
>
> Remove the giant blob of code to allow better optimizations for scsi-mq
> in the future.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> Documentation/scsi/libsas.txt | 82 +----------------
> drivers/scsi/aic94xx/aic94xx.h | 2 +-
> drivers/scsi/aic94xx/aic94xx_hwi.c | 3 +-
> drivers/scsi/aic94xx/aic94xx_init.c | 11 ---
> drivers/scsi/aic94xx/aic94xx_task.c | 13 ++-
> drivers/scsi/isci/init.c | 2 -
> drivers/scsi/isci/task.c | 147 ++++++++++++++----------------
> drivers/scsi/isci/task.h | 1 -
> drivers/scsi/libsas/sas_ata.c | 9 +-
> drivers/scsi/libsas/sas_expander.c | 2 +-
> drivers/scsi/libsas/sas_init.c | 21 -----
> drivers/scsi/libsas/sas_internal.h | 2 -
> drivers/scsi/libsas/sas_scsi_host.c | 176 +-----------------------------------
> drivers/scsi/mvsas/mv_init.c | 22 -----
> drivers/scsi/mvsas/mv_sas.c | 109 +---------------------
> drivers/scsi/mvsas/mv_sas.h | 10 +-
> drivers/scsi/pm8001/pm8001_init.c | 2 -
> drivers/scsi/pm8001/pm8001_sas.c | 22 +----
> drivers/scsi/pm8001/pm8001_sas.h | 3 +-
> include/scsi/libsas.h | 14 +--
> 20 files changed, 97 insertions(+), 556 deletions(-)
>
> diff --git a/Documentation/scsi/libsas.txt b/Documentation/scsi/libsas.txt
> index 3cc9c78..8cac649 100644
> --- a/Documentation/scsi/libsas.txt
> +++ b/Documentation/scsi/libsas.txt
> @@ -226,9 +226,6 @@ static int register_sas_ha(struct my_sas_ha *my_ha)
> my_ha->sas_ha.lldd_dev_found = my_dev_found;
> my_ha->sas_ha.lldd_dev_gone = my_dev_gone;
>
> - my_ha->sas_ha.lldd_max_execute_num = lldd_max_execute_num; (1)
> -
> - my_ha->sas_ha.lldd_queue_size = ha_can_queue;
> my_ha->sas_ha.lldd_execute_task = my_execute_task;
>
> my_ha->sas_ha.lldd_abort_task = my_abort_task;
> @@ -247,28 +244,6 @@ static int register_sas_ha(struct my_sas_ha *my_ha)
> return sas_register_ha(&my_ha->sas_ha);
> }
>
> -(1) This is normally a LLDD parameter, something of the
> -lines of a task collector. What it tells the SAS Layer is
> -whether the SAS layer should run in Direct Mode (default:
> -value 0 or 1) or Task Collector Mode (value greater than 1).
> -
> -In Direct Mode, the SAS Layer calls Execute Task as soon as
> -it has a command to send to the SDS, _and_ this is a single
> -command, i.e. not linked.
> -
> -Some hardware (e.g. aic94xx) has the capability to DMA more
> -than one task at a time (interrupt) from host memory. Task
> -Collector Mode is an optional feature for HAs which support
> -this in their hardware. (Again, it is completely optional
> -even if your hardware supports it.)
> -
> -In Task Collector Mode, the SAS Layer would do _natural_
> -coalescing of tasks and at the appropriate moment it would
> -call your driver to DMA more than one task in a single HA
> -interrupt. DMBS may want to use this by insmod/modprobe
> -setting the lldd_max_execute_num to something greater than
> -1.
> -
> (2) SAS 1.1 does not define I_T Nexus Reset TMF.
>
> Events
> @@ -325,71 +300,22 @@ PHYE_SPINUP_HOLD -- SATA is present, COMWAKE not sent.
>
> The Execute Command SCSI RPC:
>
> - int (*lldd_execute_task)(struct sas_task *, int num,
> - unsigned long gfp_flags);
> + int (*lldd_execute_task)(struct sas_task *, gfp_t gfp_flags);
>
> -Used to queue a task to the SAS LLDD. @task is the tasks to
> -be executed. @num should be the number of tasks being
> -queued at this function call (they are linked listed via
> -task::list), @gfp_mask should be the gfp_mask defining the
> -context of the caller.
> +Used to queue a task to the SAS LLDD. @task is the task to be executed.
> +@gfp_mask is the gfp_mask defining the context of the caller.
>
> This function should implement the Execute Command SCSI RPC,
> -or if you're sending a SCSI Task as linked commands, you
> -should also use this function.
>
> -That is, when lldd_execute_task() is called, the command(s)
> +That is, when lldd_execute_task() is called, the command
> go out on the transport *immediately*. There is *no*
> queuing of any sort and at any level in a SAS LLDD.
>
> -The use of task::list is two-fold, one for linked commands,
> -the other discussed below.
> -
> -It is possible to queue up more than one task at a time, by
> -initializing the list element of struct sas_task, and
> -passing the number of tasks enlisted in this manner in num.
> -
> Returns: -SAS_QUEUE_FULL, -ENOMEM, nothing was queued;
> 0, the task(s) were queued.
>
> -If you want to pass num > 1, then either
> -A) you're the only caller of this function and keep track
> - of what you've queued to the LLDD, or
> -B) you know what you're doing and have a strategy of
> - retrying.
> -
> -As opposed to queuing one task at a time (function call),
> -batch queuing of tasks, by having num > 1, greatly
> -simplifies LLDD code, sequencer code, and _hardware design_,
> -and has some performance advantages in certain situations
> -(DBMS).
> -
> -The LLDD advertises if it can take more than one command at
> -a time at lldd_execute_task(), by setting the
> -lldd_max_execute_num parameter (controlled by "collector"
> -module parameter in aic94xx SAS LLDD).
> -
> -You should leave this to the default 1, unless you know what
> -you're doing.
> -
> -This is a function of the LLDD, to which the SAS layer can
> -cater to.
> -
> -int lldd_queue_size
> - The host adapter's queue size. This is the maximum
> -number of commands the lldd can have pending to domain
> -devices on behalf of all upper layers submitting through
> -lldd_execute_task().
> -
> -You really want to set this to something (much) larger than
> -1.
> -
> -This _really_ has absolutely nothing to do with queuing.
> -There is no queuing in SAS LLDDs.
> -
> struct sas_task {
> dev -- the device this task is destined to
> - list -- must be initialized (INIT_LIST_HEAD)
> task_proto -- _one_ of enum sas_proto
> scatter -- pointer to scatter gather list array
> num_scatter -- number of elements in scatter
> diff --git a/drivers/scsi/aic94xx/aic94xx.h b/drivers/scsi/aic94xx/aic94xx.h
> index 66cda66..26d4ad9 100644
> --- a/drivers/scsi/aic94xx/aic94xx.h
> +++ b/drivers/scsi/aic94xx/aic94xx.h
> @@ -78,7 +78,7 @@ void asd_dev_gone(struct domain_device *dev);
>
> void asd_invalidate_edb(struct asd_ascb *ascb, int edb_id);
>
> -int asd_execute_task(struct sas_task *, int num, gfp_t gfp_flags);
> +int asd_execute_task(struct sas_task *task, gfp_t gfp_flags);
>
> void asd_set_dmamode(struct domain_device *dev);
>
> diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.c b/drivers/scsi/aic94xx/aic94xx_hwi.c
> index 4df867e..9f636a3 100644
> --- a/drivers/scsi/aic94xx/aic94xx_hwi.c
> +++ b/drivers/scsi/aic94xx/aic94xx_hwi.c
> @@ -1200,8 +1200,7 @@ static void asd_start_scb_timers(struct list_head *list)
> * Case A: we can send the whole batch at once. Increment "pending"
> * in the beginning of this function, when it is checked, in order to
> * eliminate races when this function is called by multiple processes.
> - * Case B: should never happen if the managing layer considers
> - * lldd_queue_size.
> + * Case B: should never happen.
> */
> int asd_post_ascb_list(struct asd_ha_struct *asd_ha, struct asd_ascb *ascb,
> int num)
> diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
> index 579dc2f..49e4465 100644
> --- a/drivers/scsi/aic94xx/aic94xx_init.c
> +++ b/drivers/scsi/aic94xx/aic94xx_init.c
> @@ -49,14 +49,6 @@ MODULE_PARM_DESC(use_msi, "\n"
> "\tEnable(1) or disable(0) using PCI MSI.\n"
> "\tDefault: 0");
>
> -static int lldd_max_execute_num = 0;
> -module_param_named(collector, lldd_max_execute_num, int, S_IRUGO);
> -MODULE_PARM_DESC(collector, "\n"
> - "\tIf greater than one, tells the SAS Layer to run in Task Collector\n"
> - "\tMode. If 1 or 0, tells the SAS Layer to run in Direct Mode.\n"
> - "\tThe aic94xx SAS LLDD supports both modes.\n"
> - "\tDefault: 0 (Direct Mode).\n");
> -
> static struct scsi_transport_template *aic94xx_transport_template;
> static int asd_scan_finished(struct Scsi_Host *, unsigned long);
> static void asd_scan_start(struct Scsi_Host *);
> @@ -710,9 +702,6 @@ static int asd_register_sas_ha(struct asd_ha_struct *asd_ha)
> asd_ha->sas_ha.sas_port= sas_ports;
> asd_ha->sas_ha.num_phys= ASD_MAX_PHYS;
>
> - asd_ha->sas_ha.lldd_queue_size = asd_ha->seq.can_queue;
> - asd_ha->sas_ha.lldd_max_execute_num = lldd_max_execute_num;
> -
> return sas_register_ha(&asd_ha->sas_ha);
> }
>
> diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c
> index 59b86e2..5ff1ce7 100644
> --- a/drivers/scsi/aic94xx/aic94xx_task.c
> +++ b/drivers/scsi/aic94xx/aic94xx_task.c
> @@ -543,8 +543,7 @@ static int asd_can_queue(struct asd_ha_struct *asd_ha, int num)
> return res;
> }
>
> -int asd_execute_task(struct sas_task *task, const int num,
> - gfp_t gfp_flags)
> +int asd_execute_task(struct sas_task *task, gfp_t gfp_flags)
> {
> int res = 0;
> LIST_HEAD(alist);
> @@ -553,11 +552,11 @@ int asd_execute_task(struct sas_task *task, const int num,
> struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
> unsigned long flags;
>
> - res = asd_can_queue(asd_ha, num);
> + res = asd_can_queue(asd_ha, 1);
> if (res)
> return res;
>
> - res = num;
> + res = 1;
> ascb = asd_ascb_alloc_list(asd_ha, &res, gfp_flags);
> if (res) {
> res = -ENOMEM;
> @@ -568,7 +567,7 @@ int asd_execute_task(struct sas_task *task, const int num,
> list_for_each_entry(a, &alist, list) {
> a->uldd_task = t;
> t->lldd_task = a;
> - t = list_entry(t->list.next, struct sas_task, list);
> + break;
> }
> list_for_each_entry(a, &alist, list) {
> t = a->uldd_task;
> @@ -601,7 +600,7 @@ int asd_execute_task(struct sas_task *task, const int num,
> }
> list_del_init(&alist);
>
> - res = asd_post_ascb_list(asd_ha, ascb, num);
> + res = asd_post_ascb_list(asd_ha, ascb, 1);
> if (unlikely(res)) {
> a = NULL;
> __list_add(&alist, ascb->list.prev, &ascb->list);
> @@ -639,6 +638,6 @@ out_err_unmap:
> out_err:
> if (ascb)
> asd_ascb_free_list(ascb);
> - asd_can_dequeue(asd_ha, num);
> + asd_can_dequeue(asd_ha, 1);
> return res;
> }
Why did you not remove the last argument from asd_can_queue() and
asd_can_dequeue(), too?
With that patch it's always '1' ...
[ .. ]
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index 76570e6..b93f289 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -350,7 +350,7 @@ static int sas_find_local_port_id(struct domain_device *dev)
> */
> #define DEV_IS_GONE(pm8001_dev) \
> ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)))
> -static int pm8001_task_exec(struct sas_task *task, const int num,
> +static int pm8001_task_exec(struct sas_task *task,
> gfp_t gfp_flags, int is_tmf, struct pm8001_tmf_task *tmf)
> {
> struct domain_device *dev = task->dev;
> @@ -360,7 +360,6 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
> struct sas_task *t = task;
> struct pm8001_ccb_info *ccb;
> u32 tag = 0xdeadbeef, rc, n_elem = 0;
> - u32 n = num;
> unsigned long flags = 0;
>
> if (!dev->port) {
> @@ -387,18 +386,12 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
> spin_unlock_irqrestore(&pm8001_ha->lock, flags);
> t->task_done(t);
> spin_lock_irqsave(&pm8001_ha->lock, flags);
> - if (n > 1)
> - t = list_entry(t->list.next,
> - struct sas_task, list);
> continue;
> } else {
> struct task_status_struct *ts = &t->task_status;
> ts->resp = SAS_TASK_UNDELIVERED;
> ts->stat = SAS_PHY_DOWN;
> t->task_done(t);
> - if (n > 1)
> - t = list_entry(t->list.next,
> - struct sas_task, list);
> continue;
> }
> }
> @@ -460,9 +453,7 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
> t->task_state_flags |= SAS_TASK_AT_INITIATOR;
> spin_unlock(&t->task_state_lock);
> pm8001_dev->running_req++;
> - if (n > 1)
> - t = list_entry(t->list.next, struct sas_task, list);
> - } while (--n);
> + } while (0);
> rc = 0;
> goto out_done;
>
This 'while' loop can go, too.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-11-24 8:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-24 8:41 [PATCH] libsas: remove task_collector mode Christoph Hellwig
2014-11-24 8:51 ` Hannes Reinecke [this message]
2014-11-24 8:54 ` Christoph Hellwig
2014-11-24 9:01 ` Hannes Reinecke
2014-11-24 16:46 ` Dan Williams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5472F19D.3070600@suse.de \
--to=hare@suse.de \
--cc=JBottomley@Parallels.com \
--cc=dan.j.williams@intel.com \
--cc=gang.chen.5i5j@gmail.com \
--cc=hch@lst.de \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).