Commit 7d8d3579 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Jens Axboe

brd: Remove use of page->index

This debugging check will become more costly in the future when we shrink
struct page.  It has not proven to be useful, so simply remove it.

This lets us use __xa_insert instead of __xa_cmpxchg() as we no longer
need to know about the page that is currently stored in the XArray.
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20240315181212.2573753-1-willy@infradead.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 39cd87c4
...@@ -29,10 +29,7 @@ ...@@ -29,10 +29,7 @@
/* /*
* Each block ramdisk device has a xarray brd_pages of pages that stores * Each block ramdisk device has a xarray brd_pages of pages that stores
* the pages containing the block device's contents. A brd page's ->index is * the pages containing the block device's contents.
* its offset in PAGE_SIZE units. This is similar to, but in no way connected
* with, the kernel's pagecache or buffer cache (which sit above our block
* device).
*/ */
struct brd_device { struct brd_device {
int brd_number; int brd_number;
...@@ -51,15 +48,7 @@ struct brd_device { ...@@ -51,15 +48,7 @@ struct brd_device {
*/ */
static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector) static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector)
{ {
pgoff_t idx; return xa_load(&brd->brd_pages, sector >> PAGE_SECTORS_SHIFT);
struct page *page;
idx = sector >> PAGE_SECTORS_SHIFT; /* sector to page index */
page = xa_load(&brd->brd_pages, idx);
BUG_ON(page && page->index != idx);
return page;
} }
/* /*
...@@ -67,8 +56,8 @@ static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector) ...@@ -67,8 +56,8 @@ static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector)
*/ */
static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp) static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp)
{ {
pgoff_t idx; pgoff_t idx = sector >> PAGE_SECTORS_SHIFT;
struct page *page, *cur; struct page *page;
int ret = 0; int ret = 0;
page = brd_lookup_page(brd, sector); page = brd_lookup_page(brd, sector);
...@@ -80,23 +69,16 @@ static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp) ...@@ -80,23 +69,16 @@ static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp)
return -ENOMEM; return -ENOMEM;
xa_lock(&brd->brd_pages); xa_lock(&brd->brd_pages);
ret = __xa_insert(&brd->brd_pages, idx, page, gfp);
idx = sector >> PAGE_SECTORS_SHIFT; if (!ret)
page->index = idx;
cur = __xa_cmpxchg(&brd->brd_pages, idx, NULL, page, gfp);
if (unlikely(cur)) {
__free_page(page);
ret = xa_err(cur);
if (!ret && (cur->index != idx))
ret = -EIO;
} else {
brd->brd_nr_pages++; brd->brd_nr_pages++;
}
xa_unlock(&brd->brd_pages); xa_unlock(&brd->brd_pages);
if (ret < 0) {
__free_page(page);
if (ret == -EBUSY)
ret = 0;
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment