Re: [dm-devel] [PATCH v8 1/9] block: Introduce queue limits for copy-offload support

2023-03-30 Thread Nitesh Shetty
On Wed, Mar 29, 2023 at 09:24:11PM +0900, Damien Le Moal wrote:
> On 3/29/23 19:41, Nitesh Shetty wrote:
> >>> +What:/sys/block//queue/copy_max_bytes
> >>> +Date:November 2022
> >>> +Contact: linux-bl...@vger.kernel.org
> >>> +Description:
> >>> + [RW] While 'copy_max_bytes_hw' is the hardware limit for the
> >>> + device, 'copy_max_bytes' setting is the software limit.
> >>> + Setting this value lower will make Linux issue smaller size
> >>> + copies from block layer.
> >>
> >>This is the maximum number of bytes that the block
> >> layer will allow for a copy request. Must be smaller than
> >> or equal to the maximum size allowed by the hardware 
> >> indicated
> > 
> > Looks good.  Will update in next version. We took reference from discard. 
> > 
> >>by copy_max_bytes_hw. Write 0 to use the default kernel
> >>settings.
> >>
> > 
> > Nack, writing 0 will not set it to default value. (default value is
> > copy_max_bytes = copy_max_bytes_hw)
> 
> It is trivial to make it work that way, which would match how max_sectors_kb
> works. Write 0 to return copy_max_bytes being equal to the default
> copy_max_bytes_hw.
>
> The other possibility that is also interesting is "write 0 to disable copy
> offload and use emulation". This one may actually be more useful.
>

We were following discard implementation.
I feel now both options are good. We can finalize based on community feedback.

> > 
> >>> +
> >>> +
> >>> +What:/sys/block//queue/copy_max_bytes_hw
> >>> +Date:November 2022
> >>> +Contact: linux-bl...@vger.kernel.org
> >>> +Description:
> >>> + [RO] Devices that support offloading copy functionality may have
> >>> + internal limits on the number of bytes that can be offloaded
> >>> + in a single operation. The `copy_max_bytes_hw`
> >>> + parameter is set by the device driver to the maximum number of
> >>> + bytes that can be copied in a single operation. Copy
> >>> + requests issued to the device must not exceed this limit.
> >>> + A value of 0 means that the device does not
> >>> + support copy offload.
> >>
> >>[RO] This is the maximum number of kilobytes supported in a
> >> single data copy offload operation. A value of 0 means 
> >> that the
> >>device does not support copy offload.
> >>
> > 
> > Nack, value is in bytes. Same as discard.
> 
> Typo. I meant Bytes. Your text is too long an too convoluted, so unclear.
>
Acked, will update in next version

> -- 
> Damien Le Moal
> Western Digital Research
> 
> 
--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


Re: [dm-devel] [PATCH v8 1/9] block: Introduce queue limits for copy-offload support

2023-03-30 Thread Nitesh Shetty
On Wed, Mar 29, 2023 at 05:40:09PM +0900, Damien Le Moal wrote:
> On 3/27/23 17:40, Anuj Gupta wrote:
> > From: Nitesh Shetty 
> > 
> > Add device limits as sysfs entries,
> > - copy_offload (RW)
> > - copy_max_bytes (RW)
> > - copy_max_bytes_hw (RO)
> > 
> > Above limits help to split the copy payload in block layer.
> > copy_offload: used for setting copy offload(1) or emulation(0).
> > copy_max_bytes: maximum total length of copy in single payload.
> > copy_max_bytes_hw: Reflects the device supported maximum limit.
> > 
> > Reviewed-by: Hannes Reinecke 
> > Signed-off-by: Nitesh Shetty 
> > Signed-off-by: Kanchan Joshi 
> > Signed-off-by: Anuj Gupta 
> > ---
> >  Documentation/ABI/stable/sysfs-block | 36 
> >  block/blk-settings.c | 24 +++
> >  block/blk-sysfs.c| 64 
> >  include/linux/blkdev.h   | 12 ++
> >  include/uapi/linux/fs.h  |  3 ++
> >  5 files changed, 139 insertions(+)
> > 
> > diff --git a/Documentation/ABI/stable/sysfs-block 
> > b/Documentation/ABI/stable/sysfs-block
> > index c57e5b7cb532..f5c56ad91ad6 100644
> > --- a/Documentation/ABI/stable/sysfs-block
> > +++ b/Documentation/ABI/stable/sysfs-block
> > @@ -155,6 +155,42 @@ Description:
> > last zone of the device which may be smaller.
> >  
> >  
> > +What:  /sys/block//queue/copy_offload
> > +Date:  November 2022
> > +Contact:   linux-bl...@vger.kernel.org
> > +Description:
> > +   [RW] When read, this file shows whether offloading copy to
> > +   device is enabled (1) or disabled (0). Writing '0' to this
> 
> ...to a device...
> 
acked

> > +   file will disable offloading copies for this device.
> > +   Writing any '1' value will enable this feature. If device
> 
> If the device does...
> 
acked

> > +   does not support offloading, then writing 1, will result in
> > +   error.
> > +
> > +
> > +What:  /sys/block//queue/copy_max_bytes
> > +Date:  November 2022
> > +Contact:   linux-bl...@vger.kernel.org
> > +Description:
> > +   [RW] While 'copy_max_bytes_hw' is the hardware limit for the
> > +   device, 'copy_max_bytes' setting is the software limit.
> > +   Setting this value lower will make Linux issue smaller size
> > +   copies from block layer.
> 
>   This is the maximum number of bytes that the block
> layer will allow for a copy request. Must be smaller than
> or equal to the maximum size allowed by the hardware indicated

Looks good.  Will update in next version. We took reference from discard. 

>   by copy_max_bytes_hw. Write 0 to use the default kernel
>   settings.
> 

Nack, writing 0 will not set it to default value. (default value is
copy_max_bytes = copy_max_bytes_hw)

> > +
> > +
> > +What:  /sys/block//queue/copy_max_bytes_hw
> > +Date:  November 2022
> > +Contact:   linux-bl...@vger.kernel.org
> > +Description:
> > +   [RO] Devices that support offloading copy functionality may have
> > +   internal limits on the number of bytes that can be offloaded
> > +   in a single operation. The `copy_max_bytes_hw`
> > +   parameter is set by the device driver to the maximum number of
> > +   bytes that can be copied in a single operation. Copy
> > +   requests issued to the device must not exceed this limit.
> > +   A value of 0 means that the device does not
> > +   support copy offload.
> 
>   [RO] This is the maximum number of kilobytes supported in a
> single data copy offload operation. A value of 0 means that 
> the
>   device does not support copy offload.
> 

Nack, value is in bytes. Same as discard.

