[SeaBIOS] [PATCH 0/9] add support for generic lun enumeration

Roman Kagan posted 9 patches 7 years, 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/seabios tags/patchew/20170301104542.7373-1-rkagan@virtuozzo.com
There is a newer version of this series
src/hw/blockcmd.h    |  4 +++
src/hw/blockcmd.c    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/hw/esp-scsi.c    | 35 +++++++++++++------
src/hw/lsi-scsi.c    | 39 +++++++++++++++------
src/hw/mpt-scsi.c    | 40 ++++++++++++++--------
src/hw/pvscsi.c      |  2 +-
src/hw/usb-uas.c     | 45 +++++++++++++++---------
src/hw/virtio-scsi.c | 38 ++++++++++++++-------
8 files changed, 235 insertions(+), 64 deletions(-)
[SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
A number of SCSI drivers currently only see luns #0 in their targets.

This may be a problem when drives have to be assigned bigger lun
numbers, e.g. because the storage controllers don't provide enough
target numbers to accomodate all drives.
(In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
controller which is limited to 2 targets only).

This series adds generic SCSI lun enumeration (either via REPORT LUNS
command or sequentially trying every lun), and makes the respective
drivers use it.

Note that the series has only been minimally tested against a recent QEMU.

Roman Kagan (9):
  blockcmd: accept only disks and CD-ROMs
  blockcmd: generic SCSI luns enumeration
  virtio-scsi: enumerate luns with REPORT LUNS
  esp-scsi: enumerate luns with REPORT LUNS
  usb-uas: enumerate luns with REPORT LUNS
  pvscsi: fix the comment about lun enumeration
  mpt-scsi: try to enumerate luns with REPORT LUNS
  lsi-scsi: reset in case of a serious problem
  lsi-scsi: try to enumerate luns with REPORT LUNS

 src/hw/blockcmd.h    |  4 +++
 src/hw/blockcmd.c    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/hw/esp-scsi.c    | 35 +++++++++++++------
 src/hw/lsi-scsi.c    | 39 +++++++++++++++------
 src/hw/mpt-scsi.c    | 40 ++++++++++++++--------
 src/hw/pvscsi.c      |  2 +-
 src/hw/usb-uas.c     | 45 +++++++++++++++---------
 src/hw/virtio-scsi.c | 38 ++++++++++++++-------
 8 files changed, 235 insertions(+), 64 deletions(-)

-- 
2.9.3


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Kevin O'Connor 7 years, 1 month ago
On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> A number of SCSI drivers currently only see luns #0 in their targets.
> 
> This may be a problem when drives have to be assigned bigger lun
> numbers, e.g. because the storage controllers don't provide enough
> target numbers to accomodate all drives.
> (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> controller which is limited to 2 targets only).
> 
> This series adds generic SCSI lun enumeration (either via REPORT LUNS
> command or sequentially trying every lun), and makes the respective
> drivers use it.

Thanks.  Let me make sure I understand this series.  Some scsi
controllers have hardware specific mechanisms for finding the number
of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
lsi-scsi).

The basic difficulty with implementing REPORT LUNS in seabios is that
the code needs a "struct drive_s" to issue the REPORT LUNS command,
but since the drive parameters (or even the number of drives) aren't
known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
Thus the series breaks the driver xxx_add_lun() functions into
xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.

An additional complexity is that the REPORT LUNS mechanism is broken
in current QEMU on lsi-scsi and mpt-scsi.

Your goal is to add support for "Hyper-V VMBus SCSI" which also
requires REPORT LUNS.

Is the above correct?

-Kevin

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> > A number of SCSI drivers currently only see luns #0 in their targets.
> > 
> > This may be a problem when drives have to be assigned bigger lun
> > numbers, e.g. because the storage controllers don't provide enough
> > target numbers to accomodate all drives.
> > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > controller which is limited to 2 targets only).
> > 
> > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > command or sequentially trying every lun), and makes the respective
> > drivers use it.
> 
> Thanks.  Let me make sure I understand this series.  Some scsi
> controllers have hardware specific mechanisms for finding the number
> of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
> REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
> lsi-scsi).
> 
> The basic difficulty with implementing REPORT LUNS in seabios is that
> the code needs a "struct drive_s" to issue the REPORT LUNS command,
> but since the drive parameters (or even the number of drives) aren't
> known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
> Thus the series breaks the driver xxx_add_lun() functions into
> xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.
> 
> An additional complexity is that the REPORT LUNS mechanism is broken
> in current QEMU on lsi-scsi and mpt-scsi.
> 
> Your goal is to add support for "Hyper-V VMBus SCSI" which also
> requires REPORT LUNS.
> 
> Is the above correct?

Absolutely.  I couldn't have explained it better.

