Patch "vfio/type1: Unpin zero pages" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    vfio/type1: Unpin zero pages

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     vfio-type1-unpin-zero-pages.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3911a750c69d70d18478e8c952c73463d7fbac64
Author: Alex Williamson <alex.williamson@xxxxxxxxxx>
Date:   Mon Aug 29 21:05:40 2022 -0600

    vfio/type1: Unpin zero pages
    
    [ Upstream commit 873aefb376bbc0ed1dd2381ea1d6ec88106fdbd4 ]
    
    There's currently a reference count leak on the zero page.  We increment
    the reference via pin_user_pages_remote(), but the page is later handled
    as an invalid/reserved page, therefore it's not accounted against the
    user and not unpinned by our put_pfn().
    
    Introducing special zero page handling in put_pfn() would resolve the
    leak, but without accounting of the zero page, a single user could
    still create enough mappings to generate a reference count overflow.
    
    The zero page is always resident, so for our purposes there's no reason
    to keep it pinned.  Therefore, add a loop to walk pages returned from
    pin_user_pages_remote() and unpin any zero pages.
    
    Cc: stable@xxxxxxxxxxxxxxx
    Reported-by: Luboslav Pivarc <lpivarc@xxxxxxxxxx>
    Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/166182871735.3518559.8884121293045337358.stgit@omen
    Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 0c15cffd5ef1..cd5c8b49d763 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -514,6 +514,18 @@ static int vaddr_get_pfns(struct mm_struct *mm, unsigned long vaddr,
 	ret = pin_user_pages_remote(mm, vaddr, npages, flags | FOLL_LONGTERM,
 				    pages, NULL, NULL);
 	if (ret > 0) {
+		int i;
+
+		/*
+		 * The zero page is always resident, we don't need to pin it
+		 * and it falls into our invalid/reserved test so we don't
+		 * unpin in put_pfn().  Unpin all zero pages in the batch here.
+		 */
+		for (i = 0 ; i < ret; i++) {
+			if (unlikely(is_zero_pfn(page_to_pfn(pages[i]))))
+				unpin_user_page(pages[i]);
+		}
+
 		*pfn = page_to_pfn(pages[0]);
 		goto done;
 	}



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux