Skip to content

Commit

Permalink
iommufd/iova_bitmap: Switch iova_bitmap::bitmap to an u8 array
Browse files Browse the repository at this point in the history
[ Upstream commit d18411e ]

iova_bitmap_mapped_length() don't deal correctly with the small bitmaps
(< 2M bitmaps) when the starting address isn't u64 aligned, leading to
skipping a tiny part of the IOVA range. This is materialized as not
marking data dirty that should otherwise have been.

Fix that by using a u8 * in the internal state of IOVA bitmap. Most of the
data structures use the type of the bitmap to adjust its indexes, thus
changing the type of the bitmap decreases the granularity of the bitmap
indexes.

Fixes: b058ea3 ("vfio/iova_bitmap: refactor iova_bitmap_set() to better handle page boundaries")
Link: https://lore.kernel.org/r/20240202133415.23819-3-joao.m.martins@oracle.com
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Tested-by: Avihai Horon <avihaih@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
jpemartins authored and gregkh committed Mar 1, 2024
1 parent 6347450 commit 929766d
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/vfio/iova_bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ struct iova_bitmap {
struct iova_bitmap_map mapped;

/* userspace address of the bitmap */
u64 __user *bitmap;
u8 __user *bitmap;

/* u64 index that @mapped points to */
unsigned long mapped_base_index;
Expand Down Expand Up @@ -162,7 +162,7 @@ static int iova_bitmap_get(struct iova_bitmap *bitmap)
{
struct iova_bitmap_map *mapped = &bitmap->mapped;
unsigned long npages;
u64 __user *addr;
u8 __user *addr;
long ret;

/*
Expand Down Expand Up @@ -247,7 +247,7 @@ struct iova_bitmap *iova_bitmap_alloc(unsigned long iova, size_t length,

mapped = &bitmap->mapped;
mapped->pgshift = __ffs(page_size);
bitmap->bitmap = data;
bitmap->bitmap = (u8 __user *)data;
bitmap->mapped_total_index =
iova_bitmap_offset_to_index(bitmap, length - 1) + 1;
bitmap->iova = iova;
Expand Down Expand Up @@ -302,7 +302,7 @@ static unsigned long iova_bitmap_mapped_remaining(struct iova_bitmap *bitmap)

remaining = bitmap->mapped_total_index - bitmap->mapped_base_index;
remaining = min_t(unsigned long, remaining,
bytes / sizeof(*bitmap->bitmap));
DIV_ROUND_UP(bytes, sizeof(*bitmap->bitmap)));

return remaining;
}
Expand Down

0 comments on commit 929766d

Please sign in to comment.