One minor nit is that, strictly speaking, the upcoming vmbus scsi driver
doesn't *require* REPORTS LUNS.  It's just that it would be too limiting
if the users had to stick with lun #0 only like was currently the case
with other drivers: here the number of available targets was only 2, and
thus the number of BIOS-visible disks would be no more than that.

So I thought it was a good idea to start with a series that adds generic
lun enumeration to the SCSI layer, that would lift this limitation for
the future vmbus scsi and could benefit other drivers, too.

Thanks,
Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Kevin O'Connor 7 years, 1 month ago
On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> > > A number of SCSI drivers currently only see luns #0 in their targets.
> > > 
> > > This may be a problem when drives have to be assigned bigger lun
> > > numbers, e.g. because the storage controllers don't provide enough
> > > target numbers to accomodate all drives.
> > > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > > controller which is limited to 2 targets only).
> > > 
> > > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > > command or sequentially trying every lun), and makes the respective
> > > drivers use it.
> > 
> > Thanks.  Let me make sure I understand this series.  Some scsi
> > controllers have hardware specific mechanisms for finding the number
> > of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
> > REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
> > lsi-scsi).
> > 
> > The basic difficulty with implementing REPORT LUNS in seabios is that
> > the code needs a "struct drive_s" to issue the REPORT LUNS command,
> > but since the drive parameters (or even the number of drives) aren't
> > known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
> > Thus the series breaks the driver xxx_add_lun() functions into
> > xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.
> > 
> > An additional complexity is that the REPORT LUNS mechanism is broken
> > in current QEMU on lsi-scsi and mpt-scsi.
> > 
> > Your goal is to add support for "Hyper-V VMBus SCSI" which also
> > requires REPORT LUNS.
> > 
> > Is the above correct?
> 
> Absolutely.  I couldn't have explained it better.
> 
> One minor nit is that, strictly speaking, the upcoming vmbus scsi driver
> doesn't *require* REPORTS LUNS.  It's just that it would be too limiting
> if the users had to stick with lun #0 only like was currently the case
> with other drivers: here the number of available targets was only 2, and
> thus the number of BIOS-visible disks would be no more than that.
> 
> So I thought it was a good idea to start with a series that adds generic
> lun enumeration to the SCSI layer, that would lift this limitation for
> the future vmbus scsi and could benefit other drivers, too.

Thanks.

I have a few high-level comments on the series.  I wonder if there is
a way to reduce the amount of control passing between the generic scsi
code and the driver code.  Specifically, I wonder if the callback
function scsi_add_lun could be simplified.  Some thoughts:

- instead of scsi_rep_luns_scan() being passed a callback, perhaps
  introduce a scsi_get_luns() command that returns a malloc'd struct
  containing the list of luns.  The driver code could then iterate
  over the list.

- if REPORT LUNS fails, then I don't think we need to iterate over
  every possible lun.  If this is just to workaround qemu issues, then
  falling back to just using the first lun should be fine.

- instead of calling xxx_init_lun() in each driver's xxx_add_lun()
  function, I wonder if the code would be simpler if it just memcpy'd
  the tmpl_drv struct over and modified the lun parameter.

Sorry for the delay in responding.
-Kevin

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
[ cc-ing my colleague Eugeniy who's interested in this discussion, too ]

On Mon, Mar 13, 2017 at 12:11:49PM -0400, Kevin O'Connor wrote:
> On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> > On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > > On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> > > > A number of SCSI drivers currently only see luns #0 in their targets.
> > > > 
> > > > This may be a problem when drives have to be assigned bigger lun
> > > > numbers, e.g. because the storage controllers don't provide enough
> > > > target numbers to accomodate all drives.
> > > > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > > > controller which is limited to 2 targets only).
> > > > 
> > > > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > > > command or sequentially trying every lun), and makes the respective
> > > > drivers use it.
> > > 
> > > Thanks.  Let me make sure I understand this series.  Some scsi
> > > controllers have hardware specific mechanisms for finding the number
> > > of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
> > > REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
> > > lsi-scsi).
> > > 
> > > The basic difficulty with implementing REPORT LUNS in seabios is that
> > > the code needs a "struct drive_s" to issue the REPORT LUNS command,
> > > but since the drive parameters (or even the number of drives) aren't
> > > known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
> > > Thus the series breaks the driver xxx_add_lun() functions into
> > > xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.
> > > 
> > > An additional complexity is that the REPORT LUNS mechanism is broken
> > > in current QEMU on lsi-scsi and mpt-scsi.
> > > 
> > > Your goal is to add support for "Hyper-V VMBus SCSI" which also
> > > requires REPORT LUNS.
> > > 
> > > Is the above correct?
> > 
> > Absolutely.  I couldn't have explained it better.
> > 
> > One minor nit is that, strictly speaking, the upcoming vmbus scsi driver
> > doesn't *require* REPORTS LUNS.  It's just that it would be too limiting
> > if the users had to stick with lun #0 only like was currently the case
> > with other drivers: here the number of available targets was only 2, and
> > thus the number of BIOS-visible disks would be no more than that.
> > 
> > So I thought it was a good idea to start with a series that adds generic
> > lun enumeration to the SCSI layer, that would lift this limitation for
> > the future vmbus scsi and could benefit other drivers, too.
> 
> Thanks.
> 
> I have a few high-level comments on the series.  I wonder if there is
> a way to reduce the amount of control passing between the generic scsi
> code and the driver code.  Specifically, I wonder if the callback
> function scsi_add_lun could be simplified.  Some thoughts:
> 
> - instead of scsi_rep_luns_scan() being passed a callback, perhaps
>   introduce a scsi_get_luns() command that returns a malloc'd struct
>   containing the list of luns.  The driver code could then iterate
>   over the list.

