brd: Remove use of page->index
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 15 Mar 2024 18:12:09 +0000 (18:12 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 1 Apr 2024 17:53:36 +0000 (11:53 -0600)
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>
drivers/block/brd.c

index e322cef6596bfaa2f1cbf6de1f275a804670d49b..b900fe9e003080163b5247bf1888bc544c96765f 100644 (file)
 
 /*
  * 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;
 }