Message ID | alpine.LRH.2.02.2209201358120.26535@file01.intranet.prod.int.rdu2.redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | brd: implement discard | expand |
Hi, Mikulas The lack of discard in ramdisk can cause some issues related to dm. see: https://lore.kernel.org/all/20220228141354.1091687-1-luomeng12@huawei.com/ I noticed that your patch series has already supported discard for brd. But this patch series has not been applied to mainline at present, may I ask if you still plan to continue working on it?
On Mon, 10 Jul 2023, Li Nan wrote: > Hi, Mikulas > > The lack of discard in ramdisk can cause some issues related to dm. see: > https://lore.kernel.org/all/20220228141354.1091687-1-luomeng12@huawei.com/ > > I noticed that your patch series has already supported discard for brd. But > this patch series has not been applied to mainline at present, may I ask if > you still plan to continue working on it? > > -- > Thanks, > Nan Hi I got no response from ramdisk maintainer Jens Axboe. We should ask him, whether he doesn't want discard on ramdisk at all or whether he wants it. Mikulas -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
On 7/10/23 9:24?AM, Mikulas Patocka wrote: > > > On Mon, 10 Jul 2023, Li Nan wrote: > >> Hi, Mikulas >> >> The lack of discard in ramdisk can cause some issues related to dm. see: >> https://lore.kernel.org/all/20220228141354.1091687-1-luomeng12@huawei.com/ >> >> I noticed that your patch series has already supported discard for brd. But >> this patch series has not been applied to mainline at present, may I ask if >> you still plan to continue working on it? >> >> -- >> Thanks, >> Nan > > Hi > > I got no response from ramdisk maintainer Jens Axboe. We should ask him, > whether he doesn't want discard on ramdisk at all or whether he wants it. When a series is posted and reviewers comment on required changes, I always wait for a respin of that series with those addressed. That didn't happen, so this didn't get applied.
On Mon, Jul 10, 2023 at 01:05:00PM -0600, Jens Axboe wrote: > When a series is posted and reviewers comment on required changes, I > always wait for a respin of that series with those addressed. That > didn't happen, so this didn't get applied. ... independent of that any software that assumes all block devices can discard data is simply broken. -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
On Mon, 10 Jul 2023, Jens Axboe wrote: > When a series is posted and reviewers comment on required changes, I > always wait for a respin of that series with those addressed. That > didn't happen, so this didn't get applied. > > -- > Jens Axboe Hi I updated the brd discard patches so that they apply to the kernel 6.5-rc1. I'm submitting them for review. Mikulas -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
Index: linux-2.6/drivers/block/brd.c =================================================================== --- linux-2.6.orig/drivers/block/brd.c +++ linux-2.6/drivers/block/brd.c @@ -48,6 +48,8 @@ struct brd_device { u64 brd_nr_pages; }; +static bool discard; + /* * Look up and return a brd's page for a given sector. * This must be called with the rcu lock held. @@ -107,6 +109,25 @@ static bool brd_insert_page(struct brd_d return true; } +static void brd_free_page_rcu(struct rcu_head *head) +{ + struct page *page = container_of(head, struct page, rcu_head); + __free_page(page); +} + +static void brd_free_page(struct brd_device *brd, sector_t sector) +{ + struct page *page; + pgoff_t idx; + + spin_lock(&brd->brd_lock); + idx = sector >> PAGE_SECTORS_SHIFT; + page = radix_tree_delete(&brd->brd_pages, idx); + spin_unlock(&brd->brd_lock); + if (page) + call_rcu(&page->rcu_head, brd_free_page_rcu); +} + /* * Free all backing store pages and radix tree. This must only be called when * there are no other users of the device. @@ -277,13 +298,44 @@ out: return err; } +void brd_do_discard(struct brd_device *brd, struct bio *bio) +{ + sector_t sector, len, front_pad; + + if (unlikely(!discard)) { + bio->bi_status = BLK_STS_NOTSUPP; + return; + } + + sector = bio->bi_iter.bi_sector; + len = bio_sectors(bio); + front_pad = -sector & (PAGE_SECTORS - 1); + sector += front_pad; + if (unlikely(len <= front_pad)) + return; + len -= front_pad; + len = round_down(len, PAGE_SECTORS); + while (len) { + brd_free_page(brd, sector); + sector += PAGE_SECTORS; + len -= PAGE_SECTORS; + cond_resched(); + } +} + static void brd_submit_bio(struct bio *bio) { struct brd_device *brd = bio->bi_bdev->bd_disk->private_data; - sector_t sector = bio->bi_iter.bi_sector; + sector_t sector; struct bio_vec bvec; struct bvec_iter iter; + if (bio_op(bio) == REQ_OP_DISCARD) { + brd_do_discard(brd, bio); + goto endio; + } + + sector = bio->bi_iter.bi_sector; bio_for_each_segment(bvec, bio, iter) { unsigned int len = bvec.bv_len; int err; @@ -301,6 +353,7 @@ static void brd_submit_bio(struct bio *b sector += len >> SECTOR_SHIFT; } +endio: bio_endio(bio); } @@ -338,6 +391,10 @@ static int max_part = 1; module_param(max_part, int, 0444); MODULE_PARM_DESC(max_part, "Num Minors to reserve between devices"); +static bool discard = false; +module_param(discard, bool, 0444); +MODULE_PARM_DESC(discard, "Support discard"); + MODULE_LICENSE("GPL"); MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); MODULE_ALIAS("rd"); @@ -404,6 +461,11 @@ static int brd_alloc(int i) */ blk_queue_physical_block_size(disk->queue, PAGE_SIZE); + if (discard) { + disk->queue->limits.discard_granularity = PAGE_SIZE; + blk_queue_max_discard_sectors(disk->queue, UINT_MAX); + } + /* Tell the block layer that this is not a rotational device */ blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue); blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, disk->queue);
This patch implements discard in the brd driver. We use RCU to free the page, so that if there are any concurrent readers or writes, they won't touch the page after it is freed. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> --- drivers/block/brd.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel