]> git.baikalelectronics.ru Git - kernel.git/commit
vfio/ccw: Add kmap_local_page() for memcpy
authorNicolin Chen <nicolinc@nvidia.com>
Sat, 23 Jul 2022 02:02:55 +0000 (19:02 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 25 Jul 2022 19:41:22 +0000 (13:41 -0600)
commit9fa6b604c8e82982af505f0516d5db14d0d969c2
treea27ba8e2b65b068acfc0c7022973d5bbc4add345
parent91d67c4168e6cd1236b48d1599663a42a3367a08
vfio/ccw: Add kmap_local_page() for memcpy

A PFN is not secure enough to promise that the memory is not IO. And
direct access via memcpy() that only handles CPU memory will crash on
S390 if the PFN is an IO PFN, as we have to use the memcpy_to/fromio()
that uses the special S390 IO access instructions. On the other hand,
a "struct page *" is always a CPU coherent thing that fits memcpy().

Also, casting a PFN to "void *" for memcpy() is not a proper practice,
kmap_local_page() is the correct API to call here, though S390 doesn't
use highmem, which means kmap_local_page() is a NOP.

There's a following patch changing the vfio_pin_pages() API to return
a list of "struct page *" instead of PFNs. It will block any IO memory
from ever getting into this call path, for such a security purpose. In
this patch, add kmap_local_page() to prepare for that.

Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Eric Farman <farman@linux.ibm.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Link: https://lore.kernel.org/r/20220723020256.30081-10-nicolinc@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/s390/cio/vfio_ccw_cp.c