All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] iommu/io-pgtable-arm: Fix race handling in split_blk_unmap()
@ 2018-08-23 12:14 ` Robin Murphy
  0 siblings, 0 replies; 12+ messages in thread
From: Robin Murphy @ 2018-08-23 12:14 UTC (permalink / raw)
  To: will.deacon-5wv7dgnIgG8, joro-zLv9SwRftAIdnm+yROfE0A
  Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

In removing the pagetable-wide lock, we gained the possibility of the
vanishingly unlikely case where we have a race between two concurrent
unmappers splitting the same block entry. The logic to handle this is
fairly straightforward - whoever loses the race frees their partial
next-level table and instead dereferences the winner's newly-installed
entry in order to fall back to a regular unmap, which intentionally
echoes the pre-existing case of recursively splitting a 1GB block down
to 4KB pages by installing a full table of 2MB blocks first.

Unfortunately, the chump who implemented that logic failed to update the
condition check for that fallback, meaning that if said race occurs at
the last level (where the loser's unmap_idx is valid) then the unmap
won't actually happen. Fix that to properly account for both the race
and recursive cases.

Fixes: 2c3d273eabe8 ("iommu/io-pgtable-arm: Support lockless operation")
Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
---
 drivers/iommu/io-pgtable-arm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
index 010a254305dd..93b4833cef73 100644
--- a/drivers/iommu/io-pgtable-arm.c
+++ b/drivers/iommu/io-pgtable-arm.c
@@ -575,7 +575,7 @@ static size_t arm_lpae_split_blk_unmap(struct arm_lpae_io_pgtable *data,
 		tablep = iopte_deref(pte, data);
 	}
 
-	if (unmap_idx < 0)
+	if (unmap_idx < 0 || pte != blk_pte)
 		return __arm_lpae_unmap(data, iova, size, lvl, tablep);
 
 	io_pgtable_tlb_add_flush(&data->iop, iova, size, size, true);
-- 
2.17.1.dirty

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-09-25 13:03 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-23 12:14 [PATCH] iommu/io-pgtable-arm: Fix race handling in split_blk_unmap() Robin Murphy
2018-08-23 12:14 ` Robin Murphy
     [not found] ` <f6700817286f60597f2a93835bf658f3ef3585ef.1535026499.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2018-09-06 10:05   ` Will Deacon
2018-09-06 10:05     ` Will Deacon
     [not found]     ` <20180906100527.GF3592-5wv7dgnIgG8@public.gmane.org>
2018-09-06 11:14       ` Robin Murphy
2018-09-06 11:14         ` Robin Murphy
2018-09-25  9:01   ` Joerg Roedel
2018-09-25  9:01     ` Joerg Roedel
     [not found]     ` <20180925090138.h6tqvrvxy43ycp6g-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-09-25 10:48       ` Robin Murphy
2018-09-25 10:48         ` Robin Murphy
     [not found]         ` <e86cd69f-4355-5078-890a-338756e325ba-5wv7dgnIgG8@public.gmane.org>
2018-09-25 13:03           ` Joerg Roedel
2018-09-25 13:03             ` Joerg Roedel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.