From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.groups.io with SMTP id smtpd.web12.47785.1585567774452724801 for ; Mon, 30 Mar 2020 04:29:34 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=UkhpjA8H; spf=pass (domain: redhat.com, ip: 216.205.24.74, mailfrom: lersek@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585567773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YCvsv5wr4fiXJ3HjXgL4GNPIq1WtWHIlgISGAGB4diQ=; b=UkhpjA8HNvZVTvMEY9CBbHEB6LUjPW004OPhuFKBBsKRA0Alcwj+rO0XUc319nqlM8fuXx SO5VEA3TnQp2+0nYaE9VV5QG6qCvG9VvjKbFKK4u0kISla0IyH9W6RPqYAnXoNZcSY/hAP YX2CRUhR88QDqlEEPREP8c3eWQYNdaw= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-353-xuzX0bSYNxejWmLSRBxSJg-1; Mon, 30 Mar 2020 07:29:31 -0400 X-MC-Unique: xuzX0bSYNxejWmLSRBxSJg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F334E190D35F; Mon, 30 Mar 2020 11:29:23 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-112-191.ams2.redhat.com [10.36.112.191]) by smtp.corp.redhat.com (Postfix) with ESMTP id 058BD5C1B5; Mon, 30 Mar 2020 11:29:21 +0000 (UTC) Subject: Re: [PATCH v2 14/17] OvmfPkg/PvScsiDxe: Introduce DMA communication buffer To: Liran Alon , devel@edk2.groups.io Cc: nikita.leshchenko@oracle.com, aaron.young@oracle.com, jordan.l.justen@intel.com, ard.biesheuvel@linaro.org References: <20200325161005.16743-1-liran.alon@oracle.com> <20200325161005.16743-15-liran.alon@oracle.com> <45e5950c-ec82-c24b-4c38-2912402747b2@redhat.com> <1d747d1e-064e-f24a-f8ac-ac07b91c3999@oracle.com> <2220b9a0-e550-6d9c-c102-f3f2f10326d3@redhat.com> From: "Laszlo Ersek" Message-ID: <596bd3ba-3b15-f1fb-582a-f68654f9c828@redhat.com> Date: Mon, 30 Mar 2020 13:29:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 03/27/20 22:31, Liran Alon wrote: >=20 > On 27/03/2020 16:35, Laszlo Ersek wrote: >> On 03/27/20 01:05, Liran Alon wrote: >>> On 27/03/2020 0:17, Laszlo Ersek wrote: >>>> On 03/25/20 17:10, Liran Alon wrote: >>>>> =C2=A0=C2=A0=C2=A0=C2=A0 PvScsiRestorePciAttributes (Dev); >>>>> diff --git a/OvmfPkg/PvScsiDxe/PvScsi.h b/OvmfPkg/PvScsiDxe/PvScsi.h >>>>> index 6d23b6e1eccf..7f91d70fec79 100644 >>>>> --- a/OvmfPkg/PvScsiDxe/PvScsi.h >>>>> +++ b/OvmfPkg/PvScsiDxe/PvScsi.h >>>>> @@ -31,6 +31,11 @@ typedef struct { >>>>> =C2=A0=C2=A0=C2=A0=C2=A0 PVSCSI_DMA_DESC=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 RingCmpsDmaDesc; >>>>> =C2=A0=C2=A0 } PVSCSI_RING_DESC; >>>>> =C2=A0=C2=A0 +typedef struct { >>>>> +=C2=A0 UINT8=C2=A0=C2=A0=C2=A0=C2=A0 SenseData[MAX_UINT8]; >>>> (4) Is the maximum possible size of the sense data specified >>>> somewhere? If so, it would be nice to document it with a comment at >>>> least. >>> This is a good point. Thanks for pointing it out. >>> Turns out "SCSI Commands Reference Manual" section 2.4.1.1.1 >>> Descriptor format sense data overview specifies: >>> "The additional sense length shall be less than or equal to 244 (i.e., >>> limiting the total length of the sense data to 252 bytes)" >>> >>> i.e. The max possible size of sense data is 252. >>> As another evidence, I saw QEMU's include/hw/scsi/scsi.h indeed >>> defining: >>> >>> #define SCSI_SENSE_BUF_SIZE 252 >>> >>> This change was done by QEMU commit c5f52875b980 ("scsi: Change scsi >>> sense buf size to 252") which says in it's commit message: >>> "According to SPC-4, section 4.5.2.1, 252 is the limit of sense data." >>> >>> Interestingly, this QEMU commit changed the value of >>> SCSI_SENSE_BUF_SIZE from 96 to 252. >>> But then I found this in EDK2 >>> OvmfPkg/Include/IndustryStandard/VirtioScsi.h: >>> >>> // >>> // We expect these maximum sizes from the host. Also we force the >>> CdbLength and >>> // SenseDataLength parameters of >>> EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru() not >>> // to exceed these limits. See UEFI 2.3.1 errata C 14.7. >>> // >>> #define VIRTIO_SCSI_CDB_SIZE=C2=A0=C2=A0 32 >>> #define VIRTIO_SCSI_SENSE_SIZE 96 >>> >>> Which seems to be wrong... >> No, these macros / limits are valid. They match the virtio specification >> (both 0.9.5 and 1.0) -- they match the "cdb_size" and "sense_size" >> configuration values that the virtio-scsi device is required to expose >> by default. >> >> While the driver could theoretically ask for larger sizes, these values >> have never caused a problem in practice. I don't see a reason to change >> the constants (let alone to complicate the code). >> >>> It seems most appropriate to add a SCSI_MAX_SENSE_SIZE constant to >>> EDK2 MdePkg/Include/IndustryStandard/Scsi.h. >>> And then use that from my PvScsi driver. >>> >>> I can also submit a separate patch (Not part of this series) to remove >>> this VIRTIO_SCSI_SENSE_SIZE constant. >> Please don't; there's no reason to change the VirtioScsiDxe driver. >> >>> Note that VirtioScsi doesn't have a technical issue here because it >>> provides this max sense length to the device in VirtioScsiInit(): >>> >>> Status =3D VIRTIO_CFG_WRITE (Dev, SenseSize, VIRTIO_SCSI_SENSE_SIZE); >> Right, and even those config writes are mostly documentation / "just to >> be sure" oriented. Because, there's also a comment in those parts: >> >> =C2=A0=C2=A0 // >> =C2=A0=C2=A0 // We expect these maximum sizes from the host. Since they = are >> =C2=A0=C2=A0 // guest-negotiable, ask for them rather than just checking= them. >> =C2=A0=C2=A0 // >> >>> So if it's OK by you, I think I will just add a patch to this series >>> defining SCSI_MAX_SENSE_SIZE in >>> MdePkg/Include/IndustryStandard/Scsi.h, and then rely on that when >>> defining SenseData in PVSCSI_DMA_BUFFER. >> My experience tells me that making any OvmfPkg change dependent on new >> patches for the core modules (MdePkg, MdeModulePkg, UefiCpuPkg, ...) >> slows down the upstreaming of the OvmfPkg change significantly. >> >> Therefore, I would strongly advise against this ordering of changes. >> >> Today, upon reviewing patch#15, I commented again on the "SenseData" >> array size (see under point (2) in my patch#15 feedback). Accordingly, >> for now, please stick with the existent "SenseData" array declaration, >> just add a comment. I expect / hope to merge your v3 posting. > As an alternative, I can also define SenseData to be of size 252 (which > I would #define as a constant in PvScsi.h), > and explain that it is the limit of total length of SenseData according > to SCSI specification. >=20 > And indeed leave for a separate patch-series to move this PvScsi.h > private constant and put it in the generic > IndustryStandard/Scsi.h header file. >=20 > I think it's nicer than just defining SenseData to be MAX_UINT8 because > of the field size in PassThru packet. > But I will of course do as you prefer. Just let me know your choice :) A new PvScsi.h-internal macro, with replacement text "252", sounds nice. But in that case, you'll have to check (or trim) the "EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET.SenseDataLength" field value on input. I'm fine either way -- my main point is that we shouldn't report more sense room to the device than what we have available in the DMA buffer. If the caller passes in a SenseDataLength that's larger than 252 (such as 254, for example), and our DMA buffer field is 252 bytes large, then we should give 252 to the device, and report back to the caller accordingly (=3D no more than 252 bytes). Thanks, Laszlo >=20 >> >> (Side comment: I would also like to ask Nikita to R-b the full final >> patch set on the list, once I'm ready to merge the series, because I'd >> like to testify to Nikita's review effort in the upstream git history.) >=20 > Ok. I will let him know to review my v3 submission upstream. >=20 > -Liran >=20 >> >> Then, with the series merged, you can propose a separate patch series (2 >> patches), later -- introducing the new constant in MdePkg, plus putting >> the new constant to use in the (then-upstream) PvScsi feature. No matter >> how long that is delayed, the main feature will have been merged. >> >=20