I considered this at first, but it looked like more boilerplate code in
the drivers so I decided to go with the callback.

> - if REPORT LUNS fails, then I don't think we need to iterate over
>   every possible lun.  If this is just to workaround qemu issues, then
>   falling back to just using the first lun should be fine.

Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
it's used in the patchset are the ones where REPORT LUNS is known to
fail due to QEMU issues.  At least for mpt-scsi it increases the number
of drives supported by SeaBIOS with the existing QEMU (it supports 2
luns per target).  And no, I don't see it as very important.

> - instead of calling xxx_init_lun() in each driver's xxx_add_lun()
>   function, I wonder if the code would be simpler if it just memcpy'd
>   the tmpl_drv struct over and modified the lun parameter.

Quite possible.  Note though that xxx_init_lun() is typically called in
two places: in xxx_add_lun() and xxx_scan_target(); in the latter it
initializes the on-stack temporary drive descriptor with the arguments
passed in.  So the alternative you propose would imply open-coding the
template drive initialization in xxx_scan_target() and doing memcpy()
followed by setting lun# in xxx_add_lun().  Fine by me, too; let me know
if you want it coded like that.

Thanks,
Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Paolo Bonzini 7 years, 1 month ago

On 14/03/2017 16:16, Roman Kagan wrote:
>> - if REPORT LUNS fails, then I don't think we need to iterate over
>>   every possible lun.  If this is just to workaround qemu issues, then
>>   falling back to just using the first lun should be fine.
> 
> Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
> scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
> it's used in the patchset are the ones where REPORT LUNS is known to
> fail due to QEMU issues.  At least for mpt-scsi it increases the number
> of drives supported by SeaBIOS with the existing QEMU (it supports 2
> luns per target).  And no, I don't see it as very important.

At least for mpt-scsi we should fix it.  lsi-scsi might be a SeaBIOS bug
too, but I don't know the hardware too well.

Paolo

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
On Tue, Mar 14, 2017 at 07:13:19PM +0100, Paolo Bonzini wrote:
> On 14/03/2017 16:16, Roman Kagan wrote:
> >> - if REPORT LUNS fails, then I don't think we need to iterate over
> >>   every possible lun.  If this is just to workaround qemu issues, then
> >>   falling back to just using the first lun should be fine.
> > 
> > Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
> > scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
> > it's used in the patchset are the ones where REPORT LUNS is known to
> > fail due to QEMU issues.  At least for mpt-scsi it increases the number
> > of drives supported by SeaBIOS with the existing QEMU (it supports 2
> > luns per target).  And no, I don't see it as very important.
> 
> At least for mpt-scsi we should fix it.  lsi-scsi might be a SeaBIOS bug
> too, but I don't know the hardware too well.

Do you mean fixing in SeaBIOS or in QEMU?

OK let me sum up the limitations in various places:

- mpt-scsi:

  * in SeaBIOS:

    1) only lun #0 is scanned
    2) mpt_scsi_cmd() bails out on lun != 0
    3) the code assumes uint8_t per lun #

    The patchset removes 2), and scans with REPORT LUNS and, failing
    that, sequentially luns ##0-7.

  * in QEMU:

    1) mptsas_scsi_info.max_lun = 1 (i.e. one can only create 2 luns per
    target)
    2) the code assumes that lun# fits in uint8_t

  For reference, mptsas driver in Linux allows up to 16895 luns (the
  limit is tunable via module parameter).


- lsi-scsi:

  * in SeaBIOS:

    1) only lun #0 is scanned
    2) the code assumes 3 bits per lun #

    The patchset scans with REPORT LUNS and, failing that, sequentially
    luns ##0-7; besides, it fixes recovery from failed requests (like
    REPORT LUNS or INQUIRY on an inactive lun).

  * in QEMU:

    1) lsi_scsi_info.max_lun = 0 with a comment "LUN support is buggy"
    2) the code assumes 3 bits per lun #

  For reference, sym53c8xx driver in Linux allows up to 64 luns but has
  a comment that "target that implements more than 7 logical units are
  pretty rare".


So, when used with existing QEMU versions, scanning sequentially 8 luns
is indeed unnecessary for both drivers: for the former 2 is enough, for
the latter only lun #0 is possible.  Once REPORT LUNS for these devices
is fixed in QEMU, this won't matter any longer.

Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Paolo Bonzini 7 years, 1 month ago

On 15/03/2017 12:33, Roman Kagan wrote:
> On Tue, Mar 14, 2017 at 07:13:19PM +0100, Paolo Bonzini wrote:
>> On 14/03/2017 16:16, Roman Kagan wrote:
>>>> - if REPORT LUNS fails, then I don't think we need to iterate over
>>>>   every possible lun.  If this is just to workaround qemu issues, then
>>>>   falling back to just using the first lun should be fine.
>>>
>>> Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
>>> scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
>>> it's used in the patchset are the ones where REPORT LUNS is known to
>>> fail due to QEMU issues.  At least for mpt-scsi it increases the number
>>> of drives supported by SeaBIOS with the existing QEMU (it supports 2
>>> luns per target).  And no, I don't see it as very important.
>>
>> At least for mpt-scsi we should fix it.  lsi-scsi might be a SeaBIOS bug
>> too, but I don't know the hardware too well.
> 
> Do you mean fixing in SeaBIOS or in QEMU?
> 
> OK let me sum up the limitations in various places:
> 
> - mpt-scsi:
> 
>   * in SeaBIOS:
> 
>     1) only lun #0 is scanned
>     2) mpt_scsi_cmd() bails out on lun != 0
>     3) the code assumes uint8_t per lun #
> 
>     The patchset removes 2), and scans with REPORT LUNS and, failing
>     that, sequentially luns ##0-7.
> 
>   * in QEMU:
> 
>     1) mptsas_scsi_info.max_lun = 1 (i.e. one can only create 2 luns per
>     target)
>     2) the code assumes that lun# fits in uint8_t
> 
>   For reference, mptsas driver in Linux allows up to 16895 luns (the
>   limit is tunable via module parameter).

We can remove (1), making max_lun 255, and we can fix any problems with
REPORT LUNS too.

Paolo

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
On Tue, Mar 14, 2017 at 06:16:04PM +0300, Roman Kagan wrote:
> On Mon, Mar 13, 2017 at 12:11:49PM -0400, Kevin O'Connor wrote:
> > On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> > > On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > > > On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> > > > > A number of SCSI drivers currently only see luns #0 in their targets.
> > > > > 
> > > > > This may be a problem when drives have to be assigned bigger lun
> > > > > numbers, e.g. because the storage controllers don't provide enough
> > > > > target numbers to accomodate all drives.
> > > > > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > > > > controller which is limited to 2 targets only).
> > > > > 
> > > > > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > > > > command or sequentially trying every lun), and makes the respective
> > > > > drivers use it.
> > > > 
> > > > Thanks.  Let me make sure I understand this series.  Some scsi
> > > > controllers have hardware specific mechanisms for finding the number
> > > > of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
> > > > REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
> > > > lsi-scsi).
> > > > 
> > > > The basic difficulty with implementing REPORT LUNS in seabios is that
> > > > the code needs a "struct drive_s" to issue the REPORT LUNS command,
> > > > but since the drive parameters (or even the number of drives) aren't
> > > > known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
> > > > Thus the series breaks the driver xxx_add_lun() functions into
> > > > xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.
> > > > 
> > > > An additional complexity is that the REPORT LUNS mechanism is broken
> > > > in current QEMU on lsi-scsi and mpt-scsi.
> > > > 
> > > > Your goal is to add support for "Hyper-V VMBus SCSI" which also
> > > > requires REPORT LUNS.
> > > > 
> > > > Is the above correct?
> > > 
> > > Absolutely.  I couldn't have explained it better.
> > > 
> > > One minor nit is that, strictly speaking, the upcoming vmbus scsi driver
> > > doesn't *require* REPORTS LUNS.  It's just that it would be too limiting
> > > if the users had to stick with lun #0 only like was currently the case
> > > with other drivers: here the number of available targets was only 2, and
> > > thus the number of BIOS-visible disks would be no more than that.
> > > 
> > > So I thought it was a good idea to start with a series that adds generic
> > > lun enumeration to the SCSI layer, that would lift this limitation for
> > > the future vmbus scsi and could benefit other drivers, too.
> > 
> > Thanks.
> > 
> > I have a few high-level comments on the series.  I wonder if there is
> > a way to reduce the amount of control passing between the generic scsi
> > code and the driver code.  Specifically, I wonder if the callback
> > function scsi_add_lun could be simplified.  Some thoughts:
> > 
> > - instead of scsi_rep_luns_scan() being passed a callback, perhaps
> >   introduce a scsi_get_luns() command that returns a malloc'd struct
> >   containing the list of luns.  The driver code could then iterate
> >   over the list.
> 
> I considered this at first, but it looked like more boilerplate code in
> the drivers so I decided to go with the callback.
> 
> > - if REPORT LUNS fails, then I don't think we need to iterate over
> >   every possible lun.  If this is just to workaround qemu issues, then
> >   falling back to just using the first lun should be fine.
> 
> Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
> scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
> it's used in the patchset are the ones where REPORT LUNS is known to
> fail due to QEMU issues.  At least for mpt-scsi it increases the number
> of drives supported by SeaBIOS with the existing QEMU (it supports 2
> luns per target).  And no, I don't see it as very important.
> 
> > - instead of calling xxx_init_lun() in each driver's xxx_add_lun()
> >   function, I wonder if the code would be simpler if it just memcpy'd
> >   the tmpl_drv struct over and modified the lun parameter.
> 
> Quite possible.  Note though that xxx_init_lun() is typically called in
> two places: in xxx_add_lun() and xxx_scan_target(); in the latter it
> initializes the on-stack temporary drive descriptor with the arguments
> passed in.  So the alternative you propose would imply open-coding the
> template drive initialization in xxx_scan_target() and doing memcpy()
> followed by setting lun# in xxx_add_lun().  Fine by me, too; let me know
> if you want it coded like that.

