From: John Garry <john.garry@huawei.com>
To: Hannes Reinecke <hare@suse.de>,
"Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>,
James Bottomley <james.bottomley@hansenpartnership.com>,
"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
Bart van Assche <bvanassche@acm.org>,
"chenxiang (M)" <chenxiang66@hisilicon.com>
Subject: Re: [PATCH 02/15] scsi: add scsi_{get,put}_internal_cmd() helper
Date: Mon, 6 Dec 2021 17:15:20 +0000 [thread overview]
Message-ID: <2cef903a-80ec-216b-b99a-e4021511711e@huawei.com> (raw)
In-Reply-To: <ddc265d3-9f31-b4d9-06c4-d205b03a566f@suse.de>
On 28/11/2021 10:36, Hannes Reinecke wrote:
>>> * Allocates a SCSI command for internal LLDD use.
>>> + */
>>> +struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev,
>>> + int data_direction, bool nowait)
>>> +{
>>> + struct request *rq;
>>> + struct scsi_cmnd *scmd;
>>> + blk_mq_req_flags_t flags = 0;
>>> + int op;
>>> +
>>> + if (nowait)
>>> + flags |= BLK_MQ_REQ_NOWAIT;
>>> + op = (data_direction == DMA_TO_DEVICE) ?
>>> + REQ_OP_DRV_OUT : REQ_OP_DRV_IN;
>>> + rq = blk_mq_alloc_request(sdev->request_queue, op, flags);
>>> + if (IS_ERR(rq))
>>> + return NULL;
>>> + scmd = blk_mq_rq_to_pdu(rq);
>>> + scmd->device = sdev;
>>> + return scmd;
>>> +}
>>> +EXPORT_SYMBOL_GPL(scsi_get_internal_cmd);
>> So there are a couple of generally-accepted grievances about this approach:
>> a. we're being allocated a scsi_cmnd, but not using what is being
>> allocated as a scsi_cmnd, but rather just a holder as a reference to an
>> allocated tag
>> b. we're being allocated a request, which is not being sent through the
>> block layer*
>>
> And while being true in general, it does make some assumptions:
> - Reserved commands will never being sent via the block layer
> - None of the drivers will need to use the additional 'scsi_cmnd' payload.
>
> Here I'm not sure if this is true in general.
> While it doesn't seem to be necessary to send reserved commands via the
> block layer (ie calling 'queue_rq' on them), we shouldn't exclude the
> possibility.
Agreed
> Didn't we speak about that in the context of converting libata?
>
We did discuss libata before, but I'm not sure on the context you mean.
One thing that I know is that libata-core has "internal" commands in
ata_exec_internal(). I could not see how that function could be
converted to use queue_rq. The problem is that it calls ->qc_issue()
with IRQs disabled, which is not permitted for calling blk_execute_rq()
instead.
> And I have some driver conversions queued (fnic in particular), which
> encapsulate everything into a scsi command.
>
>> It just seems to me that what the block layer is providing is not suitable.
>>
>> How about these:
>> a. allow block driver to specify size of reserved request PDU separately
>> to regular requests, so we can use something like this for rsvd commands:
>> struct scsi_rsvd_cmnd {
>> struct scsi_device *sdev;
>> }
>> And fix up SCSI iter functions and LLDs to deal with it.
> That's what Bart suggested a while back,
I don't recall that one.
> but then we have to problem
> that the reserved tags are completed with the same interrupt routine,
> and_that_ currently assumes that everything is a scsi command.
I think that any driver which uses reserved commands needs to be thought
that not all commands are "real" scsi commands, i.e. we don't call
scsi_done() in the LLD ISR always. As such, they should be able to deal
with something like struct scsi_rsvd_cmnd.
BTW, for this current series, please ensure that we can't call
scsi_host_complete_all_commands() which could iter reserved tags, as we
call stuff like scsi_done() there. I don't think it's an issue here, but
just thought that it was worth mentioning.
> Trying to fix up that assumption would mean to audit the midlayer
> (scmd->device is a particular common pattern),_and_ all drivers wanting
> to make use of reserved commands.
> For me that's too high an risk to introduce errors; audits are always
> painful and error-prone.
>
>> b. provide block layer API to provide just same as is returned from
>> blk_mq_unique_tag(), but no request is provided. This just gives what we
>> need but would be disruptive in scsi layer and LLDs.
> Having looked at the block layer and how tags are allocated I found it
> too deeply interlinked with the request queue and requests in general.
They are indeed interlinked in the block layer, but we don't need expose
requests or anything else.
Such an interface could just be a wrapper for
blk_mq_alloc_request()+_start_request().
> Plus I've suggested that with a previous patchset, which got vetoed by
> Bart as he couldn't use such an API for UFS.
> >> c. as alternative to b., send all rsvd requests through the block layer,
>> but can be very difficult+disruptive for users
>>
> And, indeed, not possible when we will need to send these requests
> during error handling, where the queue might be blocked/frozen/quiesced
> precisely because we are in error handling ...
If we send for the host request queue, would it ever be
blocked/frozen/quiesced?
>
>> *For polling rsvd commands on a poll queue (which we will need for
>> hisi_sas driver and maybe others for poll mode support), we would need
>> to send the request through the block layer, but block layer polling
>> requires a request with a bio, which is a problem.
>>
> Allocating a bio is a relatively trivial task.
So do you suggest a dummy bio for that request? I hacked something
locally to get it to work as a PoC, but no idea on a real solution yet.
> But as soon as we ever
> want to be able to implement polling support for reserved tags we
> essentially_have_ to use requests,
Agreed
> and that means we'll have to use the
> provided interfaces from the block layer.
Thanks,
John
next prev parent reply other threads:[~2021-12-06 17:15 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-25 15:10 [PATCHv9 00/15] scsi: enabled reserved commands for LLDDs Hannes Reinecke
2021-11-25 15:10 ` [PATCH 01/15] scsi: allocate host device Hannes Reinecke
2021-11-25 23:16 ` Bart Van Assche
2021-11-27 16:21 ` Hannes Reinecke
2021-11-26 2:47 ` chenxiang (M)
2021-11-27 16:52 ` Hannes Reinecke
2021-11-29 10:59 ` Hannes Reinecke
2021-11-25 15:10 ` [PATCH 02/15] scsi: add scsi_{get,put}_internal_cmd() helper Hannes Reinecke
2021-11-26 9:58 ` John Garry
2021-11-26 23:13 ` Bart Van Assche
2021-11-28 10:36 ` Hannes Reinecke
2021-12-06 17:15 ` John Garry [this message]
2021-12-06 17:46 ` Hannes Reinecke
2021-12-07 12:50 ` John Garry
2021-11-26 23:12 ` Bart Van Assche
2021-11-28 12:44 ` Hannes Reinecke
2021-11-30 4:17 ` Martin K. Petersen
2021-11-30 6:51 ` Hannes Reinecke
2021-11-28 3:33 ` Bart Van Assche
2021-11-28 13:05 ` Hannes Reinecke
2021-11-25 15:10 ` [PATCH 03/15] scsi: implement reserved command handling Hannes Reinecke
2021-11-26 23:15 ` Bart Van Assche
2021-11-29 19:15 ` Asutosh Das (asd)
2021-11-25 15:10 ` [PATCH 04/15] hpsa: move hpsa_hba_inquiry after scsi_add_host() Hannes Reinecke
2021-11-25 15:10 ` [PATCH 05/15] hpsa: use reserved commands Hannes Reinecke
2021-11-25 15:10 ` [PATCH 06/15] hpsa: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
2021-11-26 9:33 ` John Garry
2021-11-27 17:00 ` Hannes Reinecke
2021-11-25 15:10 ` [PATCH 07/15] hpsa: drop refcount field from CommandList Hannes Reinecke
2021-11-25 15:10 ` [PATCH 08/15] aacraid: return valid status from aac_scsi_cmd() Hannes Reinecke
2021-11-25 15:10 ` [PATCH 09/15] aacraid: don't bother with setting SCp.Status Hannes Reinecke
2021-11-25 15:10 ` [PATCH 10/15] aacraid: move scsi_add_host() Hannes Reinecke
2021-11-25 15:10 ` [PATCH 11/15] aacraid: move container ID into struct fib Hannes Reinecke
2021-11-25 15:10 ` [PATCH 12/15] aacraid: fsa_dev pointer is always valid Hannes Reinecke
2021-11-25 15:10 ` [PATCH 13/15] aacraid: store callback in scsi_cmnd.host_scribble Hannes Reinecke
2021-11-25 15:10 ` [PATCH 14/15] aacraid: use scsi_get_internal_cmd() Hannes Reinecke
2021-11-25 15:10 ` [PATCH 15/15] aacraid: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
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=2cef903a-80ec-216b-b99a-e4021511711e@huawei.com \
--to=john.garry@huawei.com \
--cc=bvanassche@acm.org \
--cc=chenxiang66@hisilicon.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=james.bottomley@hansenpartnership.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/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