summaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2016-01-15 19:56:11 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-15 20:56:32 -0500
commitba049e93aef7e8c571567088b1b73f4f5b99272a (patch)
treead6c02eca447f57f5787a5357290895e68e9463e /virt
parent16da306849d0335af7c353ec14121cf422433d33 (diff)
kvm: rename pfn_t to kvm_pfn_t
To date, we have implemented two I/O usage models for persistent memory, PMEM (a persistent "ram disk") and DAX (mmap persistent memory into userspace). This series adds a third, DAX-GUP, that allows DAX mappings to be the target of direct-i/o. It allows userspace to coordinate DMA/RDMA from/to persistent memory. The implementation leverages the ZONE_DEVICE mm-zone that went into 4.3-rc1 (also discussed at kernel summit) to flag pages that are owned and dynamically mapped by a device driver. The pmem driver, after mapping a persistent memory range into the system memmap via devm_memremap_pages(), arranges for DAX to distinguish pfn-only versus page-backed pmem-pfns via flags in the new pfn_t type. The DAX code, upon seeing a PFN_DEV+PFN_MAP flagged pfn, flags the resulting pte(s) inserted into the process page tables with a new _PAGE_DEVMAP flag. Later, when get_user_pages() is walking ptes it keys off _PAGE_DEVMAP to pin the device hosting the page range active. Finally, get_page() and put_page() are modified to take references against the device driver established page mapping. Finally, this need for "struct page" for persistent memory requires memory capacity to store the memmap array. Given the memmap array for a large pool of persistent may exhaust available DRAM introduce a mechanism to allocate the memmap from persistent memory. The new "struct vmem_altmap *" parameter to devm_memremap_pages() enables arch_add_memory() to use reserved pmem capacity rather than the page allocator. This patch (of 18): The core has developed a need for a "pfn_t" type [1]. Move the existing pfn_t in KVM to kvm_pfn_t [2]. [1]: https://lists.01.org/pipermail/linux-nvdimm/2015-September/002199.html [2]: https://lists.01.org/pipermail/linux-nvdimm/2015-September/002218.html Signed-off-by: Dan Williams <dan.j.williams@intel.com> Acked-by: Christoffer Dall <christoffer.dall@linaro.org> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c47
1 files changed, 24 insertions, 23 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 314c7774652e..a11cfd20a6a0 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -111,7 +111,7 @@ static void hardware_disable_all(void);
111 111
112static void kvm_io_bus_destroy(struct kvm_io_bus *bus); 112static void kvm_io_bus_destroy(struct kvm_io_bus *bus);
113 113
114static void kvm_release_pfn_dirty(pfn_t pfn); 114static void kvm_release_pfn_dirty(kvm_pfn_t pfn);
115static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn); 115static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn);
116 116
117__visible bool kvm_rebooting; 117__visible bool kvm_rebooting;
@@ -119,7 +119,7 @@ EXPORT_SYMBOL_GPL(kvm_rebooting);
119 119
120static bool largepages_enabled = true; 120static bool largepages_enabled = true;
121 121
122bool kvm_is_reserved_pfn(pfn_t pfn) 122bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
123{ 123{
124 if (pfn_valid(pfn)) 124 if (pfn_valid(pfn))
125 return PageReserved(pfn_to_page(pfn)); 125 return PageReserved(pfn_to_page(pfn));
@@ -1289,7 +1289,7 @@ static inline int check_user_page_hwpoison(unsigned long addr)
1289 * true indicates success, otherwise false is returned. 1289 * true indicates success, otherwise false is returned.
1290 */ 1290 */
1291static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async, 1291static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
1292 bool write_fault, bool *writable, pfn_t *pfn) 1292 bool write_fault, bool *writable, kvm_pfn_t *pfn)
1293{ 1293{
1294 struct page *page[1]; 1294 struct page *page[1];
1295 int npages; 1295 int npages;
@@ -1322,7 +1322,7 @@ static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
1322 * 1 indicates success, -errno is returned if error is detected. 1322 * 1 indicates success, -errno is returned if error is detected.
1323 */ 1323 */
1324static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault, 1324static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
1325 bool *writable, pfn_t *pfn) 1325 bool *writable, kvm_pfn_t *pfn)
1326{ 1326{
1327 struct page *page[1]; 1327 struct page *page[1];
1328 int npages = 0; 1328 int npages = 0;
@@ -1386,11 +1386,11 @@ static bool vma_is_valid(struct vm_area_struct *vma, bool write_fault)
1386 * 2): @write_fault = false && @writable, @writable will tell the caller 1386 * 2): @write_fault = false && @writable, @writable will tell the caller
1387 * whether the mapping is writable. 1387 * whether the mapping is writable.
1388 */ 1388 */
1389static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async, 1389static kvm_pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async,
1390 bool write_fault, bool *writable) 1390 bool write_fault, bool *writable)
1391{ 1391{
1392 struct vm_area_struct *vma; 1392 struct vm_area_struct *vma;
1393 pfn_t pfn = 0; 1393 kvm_pfn_t pfn = 0;
1394 int npages; 1394 int npages;
1395 1395
1396 /* we can do it either atomically or asynchronously, not both */ 1396 /* we can do it either atomically or asynchronously, not both */
@@ -1431,8 +1431,9 @@ exit:
1431 return pfn; 1431 return pfn;
1432} 1432}
1433 1433
1434pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic, 1434kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
1435 bool *async, bool write_fault, bool *writable) 1435 bool atomic, bool *async, bool write_fault,
1436 bool *writable)
1436{ 1437{
1437 unsigned long addr = __gfn_to_hva_many(slot, gfn, NULL, write_fault); 1438 unsigned long addr = __gfn_to_hva_many(slot, gfn, NULL, write_fault);
1438 1439
@@ -1453,7 +1454,7 @@ pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic,
1453} 1454}
1454EXPORT_SYMBOL_GPL(__gfn_to_pfn_memslot); 1455EXPORT_SYMBOL_GPL(__gfn_to_pfn_memslot);
1455 1456
1456pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, 1457kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
1457 bool *writable) 1458 bool *writable)
1458{ 1459{
1459 return __gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn, false, NULL, 1460 return __gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn, false, NULL,
@@ -1461,37 +1462,37 @@ pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
1461} 1462}
1462EXPORT_SYMBOL_GPL(gfn_to_pfn_prot); 1463EXPORT_SYMBOL_GPL(gfn_to_pfn_prot);
1463 1464
1464pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn) 1465kvm_pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
1465{ 1466{
1466 return __gfn_to_pfn_memslot(slot, gfn, false, NULL, true, NULL); 1467 return __gfn_to_pfn_memslot(slot, gfn, false, NULL, true, NULL);
1467} 1468}
1468EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot); 1469EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot);
1469 1470
1470pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn) 1471kvm_pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn)
1471{ 1472{
1472 return __gfn_to_pfn_memslot(slot, gfn, true, NULL, true, NULL); 1473 return __gfn_to_pfn_memslot(slot, gfn, true, NULL, true, NULL);
1473} 1474}
1474EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot_atomic); 1475EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot_atomic);
1475 1476
1476pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn) 1477kvm_pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn)
1477{ 1478{
1478 return gfn_to_pfn_memslot_atomic(gfn_to_memslot(kvm, gfn), gfn); 1479 return gfn_to_pfn_memslot_atomic(gfn_to_memslot(kvm, gfn), gfn);
1479} 1480}
1480EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic); 1481EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic);
1481 1482
1482pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn) 1483kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn)
1483{ 1484{
1484 return gfn_to_pfn_memslot_atomic(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn); 1485 return gfn_to_pfn_memslot_atomic(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn);
1485} 1486}
1486EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_pfn_atomic); 1487EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_pfn_atomic);
1487 1488
1488pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn) 1489kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
1489{ 1490{
1490 return gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn); 1491 return gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn);
1491} 1492}
1492EXPORT_SYMBOL_GPL(gfn_to_pfn); 1493EXPORT_SYMBOL_GPL(gfn_to_pfn);
1493 1494
1494pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn) 1495kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn)
1495{ 1496{
1496 return gfn_to_pfn_memslot(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn); 1497 return gfn_to_pfn_memslot(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn);
1497} 1498}
@@ -1514,7 +1515,7 @@ int gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn,
1514} 1515}
1515EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic); 1516EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic);
1516 1517
1517static struct page *kvm_pfn_to_page(pfn_t pfn) 1518static struct page *kvm_pfn_to_page(kvm_pfn_t pfn)
1518{ 1519{
1519 if (is_error_noslot_pfn(pfn)) 1520 if (is_error_noslot_pfn(pfn))
1520 return KVM_ERR_PTR_BAD_PAGE; 1521 return KVM_ERR_PTR_BAD_PAGE;
@@ -1529,7 +1530,7 @@ static struct page *kvm_pfn_to_page(pfn_t pfn)
1529 1530
1530struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) 1531struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
1531{ 1532{
1532 pfn_t pfn; 1533 kvm_pfn_t pfn;
1533 1534
1534 pfn = gfn_to_pfn(kvm, gfn); 1535 pfn = gfn_to_pfn(kvm, gfn);
1535 1536
@@ -1539,7 +1540,7 @@ EXPORT_SYMBOL_GPL(gfn_to_page);
1539 1540
1540struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn) 1541struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn)
1541{ 1542{
1542 pfn_t pfn; 1543 kvm_pfn_t pfn;
1543 1544
1544 pfn = kvm_vcpu_gfn_to_pfn(vcpu, gfn); 1545 pfn = kvm_vcpu_gfn_to_pfn(vcpu, gfn);
1545 1546
@@ -1555,7 +1556,7 @@ void kvm_release_page_clean(struct page *page)
1555} 1556}
1556EXPORT_SYMBOL_GPL(kvm_release_page_clean); 1557EXPORT_SYMBOL_GPL(kvm_release_page_clean);
1557 1558
1558void kvm_release_pfn_clean(pfn_t pfn) 1559void kvm_release_pfn_clean(kvm_pfn_t pfn)
1559{ 1560{
1560 if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) 1561 if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn))
1561 put_page(pfn_to_page(pfn)); 1562 put_page(pfn_to_page(pfn));
@@ -1570,13 +1571,13 @@ void kvm_release_page_dirty(struct page *page)
1570} 1571}
1571EXPORT_SYMBOL_GPL(kvm_release_page_dirty); 1572EXPORT_SYMBOL_GPL(kvm_release_page_dirty);
1572 1573
1573static void kvm_release_pfn_dirty(pfn_t pfn) 1574static void kvm_release_pfn_dirty(kvm_pfn_t pfn)
1574{ 1575{
1575 kvm_set_pfn_dirty(pfn); 1576 kvm_set_pfn_dirty(pfn);
1576 kvm_release_pfn_clean(pfn); 1577 kvm_release_pfn_clean(pfn);
1577} 1578}
1578 1579
1579void kvm_set_pfn_dirty(pfn_t pfn) 1580void kvm_set_pfn_dirty(kvm_pfn_t pfn)
1580{ 1581{
1581 if (!kvm_is_reserved_pfn(pfn)) { 1582 if (!kvm_is_reserved_pfn(pfn)) {
1582 struct page *page = pfn_to_page(pfn); 1583 struct page *page = pfn_to_page(pfn);
@@ -1587,14 +1588,14 @@ void kvm_set_pfn_dirty(pfn_t pfn)
1587} 1588}
1588EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); 1589EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
1589 1590
1590void kvm_set_pfn_accessed(pfn_t pfn) 1591void kvm_set_pfn_accessed(kvm_pfn_t pfn)
1591{ 1592{
1592 if (!kvm_is_reserved_pfn(pfn)) 1593 if (!kvm_is_reserved_pfn(pfn))
1593 mark_page_accessed(pfn_to_page(pfn)); 1594 mark_page_accessed(pfn_to_page(pfn));
1594} 1595}
1595EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); 1596EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed);
1596 1597
1597void kvm_get_pfn(pfn_t pfn) 1598void kvm_get_pfn(kvm_pfn_t pfn)
1598{ 1599{
1599 if (!kvm_is_reserved_pfn(pfn)) 1600 if (!kvm_is_reserved_pfn(pfn))
1600 get_page(pfn_to_page(pfn)); 1601 get_page(pfn_to_page(pfn));