From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:35158) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T3kyj-0000Uv-Ci for qemu-devel@nongnu.org; Tue, 21 Aug 2012 05:42:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T3kyi-0005dU-8D for qemu-devel@nongnu.org; Tue, 21 Aug 2012 05:42:29 -0400 Received: from e23smtp09.au.ibm.com ([202.81.31.142]:44269) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T3kyh-0005dE-Lh for qemu-devel@nongnu.org; Tue, 21 Aug 2012 05:42:28 -0400 Received: from /spool/local by e23smtp09.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 21 Aug 2012 19:41:17 +1000 Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q7L9XdQZ12714158 for ; Tue, 21 Aug 2012 19:33:39 +1000 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q7L9gJwW020122 for ; Tue, 21 Aug 2012 19:42:20 +1000 Message-ID: <503357F9.2020606@linux.vnet.ibm.com> Date: Tue, 21 Aug 2012 17:42:17 +0800 From: Cong Meng MIME-Version: 1.0 References: <1345537609-21676-1-git-send-email-mc@linux.vnet.ibm.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v1] virtio-scsi: get and set the queue limits for sg device List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: stefanha@linux.vnet.ibm.com, zwanp@cn.ibm.com, linuxram@us.ibm.com, qemu-devel@nongnu.org, linux-kernel@vger.kernel.org, Paolo Bonzini , virtualization@lists.linux-foundation.org On Tue 21 Aug 2012 04:53:59 PM CST, Stefan Hajnoczi wrote: > On Tue, Aug 21, 2012 at 9:26 AM, Cong Meng wrote: >> Each virtio scsi HBA has global request queue limits. But the passthrough >> LUNs (scsi-generic) come from different host HBAs may have different request >> queue limits. If the guest sends commands that exceed the host limits, the >> commands will be rejected by host HAB. >> >> This patch addresses this issue by getting the per-LUN queue limits via the the >> newly added virtio control request, then setting them properly. >> >> Signed-off-by: Cong Meng >> --- >> drivers/scsi/virtio_scsi.c | 113 +++++++++++++++++++++++++++++++++++++------ >> include/linux/virtio_scsi.h | 18 +++++++ >> 2 files changed, 116 insertions(+), 15 deletions(-) >> >> diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c >> index 173cb39..ec5066f 100644 >> --- a/drivers/scsi/virtio_scsi.c >> +++ b/drivers/scsi/virtio_scsi.c >> @@ -35,12 +35,14 @@ struct virtio_scsi_cmd { >> struct virtio_scsi_cmd_req cmd; >> struct virtio_scsi_ctrl_tmf_req tmf; >> struct virtio_scsi_ctrl_an_req an; >> + struct virtio_scsi_ctrl_lq_req lq; >> } req; >> union { >> struct virtio_scsi_cmd_resp cmd; >> struct virtio_scsi_ctrl_tmf_resp tmf; >> struct virtio_scsi_ctrl_an_resp an; >> struct virtio_scsi_event evt; >> + struct virtio_scsi_ctrl_lq_resp lq; >> } resp; >> } ____cacheline_aligned_in_smp; >> >> @@ -469,6 +471,46 @@ out: >> return ret; >> } >> >> +static u32 virtscsi_lun_query(struct scsi_device *sdev, u32 *value, u32 subtype) >> +{ >> + struct Scsi_Host *shost = sdev->host; >> + struct virtio_scsi *vscsi = shost_priv(shost); >> + DECLARE_COMPLETION_ONSTACK(comp); >> + struct virtio_scsi_cmd *cmd; >> + struct virtio_scsi_target_state *tgt = vscsi->tgt[sdev->id]; >> + unsigned int ret = VIRTIO_SCSI_S_FAILURE; >> + >> + cmd = mempool_alloc(virtscsi_cmd_pool, GFP_ATOMIC); >> + if (!cmd) >> + goto out; >> + >> + memset(cmd, 0, sizeof(*cmd)); >> + cmd->comp = ∁ >> + cmd->req.lq = (struct virtio_scsi_ctrl_lq_req){ >> + .type = VIRTIO_SCSI_T_LUN_QUERY, >> + .subtype = subtype, >> + .lun[0] = 1, >> + .lun[1] = sdev->id, >> + .lun[2] = (sdev->lun >> 8) | 0x40, >> + .lun[3] = sdev->lun & 0xff, > > The LUN addressing code has been duplicated several times now. How > about replacing it with something like sure. I will include it. Thnaks. Cong. > > static void virtio_scsi_set_lun(u8 *lun, struct scsi_device *sdev) > { > lun[0] = 1; > lun[1] = sdev->id; > lun[2] = (sdev->lun >> 8) | 0x40; > lun[3] = sdev->lun & 0xff; > lun[4] = lun[5] = lun[6] = lun[7] = 0; > } >