mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
vfio/nvgrace-gpu: register device memory for poison handling
The nvgrace-gpu-vfio-pci module [1] maps the device memory to the user VA (Qemu) using remap_pfn_range() without adding the memory to the kernel. The device memory pages are not backed by struct page. The previous patch implements the mechanism to handle ECC/poison on memory page without struct page. This new mechanism is being used here. The module registers its memory region and the address_space with the kernel MM for ECC handling using the register_pfn_address_space() registration API exposed by the kernel. Link: https://lore.kernel.org/all/[email protected]/ [1] Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Ankit Agrawal <[email protected]> Acked-by: Alex Williamson <[email protected]> Cc: Aniket Agashe <[email protected]> Cc: Borislav Betkov <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Hanjun Guo <[email protected]> Cc: Ira Weiny <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Joanthan Cameron <[email protected]> Cc: Kevin Tian <[email protected]> Cc: Kirti Wankhede <[email protected]> Cc: Len Brown <[email protected]> Cc: Liam Howlett <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: "Luck, Tony" <[email protected]> Cc: Matthew R. Ochs <[email protected]> Cc: Mauro Carvalho Chehab <[email protected]> Cc: Miaohe Lin <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Naoya Horiguchi <[email protected]> Cc: Neo Jia <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Shuai Xue <[email protected]> Cc: Smita Koralahalli Channabasappa <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Tarun Gupta <[email protected]> Cc: Uwe Kleine-König <[email protected]> Cc: Vikram Sethi <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Zhi Wang <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
2ec4196718
commit
ebb9aeb980
1 file changed
+44
-1
@@ -8,6 +8,10 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
#include <linux/memory-failure.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The device memory usable to the workloads running in the VM is cached
|
||||
* and showcased as a 64b device BAR (comprising of BAR4 and BAR5 region)
|
||||
@@ -47,6 +51,9 @@ struct mem_region {
|
||||
void *memaddr;
|
||||
void __iomem *ioaddr;
|
||||
}; /* Base virtual address of the region */
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
struct pfn_address_space pfn_address_space;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct nvgrace_gpu_pci_core_device {
|
||||
@@ -60,6 +67,28 @@ struct nvgrace_gpu_pci_core_device {
|
||||
bool has_mig_hw_bug;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
|
||||
static int
|
||||
nvgrace_gpu_vfio_pci_register_pfn_range(struct mem_region *region,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
unsigned long nr_pages;
|
||||
int ret = 0;
|
||||
|
||||
nr_pages = region->memlength >> PAGE_SHIFT;
|
||||
|
||||
region->pfn_address_space.node.start = vma->vm_pgoff;
|
||||
region->pfn_address_space.node.last = vma->vm_pgoff + nr_pages - 1;
|
||||
region->pfn_address_space.mapping = vma->vm_file->f_mapping;
|
||||
|
||||
ret = register_pfn_address_space(®ion->pfn_address_space);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void nvgrace_gpu_init_fake_bar_emu_regs(struct vfio_device *core_vdev)
|
||||
{
|
||||
struct nvgrace_gpu_pci_core_device *nvdev =
|
||||
@@ -127,6 +156,13 @@ static void nvgrace_gpu_close_device(struct vfio_device *core_vdev)
|
||||
|
||||
mutex_destroy(&nvdev->remap_lock);
|
||||
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
if (nvdev->resmem.memlength)
|
||||
unregister_pfn_address_space(&nvdev->resmem.pfn_address_space);
|
||||
|
||||
unregister_pfn_address_space(&nvdev->usemem.pfn_address_space);
|
||||
#endif
|
||||
|
||||
vfio_pci_core_close_device(core_vdev);
|
||||
}
|
||||
|
||||
@@ -202,7 +238,14 @@ static int nvgrace_gpu_mmap(struct vfio_device *core_vdev,
|
||||
|
||||
vma->vm_pgoff = start_pfn;
|
||||
|
||||
return 0;
|
||||
#ifdef CONFIG_MEMORY_FAILURE
|
||||
if (nvdev->resmem.memlength && index == VFIO_PCI_BAR2_REGION_INDEX)
|
||||
ret = nvgrace_gpu_vfio_pci_register_pfn_range(&nvdev->resmem, vma);
|
||||
else if (index == VFIO_PCI_BAR4_REGION_INDEX)
|
||||
ret = nvgrace_gpu_vfio_pci_register_pfn_range(&nvdev->usemem, vma);
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long
|
||||
|
||||
Reference in new issue
Block a user