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: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Keith Busch <kbusch@kernel.org> Link: https://lore.kernel.org/r/20240315181212.2573753-1-willy@infradead.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
39cd87c4eb
commit
7d8d35791b
@ -29,10 +29,7 @@
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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).
|
||||
* the pages containing the block device's contents.
|
||||
*/
|
||||
struct brd_device {
|
||||
int brd_number;
|
||||
@ -51,15 +48,7 @@ struct brd_device {
|
||||
*/
|
||||
static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector)
|
||||
{
|
||||
pgoff_t idx;
|
||||
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;
|
||||
return xa_load(&brd->brd_pages, sector >> PAGE_SECTORS_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -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)
|
||||
{
|
||||
pgoff_t idx;
|
||||
struct page *page, *cur;
|
||||
pgoff_t idx = sector >> PAGE_SECTORS_SHIFT;
|
||||
struct page *page;
|
||||
int ret = 0;
|
||||
|
||||
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)
|
||||
return -ENOMEM;
|
||||
|
||||
xa_lock(&brd->brd_pages);
|
||||
|
||||
idx = sector >> PAGE_SECTORS_SHIFT;
|
||||
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 {
|
||||
ret = __xa_insert(&brd->brd_pages, idx, page, gfp);
|
||||
if (!ret)
|
||||
brd->brd_nr_pages++;
|
||||
}
|
||||
|
||||
xa_unlock(&brd->brd_pages);
|
||||
|
||||
if (ret < 0) {
|
||||
__free_page(page);
|
||||
if (ret == -EBUSY)
|
||||
ret = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user