Sorry I must've missed the verdict regarding this patchset.  Are there
still concerns that need fixing on my part, or is it ok as is?

Thanks,
Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Kevin O'Connor 7 years, 1 month ago
On Mon, Mar 27, 2017 at 06:31:29PM +0300, Roman Kagan wrote:
> On Tue, Mar 14, 2017 at 06:16:04PM +0300, Roman Kagan wrote:
> > On Mon, Mar 13, 2017 at 12:11:49PM -0400, Kevin O'Connor wrote:
> > > On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> > > > On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > > > > On Wed, Mar 01, 2017 at 01:45:33PM +0300, Roman Kagan wrote:
> > > > > > A number of SCSI drivers currently only see luns #0 in their targets.
> > > > > > 
> > > > > > This may be a problem when drives have to be assigned bigger lun
> > > > > > numbers, e.g. because the storage controllers don't provide enough
> > > > > > target numbers to accomodate all drives.
> > > > > > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > > > > > controller which is limited to 2 targets only).
> > > > > > 
> > > > > > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > > > > > command or sequentially trying every lun), and makes the respective
> > > > > > drivers use it.
> > > > > 
> > > > > Thanks.  Let me make sure I understand this series.  Some scsi
> > > > > controllers have hardware specific mechanisms for finding the number
> > > > > of luns (usb-msc, megasas, pvscsi) and some controllers use a generic
> > > > > REPORT LUNS mechanism (virtio-scsi, esp-scsi, usb-uas, mpt-scsi,
> > > > > lsi-scsi).
> > > > > 
> > > > > The basic difficulty with implementing REPORT LUNS in seabios is that
> > > > > the code needs a "struct drive_s" to issue the REPORT LUNS command,
> > > > > but since the drive parameters (or even the number of drives) aren't
> > > > > known, a dummy "lun0" drive_s must be created just for REPORT LUNS.
> > > > > Thus the series breaks the driver xxx_add_lun() functions into
> > > > > xxx_init_lun() and xxx_add_lun() so that a dummy lun0 can be created.
> > > > > 
> > > > > An additional complexity is that the REPORT LUNS mechanism is broken
> > > > > in current QEMU on lsi-scsi and mpt-scsi.
> > > > > 
> > > > > Your goal is to add support for "Hyper-V VMBus SCSI" which also
> > > > > requires REPORT LUNS.
> > > > > 
> > > > > Is the above correct?
> > > > 
> > > > Absolutely.  I couldn't have explained it better.
> > > > 
> > > > One minor nit is that, strictly speaking, the upcoming vmbus scsi driver
> > > > doesn't *require* REPORTS LUNS.  It's just that it would be too limiting
> > > > if the users had to stick with lun #0 only like was currently the case
> > > > with other drivers: here the number of available targets was only 2, and
> > > > thus the number of BIOS-visible disks would be no more than that.
> > > > 
> > > > So I thought it was a good idea to start with a series that adds generic
> > > > lun enumeration to the SCSI layer, that would lift this limitation for
> > > > the future vmbus scsi and could benefit other drivers, too.
> > > 
> > > Thanks.
> > > 
> > > I have a few high-level comments on the series.  I wonder if there is
> > > a way to reduce the amount of control passing between the generic scsi
> > > code and the driver code.  Specifically, I wonder if the callback
> > > function scsi_add_lun could be simplified.  Some thoughts:
> > > 
> > > - instead of scsi_rep_luns_scan() being passed a callback, perhaps
> > >   introduce a scsi_get_luns() command that returns a malloc'd struct
> > >   containing the list of luns.  The driver code could then iterate
> > >   over the list.
> > 
> > I considered this at first, but it looked like more boilerplate code in
> > the drivers so I decided to go with the callback.

