vfio/type1: batch vfio_find_vpfn() in function vfio_unpin_pages_remote()

The function vpfn_pages() can help us determine the number of vpfn
nodes on the vpfn rb tree within a specified range. This allows us
to avoid searching for each vpfn individually in the function
vfio_unpin_pages_remote(). This patch batches the vfio_find_vpfn()
calls in function vfio_unpin_pages_remote().

Signed-off-by: Li Zhe <lizhe.67@bytedance.com>
Link: https://lore.kernel.org/r/20250814064714.56485-4-lizhe.67@bytedance.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
Li Zhe 2025-08-14 14:47:12 +08:00 committed by Alex Williamson
parent f6c84a52cc
commit d10872050f
1 changed files with 3 additions and 7 deletions

View File

@ -802,16 +802,12 @@ static long vfio_unpin_pages_remote(struct vfio_dma *dma, dma_addr_t iova,
unsigned long pfn, unsigned long npage, unsigned long pfn, unsigned long npage,
bool do_accounting) bool do_accounting)
{ {
long unlocked = 0, locked = 0; long unlocked = 0, locked = vpfn_pages(dma, iova, npage);
long i; long i;
for (i = 0; i < npage; i++, iova += PAGE_SIZE) { for (i = 0; i < npage; i++)
if (put_pfn(pfn++, dma->prot)) { if (put_pfn(pfn++, dma->prot))
unlocked++; unlocked++;
if (vfio_find_vpfn(dma, iova))
locked++;
}
}
if (do_accounting) if (do_accounting)
vfio_lock_acct(dma, locked - unlocked, true); vfio_lock_acct(dma, locked - unlocked, true);