[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f0f9317f-839e-2be2-dec6-c5b94d7022b7@nvidia.com>
Date: Thu, 17 Feb 2022 10:16:21 +0000
From: Chaitanya Kulkarni <chaitanyak@...dia.com>
To: Luis Chamberlain <mcgrof@...nel.org>, "hch@....de" <hch@....de>
CC: "javier@...igon.com" <javier@...igon.com>,
"linux-block@...r.kernel.org" <linux-block@...r.kernel.org>,
"linux-scsi@...r.kernel.org" <linux-scsi@...r.kernel.org>,
"dm-devel@...hat.com" <dm-devel@...hat.com>,
"linux-nvme@...ts.infradead.org" <linux-nvme@...ts.infradead.org>,
"linux-fsdevel@...r.kernel.org" <linux-fsdevel@...r.kernel.org>,
"axboe@...nel.dk" <axboe@...nel.dk>,
"msnitzer@...hat.com" <msnitzer@...hat.com>,
"bvanassche@....org" <bvanassche@....org>,
"martin.petersen@...cle.com" <martin.petersen@...cle.com>,
"hare@...e.de" <hare@...e.de>,
"kbusch@...nel.org" <kbusch@...nel.org>,
"Frederick.Knight@...app.com" <Frederick.Knight@...app.com>,
"osandov@...com" <osandov@...com>,
"lsf-pc@...ts.linux-foundation.org"
<lsf-pc@...ts.linux-foundation.org>,
"djwong@...nel.org" <djwong@...nel.org>,
"josef@...icpanda.com" <josef@...icpanda.com>,
"clm@...com" <clm@...com>, "dsterba@...e.com" <dsterba@...e.com>,
"tytso@....edu" <tytso@....edu>, "jack@...e.com" <jack@...e.com>,
"joshi.k@...sung.com" <joshi.k@...sung.com>,
"arnav.dawn@...sung.com" <arnav.dawn@...sung.com>,
"nitheshshetty@...il.com" <nitheshshetty@...il.com>,
SelvaKumar S <selvakuma.s1@...sung.com>,
Alasdair Kergon <agk@...hat.com>,
Mike Snitzer <snitzer@...hat.com>,
Sagi Grimberg <sagi@...mberg.me>,
James Smart <james.smart@...adcom.com>,
Chaitanya Kulkarni <chaitanyak@...dia.com>,
Alexander Viro <viro@...iv.linux.org.uk>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
Nitesh Shetty <nj.shetty@...sung.com>
Subject: Re: [PATCH v3 02/10] block: Introduce queue limits for copy-offload
support
On 2/17/22 1:07 AM, Luis Chamberlain wrote:
> The subject says limits for copy-offload...
>
> On Mon, Feb 14, 2022 at 01:29:52PM +0530, Nitesh Shetty wrote:
>> Add device limits as sysfs entries,
>> - copy_offload (RW)
>> - copy_max_bytes (RW)
>> - copy_max_hw_bytes (RO)
>> - copy_max_range_bytes (RW)
>> - copy_max_range_hw_bytes (RO)
>> - copy_max_nr_ranges (RW)
>> - copy_max_nr_ranges_hw (RO)
>
> Some of these seem like generic... and also I see a few more max_hw ones
> not listed above...
>
>> --- a/block/blk-settings.c
>> +++ b/block/blk-settings.c
>> +/**
>> + * blk_queue_max_copy_sectors - 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(struct request_queue *q,
>> + unsigned int max_copy_sectors)
>> +{
>> + q->limits.max_hw_copy_sectors = max_copy_sectors;
>> + q->limits.max_copy_sectors = max_copy_sectors;
>> +}
>> +EXPORT_SYMBOL(blk_queue_max_copy_sectors);
>
> Please use EXPORT_SYMBOL_GPL() for all new things.
>
> Why is this setting both? The documentation does't seem to say.
> What's the point?
>
>> +
>> +/**
>> + * blk_queue_max_copy_range_sectors - set max sectors for a single range, in a copy payload
>> + * @q: the request queue for the device
>> + * @max_copy_range_sectors: maximum number of sectors to copy in a single range
>> + **/
>> +void blk_queue_max_copy_range_sectors(struct request_queue *q,
>> + unsigned int max_copy_range_sectors)
>> +{
>> + q->limits.max_hw_copy_range_sectors = max_copy_range_sectors;
>> + q->limits.max_copy_range_sectors = max_copy_range_sectors;
>> +}
>> +EXPORT_SYMBOL(blk_queue_max_copy_range_sectors);
>
> Same here.
>
>> +/**
>> + * blk_queue_max_copy_nr_ranges - set max number of ranges, in a copy payload
>> + * @q: the request queue for the device
>> + * @max_copy_nr_ranges: maximum number of ranges
>> + **/
>> +void blk_queue_max_copy_nr_ranges(struct request_queue *q,
>> + unsigned int max_copy_nr_ranges)
>> +{
>> + q->limits.max_hw_copy_nr_ranges = max_copy_nr_ranges;
>> + q->limits.max_copy_nr_ranges = max_copy_nr_ranges;
>> +}
>> +EXPORT_SYMBOL(blk_queue_max_copy_nr_ranges);
>
> Same.
>
>> +
>> /**
>> * blk_queue_max_write_same_sectors - set max sectors for a single write same
>> * @q: the request queue for the device
>> @@ -541,6 +592,14 @@ 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_hw_copy_sectors = min(t->max_hw_copy_sectors, b->max_hw_copy_sectors);
>> + t->max_copy_range_sectors = min(t->max_copy_range_sectors, b->max_copy_range_sectors);
>> + t->max_hw_copy_range_sectors = min(t->max_hw_copy_range_sectors,
>> + b->max_hw_copy_range_sectors);
>> + t->max_copy_nr_ranges = min(t->max_copy_nr_ranges, b->max_copy_nr_ranges);
>> + t->max_hw_copy_nr_ranges = min(t->max_hw_copy_nr_ranges, b->max_hw_copy_nr_ranges);
>> +
>> t->misaligned |= b->misaligned;
>>
>> alignment = queue_limit_alignment_offset(b, start);
>> diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
>> index 9f32882ceb2f..9ddd07f142d9 100644
>> --- a/block/blk-sysfs.c
>> +++ b/block/blk-sysfs.c
>> @@ -212,6 +212,129 @@ static ssize_t queue_discard_zeroes_data_show(struct request_queue *q, char *pag
>> return queue_var_show(0, page);
>> }
>>
>> +static ssize_t queue_copy_offload_show(struct request_queue *q, char *page)
>> +{
>> + return queue_var_show(blk_queue_copy(q), page);
>> +}
>> +
>> +static ssize_t queue_copy_offload_store(struct request_queue *q,
>> + const char *page, size_t count)
>> +{
>> + unsigned long copy_offload;
>> + ssize_t ret = queue_var_store(©_offload, page, count);
>> +
>> + if (ret < 0)
>> + return ret;
>> +
>> + if (copy_offload && !q->limits.max_hw_copy_sectors)
>> + return -EINVAL;
>
>
> If the kernel schedules, copy_offload may still be true and
> max_hw_copy_sectors may be set to 0. Is that an issue?
>
>> +
>> + if (copy_offload)
>> + blk_queue_flag_set(QUEUE_FLAG_COPY, q);
>> + else
>> + blk_queue_flag_clear(QUEUE_FLAG_COPY, q);
>
> The flag may be set but the queue flag could be set. Is that an issue?
>
>> @@ -597,6 +720,14 @@ QUEUE_RO_ENTRY(queue_nr_zones, "nr_zones");
>> QUEUE_RO_ENTRY(queue_max_open_zones, "max_open_zones");
>> QUEUE_RO_ENTRY(queue_max_active_zones, "max_active_zones");
>>
>> +QUEUE_RW_ENTRY(queue_copy_offload, "copy_offload");
>> +QUEUE_RO_ENTRY(queue_copy_max_hw, "copy_max_hw_bytes");
>> +QUEUE_RW_ENTRY(queue_copy_max, "copy_max_bytes");
>> +QUEUE_RO_ENTRY(queue_copy_range_max_hw, "copy_max_range_hw_bytes");
>> +QUEUE_RW_ENTRY(queue_copy_range_max, "copy_max_range_bytes");
>> +QUEUE_RO_ENTRY(queue_copy_nr_ranges_max_hw, "copy_max_nr_ranges_hw");
>> +QUEUE_RW_ENTRY(queue_copy_nr_ranges_max, "copy_max_nr_ranges");
>
> Seems like you need to update Documentation/ABI/stable/sysfs-block.
>
>> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
>> index efed3820cbf7..792e6d556589 100644
>> --- a/include/linux/blkdev.h
>> +++ b/include/linux/blkdev.h
>> @@ -254,6 +254,13 @@ struct queue_limits {
>> unsigned int discard_alignment;
>> unsigned int zone_write_granularity;
>>
>> + unsigned long max_hw_copy_sectors;
>> + unsigned long max_copy_sectors;
>> + unsigned int max_hw_copy_range_sectors;
>> + unsigned int max_copy_range_sectors;
>> + unsigned short max_hw_copy_nr_ranges;
>> + unsigned short max_copy_nr_ranges;
>
> Before limits start growing more.. I wonder if we should just
> stuff hw offload stuff to its own struct within queue_limits.
>
> Christoph?
>
Potentially use a pointer to structure and maybe make it configurable,
although I'm not sure about the later part, I'll let Christoph decide
that.
> Luis
>
-ck
Powered by blists - more mailing lists