I was thinking the driver could have something like:

    struct scsi_luns *luns = scsi_get_luns(&vlun0.drive);
    for (i = 0; luns && i < luns->count; i++)
        xxx_add_lun(&vlun0, luns->luns[i]);
    free(luns);

One could layout 'struct scsi_luns' to use the same memory as
cdbres_report_luns:

    struct scsi_luns {
        u32 count, pad;
        u64 luns[0];
    }

And scsi_get_luns() could fixup the big-endian conversion in-place (or
the driver loop above could just directly call
be32_to_cpu/be64_to_cpu).  If REPORT LUNS fails then scsi_get_luns()
could just fill in 'struct scsi_luns' with count=1, lun[0]=0.

> > > - if REPORT LUNS fails, then I don't think we need to iterate over
> > >   every possible lun.  If this is just to workaround qemu issues, then
> > >   falling back to just using the first lun should be fine.
> > 
> > Perhaps.  As it was trivial to code scsi_sequential_scan in addition to
> > scsi_rep_luns_scan, I went ahead and did it.  Yes the two places where
> > it's used in the patchset are the ones where REPORT LUNS is known to
> > fail due to QEMU issues.  At least for mpt-scsi it increases the number
> > of drives supported by SeaBIOS with the existing QEMU (it supports 2
> > luns per target).  And no, I don't see it as very important.
> > 
> > > - instead of calling xxx_init_lun() in each driver's xxx_add_lun()
> > >   function, I wonder if the code would be simpler if it just memcpy'd
> > >   the tmpl_drv struct over and modified the lun parameter.
> > 
> > Quite possible.  Note though that xxx_init_lun() is typically called in
> > two places: in xxx_add_lun() and xxx_scan_target(); in the latter it
> > initializes the on-stack temporary drive descriptor with the arguments
> > passed in.  So the alternative you propose would imply open-coding the
> > template drive initialization in xxx_scan_target() and doing memcpy()
> > followed by setting lun# in xxx_add_lun().  Fine by me, too; let me know
> > if you want it coded like that.
> 
> Sorry I must've missed the verdict regarding this patchset.  Are there
> still concerns that need fixing on my part, or is it ok as is?

Sorry for the confusion.

Since this touches so many drivers, I would like to see if we could
simplify the interface.

The above aside, there are a few things I noticed in patch 2:
  - malloc_high shouldn't be used on temporary reservations (as it
    can fragment the permanent memory pool) - use malloc_tmp instead.
  - scsilun2u64() looks like be64_to_cpu - or did I miss something?
  - I'd prefer to avoid backwards goto's - a "for (;;)" loop would be
    preferabale

Thanks,
-Kevin

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years ago
On Mon, Mar 27, 2017 at 12:54:03PM -0400, Kevin O'Connor wrote:
> On Mon, Mar 27, 2017 at 06:31:29PM +0300, Roman Kagan wrote:
> > On Tue, Mar 14, 2017 at 06:16:04PM +0300, Roman Kagan wrote:
> > > On Mon, Mar 13, 2017 at 12:11:49PM -0400, Kevin O'Connor wrote:
> > > > On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> > > > > On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > > > I have a few high-level comments on the series.  I wonder if there is
> > > > a way to reduce the amount of control passing between the generic scsi
> > > > code and the driver code.  Specifically, I wonder if the callback
> > > > function scsi_add_lun could be simplified.  Some thoughts:
> > > > 
> > > > - instead of scsi_rep_luns_scan() being passed a callback, perhaps
> > > >   introduce a scsi_get_luns() command that returns a malloc'd struct
> > > >   containing the list of luns.  The driver code could then iterate
> > > >   over the list.
> > > 
> > > I considered this at first, but it looked like more boilerplate code in
> > > the drivers so I decided to go with the callback.
> 
> I was thinking the driver could have something like:
> 
>     struct scsi_luns *luns = scsi_get_luns(&vlun0.drive);
>     for (i = 0; luns && i < luns->count; i++)
>         xxx_add_lun(&vlun0, luns->luns[i]);
>     free(luns);
> 
> One could layout 'struct scsi_luns' to use the same memory as
> cdbres_report_luns:
> 
>     struct scsi_luns {
>         u32 count, pad;
>         u64 luns[0];
>     }
> 
> And scsi_get_luns() could fixup the big-endian conversion in-place (or
> the driver loop above could just directly call
> be32_to_cpu/be64_to_cpu).  If REPORT LUNS fails then scsi_get_luns()
> could just fill in 'struct scsi_luns' with count=1, lun[0]=0.

I'm not convinced that exposing all this boilerplate is simpler than
hiding the details under the hood of a single function.  Or is perhaps
anything wrong with passing function pointers in general?
Anyway I can do it the way you suggest if this is what you want.


>   - malloc_high shouldn't be used on temporary reservations (as it
>     can fragment the permanent memory pool) - use malloc_tmp instead.

OK

>   - scsilun2u64() looks like be64_to_cpu - or did I miss something?

No it would've been too simple :)  It's a funny mix: the luns are
encoded as four be16-s LE-ordered wrt each other.

>   - I'd prefer to avoid backwards goto's - a "for (;;)" loop would be
>     preferabale

OK

I'll rework and resubmit the patchset once I have your final word on the
interface.

Thanks!
Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Kevin O'Connor 7 years ago
On Tue, Mar 28, 2017 at 07:34:32PM +0300, Roman Kagan wrote:
> On Mon, Mar 27, 2017 at 12:54:03PM -0400, Kevin O'Connor wrote:
> > I was thinking the driver could have something like:
> > 
> >     struct scsi_luns *luns = scsi_get_luns(&vlun0.drive);
> >     for (i = 0; luns && i < luns->count; i++)
> >         xxx_add_lun(&vlun0, luns->luns[i]);
> >     free(luns);
> > 
> > One could layout 'struct scsi_luns' to use the same memory as
> > cdbres_report_luns:
> > 
> >     struct scsi_luns {
> >         u32 count, pad;
> >         u64 luns[0];
> >     }
> > 
> > And scsi_get_luns() could fixup the big-endian conversion in-place (or
> > the driver loop above could just directly call
> > be32_to_cpu/be64_to_cpu).  If REPORT LUNS fails then scsi_get_luns()
> > could just fill in 'struct scsi_luns' with count=1, lun[0]=0.
> 
> I'm not convinced that exposing all this boilerplate is simpler than
> hiding the details under the hood of a single function.  Or is perhaps
> anything wrong with passing function pointers in general?
> Anyway I can do it the way you suggest if this is what you want.

Function pointers are a bit funky in SeaBIOS - one can't mix them
between 16bit and 32bit mode and one has to be careful with function
addresses referenced in init only code that are used outside of init
only code.  I don't think either of the above is an issue in this
case.

> >   - malloc_high shouldn't be used on temporary reservations (as it
> >     can fragment the permanent memory pool) - use malloc_tmp instead.
> 
> OK
> 
> >   - scsilun2u64() looks like be64_to_cpu - or did I miss something?
> 
> No it would've been too simple :)  It's a funny mix: the luns are
> encoded as four be16-s LE-ordered wrt each other.

Okay - thanks.

> 
> >   - I'd prefer to avoid backwards goto's - a "for (;;)" loop would be
> >     preferabale
> 
> OK
> 
> I'll rework and resubmit the patchset once I have your final word on the
> interface.

The issues above on patch 2 I think do need to be addressed (excluding
my misunderstanding of scsilun2u64).  The use of function pointers is
not a show stopper, I just suspect it would make the code a little
easier to follow.

Thanks,
-Kevin

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Laszlo Ersek 7 years, 1 month ago
On 03/01/17 11:45, Roman Kagan wrote:
> A number of SCSI drivers currently only see luns #0 in their targets.
> 
> This may be a problem when drives have to be assigned bigger lun
> numbers, e.g. because the storage controllers don't provide enough
> target numbers to accomodate all drives.
> (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> controller which is limited to 2 targets only).

How do you run SeaBIOS in Hyper-V guests?

Thanks
Laszlo

> 
> This series adds generic SCSI lun enumeration (either via REPORT LUNS
> command or sequentially trying every lun), and makes the respective
> drivers use it.
> 
> Note that the series has only been minimally tested against a recent QEMU.
> 
> Roman Kagan (9):
>   blockcmd: accept only disks and CD-ROMs
>   blockcmd: generic SCSI luns enumeration
>   virtio-scsi: enumerate luns with REPORT LUNS
>   esp-scsi: enumerate luns with REPORT LUNS
>   usb-uas: enumerate luns with REPORT LUNS
>   pvscsi: fix the comment about lun enumeration
>   mpt-scsi: try to enumerate luns with REPORT LUNS
>   lsi-scsi: reset in case of a serious problem
>   lsi-scsi: try to enumerate luns with REPORT LUNS
> 
>  src/hw/blockcmd.h    |  4 +++
>  src/hw/blockcmd.c    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/hw/esp-scsi.c    | 35 +++++++++++++------
>  src/hw/lsi-scsi.c    | 39 +++++++++++++++------
>  src/hw/mpt-scsi.c    | 40 ++++++++++++++--------
>  src/hw/pvscsi.c      |  2 +-
>  src/hw/usb-uas.c     | 45 +++++++++++++++---------
>  src/hw/virtio-scsi.c | 38 ++++++++++++++-------
>  8 files changed, 235 insertions(+), 64 deletions(-)
> 


_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years, 1 month ago
On Thu, Mar 02, 2017 at 06:20:29PM +0100, Laszlo Ersek wrote:
> On 03/01/17 11:45, Roman Kagan wrote:
> > A number of SCSI drivers currently only see luns #0 in their targets.
> > 
> > This may be a problem when drives have to be assigned bigger lun
> > numbers, e.g. because the storage controllers don't provide enough
> > target numbers to accomodate all drives.
> > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > controller which is limited to 2 targets only).
> 
> How do you run SeaBIOS in Hyper-V guests?

We run it in QEMU with Hyper-V VMBus paravitual storage controller.
It's not in upstream QEMU yet, we're hammering it out and about to
submit it soonish.  (I spoke about this project at the KVM Forum last
summer).

Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Laszlo Ersek 7 years, 1 month ago
On 03/02/17 20:48, Roman Kagan wrote:
> On Thu, Mar 02, 2017 at 06:20:29PM +0100, Laszlo Ersek wrote:
>> On 03/01/17 11:45, Roman Kagan wrote:
>>> A number of SCSI drivers currently only see luns #0 in their targets.
>>>
>>> This may be a problem when drives have to be assigned bigger lun
>>> numbers, e.g. because the storage controllers don't provide enough
>>> target numbers to accomodate all drives.
>>> (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
>>> controller which is limited to 2 targets only).
>>
>> How do you run SeaBIOS in Hyper-V guests?
> 
> We run it in QEMU with Hyper-V VMBus paravitual storage controller.
> It's not in upstream QEMU yet, we're hammering it out and about to
> submit it soonish.  (I spoke about this project at the KVM Forum last
> summer).

Yes. I just wanted to make sure it was the same thing.

Thanks
Laszlo

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://www.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Paolo Bonzini 7 years ago

On 01/03/2017 18:45, Roman Kagan wrote:
> A number of SCSI drivers currently only see luns #0 in their targets.
> 
> This may be a problem when drives have to be assigned bigger lun
> numbers, e.g. because the storage controllers don't provide enough
> target numbers to accomodate all drives.
> (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> controller which is limited to 2 targets only).
> 
> This series adds generic SCSI lun enumeration (either via REPORT LUNS
> command or sequentially trying every lun), and makes the respective
> drivers use it.
> 
> Note that the series has only been minimally tested against a recent QEMU.

Hi Roman,

are you going to send v2 of this?

Thanks,

Paolo

> Roman Kagan (9):
>   blockcmd: accept only disks and CD-ROMs
>   blockcmd: generic SCSI luns enumeration
>   virtio-scsi: enumerate luns with REPORT LUNS
>   esp-scsi: enumerate luns with REPORT LUNS
>   usb-uas: enumerate luns with REPORT LUNS
>   pvscsi: fix the comment about lun enumeration
>   mpt-scsi: try to enumerate luns with REPORT LUNS
>   lsi-scsi: reset in case of a serious problem
>   lsi-scsi: try to enumerate luns with REPORT LUNS
> 
>  src/hw/blockcmd.h    |  4 +++
>  src/hw/blockcmd.c    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/hw/esp-scsi.c    | 35 +++++++++++++------
>  src/hw/lsi-scsi.c    | 39 +++++++++++++++------
>  src/hw/mpt-scsi.c    | 40 ++++++++++++++--------
>  src/hw/pvscsi.c      |  2 +-
>  src/hw/usb-uas.c     | 45 +++++++++++++++---------
>  src/hw/virtio-scsi.c | 38 ++++++++++++++-------
>  8 files changed, 235 insertions(+), 64 deletions(-)
> 

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios
Re: [SeaBIOS] [PATCH 0/9] add support for generic lun enumeration
Posted by Roman Kagan 7 years ago
On Sun, Apr 09, 2017 at 01:31:10AM +0800, Paolo Bonzini wrote:
> On 01/03/2017 18:45, Roman Kagan wrote:
> > A number of SCSI drivers currently only see luns #0 in their targets.
> > 
> > This may be a problem when drives have to be assigned bigger lun
> > numbers, e.g. because the storage controllers don't provide enough
> > target numbers to accomodate all drives.
> > (In particular, I'm about to submit a driver for Hyper-V VMBus SCSI
> > controller which is limited to 2 targets only).
> > 
> > This series adds generic SCSI lun enumeration (either via REPORT LUNS
> > command or sequentially trying every lun), and makes the respective
> > drivers use it.
> > 
> > Note that the series has only been minimally tested against a recent QEMU.
> 
> Hi Roman,
> 
> are you going to send v2 of this?

Yes, sure.

I've had higher priority things to do lately, hence the delay.  I should
be able to submit v2 in a matter of days.

Roman.

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
https://mail.coreboot.org/mailman/listinfo/seabios