Messages in this thread | | | Subject | Re: [PATCH RFC v2 02/24] scsi: allocate separate queue for reserved commands | From | John Garry <> | Date | Thu, 23 Apr 2020 15:13:15 +0100 |
| |
On 07/04/2020 17:30, Christoph Hellwig wrote: > On Tue, Apr 07, 2020 at 04:00:10PM +0200, Hannes Reinecke wrote: >> My concern is this: >> >> struct scsi_device *scsi_get_host_dev(struct Scsi_Host *shost) >> { >> [ .. ] >> starget = scsi_alloc_target(&shost->shost_gendev, 0, shost->this_id); >> [ .. ] >> >> and we have typically: >> >> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c: .this_id = -1, >> >> It's _very_ uncommon to have a negative number as the SCSI target device; in >> fact, it _is_ an unsigned int already. >> >> But alright, I'll give it a go; let's see what I'll end up with. > > But this shouldn't be exposed anywhere. And I prefer that over having > magic requests/scsi_cmnd that do not have a valid ->device pointer. > . >
(just looking at this again)
Hi Christoph,
So how would this look added in scsi_lib.c:
struct scsi_cmnd *scsi_get_reserved_cmd(struct Scsi_Host *shost) { struct scsi_cmnd *scmd; struct request *rq; struct scsi_device *sdev = scsi_get_host_dev(shost);
if (!sdev) return NULL;
rq = blk_mq_alloc_request(sdev->request_queue, REQ_OP_DRV_OUT | REQ_NOWAIT, BLK_MQ_REQ_RESERVED); if (IS_ERR(rq)) // fix tidy-up return NULL; WARN_ON(rq->tag == -1); scmd = blk_mq_rq_to_pdu(rq); scmd->request = rq; scmd->device = sdev;
return scmd; } EXPORT_SYMBOL_GPL(scsi_get_reserved_cmd);
void scsi_put_reserved_cmd(struct scsi_cmnd *scmd) { struct request *rq = blk_mq_rq_from_pdu(scmd);
if (blk_mq_rq_is_reserved(rq)) { struct scsi_device *sdev = scmd->device; blk_mq_free_request(rq); scsi_free_host_dev(sdev); } } EXPORT_SYMBOL_GPL(scsi_put_reserved_cmd);
Not sure if we want a static scsi_device per host, or alloc and free dynamically.
(@Hannes, I also have some proper patches for libsas if you want to add it)
Cheers, John
| |