hmm related patches for 5.9
This series adds reporting of the page table order from hmm_range_fault()
and some optimization of migrate_vma():
- Report the size of the page table mapping out of hmm_range_fault(). This
makes it easier to establish a large/huge/etc mapping in the device's
page table.
- Allow devices to ignore the invalidations during migration in cases
where the migration is not going to change pages. For instance migrating
pages to a device does not require the device to invalidate pages
already in the device.
- Update nouveau and hmm_tests to use the above
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEfB7FMLh+8QxL+6i3OG33FX4gmxoFAl8oocYACgkQOG33FX4g
mxqd3Q/+OClUADmrI+EGJAPI7VD3EYfyZdnMCcp39AYNfySQPN9+fCMF5hVD5U7x
KZVflR/zKUIZJVvdD8yAdrynZ1sHBG/HEzDyoaKcGzfCKq5LEAEnP5FG3xsiDjkO
QX7w6qIGDz59gaeanQKNzqaR3DMpBwO/0D5/80DWXv+WgmxsAphanJYlo4eWyq4D
EGq8EndCxairkTLpPlDHvFottL5kAKDXEinSAwWGQeZJkRY93vj+HZAQaeltmB1K
SDdZr7lsEg2RhtRjzT7CkA2bkCERKL3xEc4VWaCAZw+qm8aeswADVOSo5E5F7DMI
NUsB/p4GZ2CvIog/y3g/aSGluevdYJHTH8ip1BnNr2qCcXSEqHKsmyKpVNZztSUl
uljyT17ZzTsdR4xj50tM27fzgDaavWrwFZTsJxUifuvAO9rHvGDVpaN8ZIU9iZei
PTsGQvfoHDmWBWKX1dkIUGq+UoGwEAYRGk+XU0OYZCK97xmjRnGVoH0FTOk4DNQs
+A0250oTOrvdSGiv0fNT5qpWpFsQ/84h8Lz6ubAD3okVo1bk9cFMe2argQl+E2qI
TGM9ZHS8rphJNWwiPm8xrgf9eQ9bNp3ilCsIzBBpqZq8elwaL6a3ySieDPE734Ar
FZEeEYTvj5Z/gXtyo/gxVKhltCc4U8kPqye9uexTInz4zBUUZOM=
=omAU
-----END PGP SIGNATURE-----
Merge tag 'for-linus-hmm' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull hmm updates from Jason Gunthorpe:
"Ralph has been working on nouveau's use of hmm_range_fault() and
migrate_vma() which resulted in this small series. It adds reporting
of the page table order from hmm_range_fault() and some optimization
of migrate_vma():
- Report the size of the page table mapping out of hmm_range_fault().
This makes it easier to establish a large/huge/etc mapping in the
device's page table.
- Allow devices to ignore the invalidations during migration in cases
where the migration is not going to change pages.
For instance migrating pages to a device does not require the
device to invalidate pages already in the device.
- Update nouveau and hmm_tests to use the above"
* tag 'for-linus-hmm' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
mm/hmm/test: use the new migration invalidation
nouveau/svm: use the new migration invalidation
mm/notifier: add migration invalidation type
mm/migrate: add a flags parameter to migrate_vma
nouveau: fix storing invalid ptes
nouveau/hmm: support mapping large sysmem pages
nouveau: fix mapping 2MB sysmem pages
nouveau/hmm: fault one page at a time
mm/hmm: add tests for hmm_pfn_to_map_order()
mm/hmm: provide the page mapping order in hmm_range_fault()
This commit is contained in:
commit
fffe3ae0ee
14 changed files with 411 additions and 201 deletions
|
|
@ -37,16 +37,17 @@
|
|||
* will fail. Must be combined with HMM_PFN_REQ_FAULT.
|
||||
*/
|
||||
enum hmm_pfn_flags {
|
||||
/* Output flags */
|
||||
/* Output fields and flags */
|
||||
HMM_PFN_VALID = 1UL << (BITS_PER_LONG - 1),
|
||||
HMM_PFN_WRITE = 1UL << (BITS_PER_LONG - 2),
|
||||
HMM_PFN_ERROR = 1UL << (BITS_PER_LONG - 3),
|
||||
HMM_PFN_ORDER_SHIFT = (BITS_PER_LONG - 8),
|
||||
|
||||
/* Input flags */
|
||||
HMM_PFN_REQ_FAULT = HMM_PFN_VALID,
|
||||
HMM_PFN_REQ_WRITE = HMM_PFN_WRITE,
|
||||
|
||||
HMM_PFN_FLAGS = HMM_PFN_VALID | HMM_PFN_WRITE | HMM_PFN_ERROR,
|
||||
HMM_PFN_FLAGS = 0xFFUL << HMM_PFN_ORDER_SHIFT,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -61,6 +62,25 @@ static inline struct page *hmm_pfn_to_page(unsigned long hmm_pfn)
|
|||
return pfn_to_page(hmm_pfn & ~HMM_PFN_FLAGS);
|
||||
}
|
||||
|
||||
/*
|
||||
* hmm_pfn_to_map_order() - return the CPU mapping size order
|
||||
*
|
||||
* This is optionally useful to optimize processing of the pfn result
|
||||
* array. It indicates that the page starts at the order aligned VA and is
|
||||
* 1<<order bytes long. Every pfn within an high order page will have the
|
||||
* same pfn flags, both access protections and the map_order. The caller must
|
||||
* be careful with edge cases as the start and end VA of the given page may
|
||||
* extend past the range used with hmm_range_fault().
|
||||
*
|
||||
* This must be called under the caller 'user_lock' after a successful
|
||||
* mmu_interval_read_begin(). The caller must have tested for HMM_PFN_VALID
|
||||
* already.
|
||||
*/
|
||||
static inline unsigned int hmm_pfn_to_map_order(unsigned long hmm_pfn)
|
||||
{
|
||||
return (hmm_pfn >> HMM_PFN_ORDER_SHIFT) & 0x1F;
|
||||
}
|
||||
|
||||
/*
|
||||
* struct hmm_range - track invalidation lock on virtual address range
|
||||
*
|
||||
|
|
|
|||
|
|
@ -180,6 +180,11 @@ static inline unsigned long migrate_pfn(unsigned long pfn)
|
|||
return (pfn << MIGRATE_PFN_SHIFT) | MIGRATE_PFN_VALID;
|
||||
}
|
||||
|
||||
enum migrate_vma_direction {
|
||||
MIGRATE_VMA_SELECT_SYSTEM = 1 << 0,
|
||||
MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
|
||||
};
|
||||
|
||||
struct migrate_vma {
|
||||
struct vm_area_struct *vma;
|
||||
/*
|
||||
|
|
@ -199,11 +204,14 @@ struct migrate_vma {
|
|||
|
||||
/*
|
||||
* Set to the owner value also stored in page->pgmap->owner for
|
||||
* migrating out of device private memory. If set only device
|
||||
* private pages with this owner are migrated. If not set
|
||||
* device private pages are not migrated at all.
|
||||
* migrating out of device private memory. The flags also need to
|
||||
* be set to MIGRATE_VMA_SELECT_DEVICE_PRIVATE.
|
||||
* The caller should always set this field when using mmu notifier
|
||||
* callbacks to avoid device MMU invalidations for device private
|
||||
* pages that are not being migrated.
|
||||
*/
|
||||
void *src_owner;
|
||||
void *pgmap_owner;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
int migrate_vma_setup(struct migrate_vma *args);
|
||||
|
|
|
|||
|
|
@ -38,6 +38,10 @@ struct mmu_interval_notifier;
|
|||
*
|
||||
* @MMU_NOTIFY_RELEASE: used during mmu_interval_notifier invalidate to signal
|
||||
* that the mm refcount is zero and the range is no longer accessible.
|
||||
*
|
||||
* @MMU_NOTIFY_MIGRATE: used during migrate_vma_collect() invalidate to signal
|
||||
* a device driver to possibly ignore the invalidation if the
|
||||
* migrate_pgmap_owner field matches the driver's device private pgmap owner.
|
||||
*/
|
||||
enum mmu_notifier_event {
|
||||
MMU_NOTIFY_UNMAP = 0,
|
||||
|
|
@ -46,6 +50,7 @@ enum mmu_notifier_event {
|
|||
MMU_NOTIFY_PROTECTION_PAGE,
|
||||
MMU_NOTIFY_SOFT_DIRTY,
|
||||
MMU_NOTIFY_RELEASE,
|
||||
MMU_NOTIFY_MIGRATE,
|
||||
};
|
||||
|
||||
#define MMU_NOTIFIER_RANGE_BLOCKABLE (1 << 0)
|
||||
|
|
@ -264,6 +269,7 @@ struct mmu_notifier_range {
|
|||
unsigned long end;
|
||||
unsigned flags;
|
||||
enum mmu_notifier_event event;
|
||||
void *migrate_pgmap_owner;
|
||||
};
|
||||
|
||||
static inline int mm_has_notifiers(struct mm_struct *mm)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue