Juergen Gross 3dfa0d
Patch-mainline: v5.5-rc1
Juergen Gross 3dfa0d
Git-commit: f9bd84a8a845d82f9b5a081a7ae68c98a11d2e84
Juergen Gross 3dfa0d
References: bsc#1065600
Juergen Gross 3dfa0d
From: SeongJae Park <sjpark@amazon.de>
Juergen Gross 3dfa0d
Date: Tue, 26 Nov 2019 16:36:05 +0100
Juergen Gross 3dfa0d
Subject: [PATCH] xen/blkback: Avoid unmapping unmapped grant pages
Juergen Gross 3dfa0d
MIME-Version: 1.0
Juergen Gross 3dfa0d
Content-Type: text/plain; charset=UTF-8
Juergen Gross 3dfa0d
Content-Transfer-Encoding: 8bit
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
For each I/O request, blkback first maps the foreign pages for the
Juergen Gross 3dfa0d
request to its local pages.  If an allocation of a local page for the
Juergen Gross 3dfa0d
mapping fails, it should unmap every mapping already made for the
Juergen Gross 3dfa0d
request.
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
However, blkback's handling mechanism for the allocation failure does
Juergen Gross 3dfa0d
not mark the remaining foreign pages as unmapped.  Therefore, the unmap
Juergen Gross 3dfa0d
function merely tries to unmap every valid grant page for the request,
Juergen Gross 3dfa0d
including the pages not mapped due to the allocation failure.  On a
Juergen Gross 3dfa0d
system that fails the allocation frequently, this problem leads to
Juergen Gross 3dfa0d
following kernel crash.
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
  [  372.012538] BUG: unable to handle kernel NULL pointer dereference at 0000000000000001
Juergen Gross 3dfa0d
  [  372.012546] IP: [<ffffffff814071ac>] gnttab_unmap_refs.part.7+0x1c/0x40
Juergen Gross 3dfa0d
  [  372.012557] PGD 16f3e9067 PUD 16426e067 PMD 0
Juergen Gross 3dfa0d
  [  372.012562] Oops: 0002 [#1] SMP
Juergen Gross 3dfa0d
  [  372.012566] Modules linked in: act_police sch_ingress cls_u32
Juergen Gross 3dfa0d
  ...
Juergen Gross 3dfa0d
  [  372.012746] Call Trace:
Juergen Gross 3dfa0d
  [  372.012752]  [<ffffffff81407204>] gnttab_unmap_refs+0x34/0x40
Juergen Gross 3dfa0d
  [  372.012759]  [<ffffffffa0335ae3>] xen_blkbk_unmap+0x83/0x150 [xen_blkback]
Juergen Gross 3dfa0d
  ...
Juergen Gross 3dfa0d
  [  372.012802]  [<ffffffffa0336c50>] dispatch_rw_block_io+0x970/0x980 [xen_blkback]
Juergen Gross 3dfa0d
  ...
Juergen Gross 3dfa0d
  Decompressing Linux... Parsing ELF... done.
Juergen Gross 3dfa0d
  Booting the kernel.
Juergen Gross 3dfa0d
  [    0.000000] Initializing cgroup subsys cpuset
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
This commit fixes this problem by marking the grant pages of the given
Juergen Gross 3dfa0d
request that didn't mapped due to the allocation failure as invalid.
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
Fixes: c6cc142dac52 ("xen-blkback: use balloon pages for all mappings")
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
Reviewed-by: David Woodhouse <dwmw@amazon.de>
Juergen Gross 3dfa0d
Reviewed-by: Maximilian Heyne <mheyne@amazon.de>
Juergen Gross 3dfa0d
Reviewed-by: Paul Durrant <pdurrant@amazon.co.uk>
Juergen Gross 3dfa0d
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Juergen Gross 3dfa0d
Signed-off-by: SeongJae Park <sjpark@amazon.de>
Juergen Gross 3dfa0d
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Juergen Gross 3dfa0d
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 3dfa0d
---
Juergen Gross 3dfa0d
 drivers/block/xen-blkback/blkback.c | 2 ++
Juergen Gross 3dfa0d
 1 file changed, 2 insertions(+)
Juergen Gross 3dfa0d
Juergen Gross 3dfa0d
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
Juergen Gross 3dfa0d
index fd1e19f1a49f..3666afa639d1 100644
Juergen Gross 3dfa0d
--- a/drivers/block/xen-blkback/blkback.c
Juergen Gross 3dfa0d
+++ b/drivers/block/xen-blkback/blkback.c
Juergen Gross 3dfa0d
@@ -936,6 +936,8 @@ static int xen_blkbk_map(struct xen_blkif_ring *ring,
Juergen Gross 3dfa0d
 out_of_memory:
Juergen Gross 3dfa0d
 	pr_alert("%s: out of memory\n", __func__);
Juergen Gross 3dfa0d
 	put_free_pages(ring, pages_to_gnt, segs_to_map);
Juergen Gross 3dfa0d
+	for (i = last_map; i < num; i++)
Juergen Gross 3dfa0d
+		pages[i]->handle = BLKBACK_INVALID_HANDLE;
Juergen Gross 3dfa0d
 	return -ENOMEM;
Juergen Gross 3dfa0d
 }
Juergen Gross 3dfa0d
 
Juergen Gross 3dfa0d
-- 
Juergen Gross 3dfa0d
2.16.4
Juergen Gross 3dfa0d