> > +
> > +
> >  What:  /sys/block//queue/crypto/
> >  Date:  February 2022
> >  Contact:   linux-bl...@vger.kernel.org
> > diff --git a/block/blk-settings.c b/block/blk-settings.c
> > index 896b4654ab00..350f3584f691 100644
> > --- a/block/blk-settings.c
> > +++ b/block/blk-settings.c
> > @@ -59,6 +59,8 @@ void blk_set_default_limits(struct queue_limits *lim)
> > lim->zoned = BLK_ZONED_NONE;
> > lim->zone_write_granularity = 0;
> > lim->dma_alignment = 511;
> > +   lim->max_copy_sectors_hw = 0;
> > +   lim->max_copy_sectors = 0;
> >  }
> >  
> >  /**
> > @@ -82,6 +84,8 @@ void blk_set_stacking_limits(struct queue_limits *lim)
> > lim->max_dev_sectors = UINT_MAX;
> > lim->max_write_zeroes_sectors = UINT_MAX;
> > lim->max_zone_append_sectors = UINT_MAX;
> > +   lim->max_copy_sectors_hw = ULONG_MAX;
> > +   lim->max_copy_sectors = ULONG_MAX;
> >  }
> >  EXPORT_SYMBOL(blk_set_stacking_limits);
> >  
> > @@ -183,6 +187,22 @@ void blk_queue_max_discard_sectors(struct 
> > request_queue *q,
> >  }
> >  

[dm-devel] [PATCH v8 1/9] block: Introduce queue limits for copy-offload support

2023-03-30 Thread Anuj Gupta
From: Nitesh Shetty 

Add device limits as sysfs entries,
- copy_offload (RW)
- copy_max_bytes (RW)
- copy_max_bytes_hw (RO)

Above limits help to split the copy payload in block layer.
copy_offload: used for setting copy offload(1) or emulation(0).
copy_max_bytes: maximum total length of copy in single payload.
copy_max_bytes_hw: Reflects the device supported maximum limit.

Reviewed-by: Hannes Reinecke 
Signed-off-by: Nitesh Shetty 
Signed-off-by: Kanchan Joshi 
Signed-off-by: Anuj Gupta 
---
 Documentation/ABI/stable/sysfs-block | 36 
 block/blk-settings.c | 24 +++
 block/blk-sysfs.c| 64 
 include/linux/blkdev.h   | 12 ++
 include/uapi/linux/fs.h  |  3 ++
 5 files changed, 139 insertions(+)

diff --git a/Documentation/ABI/stable/sysfs-block 
b/Documentation/ABI/stable/sysfs-block
index c57e5b7cb532..f5c56ad91ad6 100644
--- a/Documentation/ABI/stable/sysfs-block
+++ b/Documentation/ABI/stable/sysfs-block
@@ -155,6 +155,42 @@ Description:
last zone of the device which may be smaller.
 
 
+What:  /sys/block//queue/copy_offload
+Date:  November 2022
+Contact:   linux-bl...@vger.kernel.org
+Description:
+   [RW] When read, this file shows whether offloading copy to
+   device is enabled (1) or disabled (0). Writing '0' to this
+   file will disable offloading copies for this device.
+   Writing any '1' value will enable this feature. If device
+   does not support offloading, then writing 1, will result in
+   error.
+
+
+What:  /sys/block//queue/copy_max_bytes
+Date:  November 2022
+Contact:   linux-bl...@vger.kernel.org
+Description:
+   [RW] While 'copy_max_bytes_hw' is the hardware limit for the
+   device, 'copy_max_bytes' setting is the software limit.
+   Setting this value lower will make Linux issue smaller size
+   copies from block layer.
+
+
+What:  /sys/block//queue/copy_max_bytes_hw
+Date:  November 2022
+Contact:   linux-bl...@vger.kernel.org
+Description:
+   [RO] Devices that support offloading copy functionality may have
+   internal limits on the number of bytes that can be offloaded
+   in a single operation. The `copy_max_bytes_hw`
+   parameter is set by the device driver to the maximum number of
+   bytes that can be copied in a single operation. Copy
+   requests issued to the device must not exceed this limit.
+   A value of 0 means that the device does not
+   support copy offload.
+
+
 What:  /sys/block//queue/crypto/
 Date:  February 2022
 Contact:   linux-bl...@vger.kernel.org
diff --git a/block/blk-settings.c b/block/blk-settings.c
index 896b4654ab00..350f3584f691 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -59,6 +59,8 @@ void blk_set_default_limits(struct queue_limits *lim)
lim->zoned = BLK_ZONED_NONE;
lim->zone_write_granularity = 0;
lim->dma_alignment = 511;
+   lim->max_copy_sectors_hw = 0;
+   lim->max_copy_sectors = 0;
 }
 
 /**
@@ -82,6 +84,8 @@ void blk_set_stacking_limits(struct queue_limits *lim)
lim->max_dev_sectors = UINT_MAX;
lim->max_write_zeroes_sectors = UINT_MAX;
lim->max_zone_append_sectors = UINT_MAX;
+   lim->max_copy_sectors_hw = ULONG_MAX;
+   lim->max_copy_sectors = ULONG_MAX;
 }
 EXPORT_SYMBOL(blk_set_stacking_limits);
 
@@ -183,6 +187,22 @@ void blk_queue_max_discard_sectors(struct request_queue *q,
 }
 EXPORT_SYMBOL(blk_queue_max_discard_sectors);
 
+/**
+ * blk_queue_max_copy_sectors_hw - set max sectors for a single copy payload
+ * @q:  the request queue for the device
+ * @max_copy_sectors: maximum number of sectors to copy
+ **/
+void blk_queue_max_copy_sectors_hw(struct request_queue *q,
+   unsigned int max_copy_sectors)
+{
+   if (max_copy_sectors >= MAX_COPY_TOTAL_LENGTH)
+   max_copy_sectors = MAX_COPY_TOTAL_LENGTH;
+
+   q->limits.max_copy_sectors_hw = max_copy_sectors;
+   q->limits.max_copy_sectors = max_copy_sectors;
+}
+EXPORT_SYMBOL_GPL(blk_queue_max_copy_sectors_hw);
+
 /**
  * blk_queue_max_secure_erase_sectors - set max sectors for a secure erase
  * @q:  the request queue for the device
@@ -578,6 +598,10 @@ int blk_stack_limits(struct queue_limits *t, struct 
queue_limits *b,
t->max_segment_size = min_not_zero(t->max_segment_size,
   b->max_segment_size);
 
+   t->max_copy_sectors = min(t->max_copy_sectors, b->max_copy_sectors);
+   t->max_copy_sectors_hw = min(t->max_copy_sectors_hw,
+   b->max_copy_sectors_hw);
+
t->misaligned |= b->misaligned;
 
alignment 

Re: [dm-devel] [PATCH v8 1/9] block: Introduce queue limits for copy-offload support

2023-03-29 Thread Damien Le Moal
On 3/29/23 19:41, Nitesh Shetty wrote:
>>> +What:  /sys/block//queue/copy_max_bytes
>>> +Date:  November 2022
>>> +Contact:   linux-bl...@vger.kernel.org
>>> +Description:
>>> +   [RW] While 'copy_max_bytes_hw' is the hardware limit for the
>>> +   device, 'copy_max_bytes' setting is the software limit.
>>> +   Setting this value lower will make Linux issue smaller size
>>> +   copies from block layer.
>>
>>  This is the maximum number of bytes that the block
>> layer will allow for a copy request. Must be smaller than
>> or equal to the maximum size allowed by the hardware 
>> indicated
> 
> Looks good.  Will update in next version. We took reference from discard. 
> 
>>  by copy_max_bytes_hw. Write 0 to use the default kernel
>>  settings.
>>
> 
> Nack, writing 0 will not set it to default value. (default value is
> copy_max_bytes = copy_max_bytes_hw)

It is trivial to make it work that way, which would match how max_sectors_kb
works. Write 0 to return copy_max_bytes being equal to the default
copy_max_bytes_hw.

The other possibility that is also interesting is "write 0 to disable copy
offload and use emulation". This one may actually be more useful.

> 
>>> +
>>> +
>>> +What:  /sys/block//queue/copy_max_bytes_hw
>>> +Date:  November 2022
>>> +Contact:   linux-bl...@vger.kernel.org
>>> +Description:
>>> +   [RO] Devices that support offloading copy functionality may have
>>> +   internal limits on the number of bytes that can be offloaded
>>> +   in a single operation. The `copy_max_bytes_hw`
>>> +   parameter is set by the device driver to the maximum number of
>>> +   bytes that can be copied in a single operation. Copy
>>> +   requests issued to the device must not exceed this limit.
>>> +   A value of 0 means that the device does not
>>> +   support copy offload.
>>
>>  [RO] This is the maximum number of kilobytes supported in a
>> single data copy offload operation. A value of 0 means that 
>> the
>>  device does not support copy offload.
>>
> 
> Nack, value is in bytes. Same as discard.

Typo. I meant Bytes. Your text is too long an too convoluted, so unclear.

-- 
Damien Le Moal
Western Digital Research

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel



Re: [dm-devel] [PATCH v8 1/9] block: Introduce queue limits for copy-offload support

2023-03-29 Thread Damien Le Moal
On 3/27/23 17:40, Anuj Gupta wrote:
> From: Nitesh Shetty 
> 
> Add device limits as sysfs entries,
> - copy_offload (RW)
> - copy_max_bytes (RW)
> - copy_max_bytes_hw (RO)
> 
> Above limits help to split the copy payload in block layer.
> copy_offload: used for setting copy offload(1) or emulation(0).
> copy_max_bytes: maximum total length of copy in single payload.
> copy_max_bytes_hw: Reflects the device supported maximum limit.
> 
> Reviewed-by: Hannes Reinecke 
> Signed-off-by: Nitesh Shetty 
> Signed-off-by: Kanchan Joshi 
> Signed-off-by: Anuj Gupta 
> ---
>  Documentation/ABI/stable/sysfs-block | 36 
>  block/blk-settings.c | 24 +++
>  block/blk-sysfs.c| 64 
>  include/linux/blkdev.h   | 12 ++
>  include/uapi/linux/fs.h  |  3 ++
>  5 files changed, 139 insertions(+)
> 
> diff --git a/Documentation/ABI/stable/sysfs-block 
> b/Documentation/ABI/stable/sysfs-block
> index c57e5b7cb532..f5c56ad91ad6 100644
> --- a/Documentation/ABI/stable/sysfs-block
> +++ b/Documentation/ABI/stable/sysfs-block
> @@ -155,6 +155,42 @@ Description:
>   last zone of the device which may be smaller.
>  
>  
> +What:/sys/block//queue/copy_offload
> +Date:November 2022
> +Contact: linux-bl...@vger.kernel.org
> +Description:
> + [RW] When read, this file shows whether offloading copy to
> + device is enabled (1) or disabled (0). Writing '0' to this

...to a device...

> + file will disable offloading copies for this device.
> + Writing any '1' value will enable this feature. If device

If the device does...

> + does not support offloading, then writing 1, will result in
> + error.
> +
> +
> +What:/sys/block//queue/copy_max_bytes
> +Date:November 2022
> +Contact: linux-bl...@vger.kernel.org
> +Description:
> + [RW] While 'copy_max_bytes_hw' is the hardware limit for the
> + device, 'copy_max_bytes' setting is the software limit.
> + Setting this value lower will make Linux issue smaller size
> + copies from block layer.

This is the maximum number of bytes that the block
layer will allow for a copy request. Must be smaller than
or equal to the maximum size allowed by the hardware indicated
by copy_max_bytes_hw. Write 0 to use the default kernel
settings.

> +
> +
> +What:/sys/block//queue/copy_max_bytes_hw
> +Date:November 2022
> +Contact: linux-bl...@vger.kernel.org
> +Description:
> + [RO] Devices that support offloading copy functionality may have
> + internal limits on the number of bytes that can be offloaded
> + in a single operation. The `copy_max_bytes_hw`
> + parameter is set by the device driver to the maximum number of
> + bytes that can be copied in a single operation. Copy
> + requests issued to the device must not exceed this limit.
> + A value of 0 means that the device does not
> + support copy offload.

[RO] This is the maximum number of kilobytes supported in a
single data copy offload operation. A value of 0 means that the
device does not support copy offload.

> +
> +
>  What:/sys/block//queue/crypto/
>  Date:February 2022
>  Contact: linux-bl...@vger.kernel.org
> diff --git a/block/blk-settings.c b/block/blk-settings.c
> index 896b4654ab00..350f3584f691 100644
> --- a/block/blk-settings.c
> +++ b/block/blk-settings.c
> @@ -59,6 +59,8 @@ void blk_set_default_limits(struct queue_limits *lim)
>   lim->zoned = BLK_ZONED_NONE;
>   lim->zone_write_granularity = 0;
>   lim->dma_alignment = 511;
> + lim->max_copy_sectors_hw = 0;
> + lim->max_copy_sectors = 0;
>  }
>  
>  /**
> @@ -82,6 +84,8 @@ void blk_set_stacking_limits(struct queue_limits *lim)
>   lim->max_dev_sectors = UINT_MAX;
>   lim->max_write_zeroes_sectors = UINT_MAX;
>   lim->max_zone_append_sectors = UINT_MAX;
> + lim->max_copy_sectors_hw = ULONG_MAX;
> + lim->max_copy_sectors = ULONG_MAX;
>  }
>  EXPORT_SYMBOL(blk_set_stacking_limits);
>  
> @@ -183,6 +187,22 @@ void blk_queue_max_discard_sectors(struct request_queue 
> *q,
>  }
>  EXPORT_SYMBOL(blk_queue_max_discard_sectors);
>  
> +/**
> + * blk_queue_max_copy_sectors_hw - set max sectors for a single copy payload
> + * @q:  the request queue for the device
> + * @max_copy_sectors: maximum number of sectors to copy
> + **/
> +void blk_queue_max_copy_sectors_hw(struct request_queue *q,
> + unsigned int max_copy_sectors)
> +{
> + if (max_copy_sectors >= MAX_COPY_TOTAL_LENGTH)

Confusing name as LENGTH may be