x86/mm: Drop l{1,2,3,4}e_write_atomic()

The l{1,2,3,4}e_write_atomic() and non _atomic suffixed helpers share the same
implementation, so it seems pointless and possibly confusing to have both.

x86 32bit mode used to have a non-atomic PTE write that would split the write
in two halves, but with Xen only supporting x86 64bit that's no longer
present.

Remove the l{1,2,3,4}e_write_atomic() helpers and switch it's user to
l{1,2,3,4}e_write(), as that's also atomic.  While there also remove
pte_write{,_atomic}() and just use write_atomic() in the wrappers.

No functional change intended.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Roger Pau Monne authored and Andrew Cooper committed 2024-07-30 17:36:51 +01:00
1 parent 90a8f4c7ea
commit f51571fe79
3 files changed
+20 -42

No files matched your search

+4 -17
View File
@@ -26,27 +26,14 @@
l4e_from_intpte(pte_read_atomic(&l4e_get_intpte(*(l4ep))))
/* Write a pte atomically to memory. */
#define l1e_write_atomic(l1ep, l1e) \
pte_write_atomic(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e))
#define l2e_write_atomic(l2ep, l2e) \
pte_write_atomic(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e))
#define l3e_write_atomic(l3ep, l3e) \
pte_write_atomic(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e))
#define l4e_write_atomic(l4ep, l4e) \
pte_write_atomic(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e))
/*
* Write a pte safely but non-atomically to memory.
* The PTE may become temporarily not-present during the update.
*/
#define l1e_write(l1ep, l1e) \
pte_write(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e))
write_atomic(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e))
#define l2e_write(l2ep, l2e) \
pte_write(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e))
write_atomic(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e))
#define l3e_write(l3ep, l3e) \
pte_write(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e))
write_atomic(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e))
#define l4e_write(l4ep, l4e) \
pte_write(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e))
write_atomic(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e))
/* Get direct integer representation of a pte's contents (intpte_t). */
#define l1e_get_intpte(x) ((x).l1)
-2
View File
@@ -70,8 +70,6 @@ typedef l4_pgentry_t root_pgentry_t;
#endif /* !__ASSEMBLY__ */
#define pte_read_atomic(ptep) read_atomic(ptep)
#define pte_write_atomic(ptep, pte) write_atomic(ptep, pte)
#define pte_write(ptep, pte) write_atomic(ptep, pte)
/* Given a virtual address, get an entry offset into a linear page table. */
#define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> L1_PAGETABLE_SHIFT)
+16 -23
View File
@@ -5253,7 +5253,7 @@ int map_pages_to_xen(
!(flags & (_PAGE_PAT | MAP_SMALL_PAGES)) )
{
/* 1GB-page mapping. */
l3e_write_atomic(pl3e, l3e_from_mfn(mfn, l1f_to_lNf(flags)));
l3e_write(pl3e, l3e_from_mfn(mfn, l1f_to_lNf(flags)));
if ( (l3e_get_flags(ol3e) & _PAGE_PRESENT) )
{
@@ -5353,8 +5353,7 @@ int map_pages_to_xen(
if ( (l3e_get_flags(*pl3e) & _PAGE_PRESENT) &&
(l3e_get_flags(*pl3e) & _PAGE_PSE) )
{
l3e_write_atomic(pl3e,
l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR));
l3e_write(pl3e, l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR));
l2mfn = INVALID_MFN;
}
if ( locking )
@@ -5375,7 +5374,7 @@ int map_pages_to_xen(
{
/* Super-page mapping. */
ol2e = *pl2e;
l2e_write_atomic(pl2e, l2e_from_mfn(mfn, l1f_to_lNf(flags)));
l2e_write(pl2e, l2e_from_mfn(mfn, l1f_to_lNf(flags)));
if ( (l2e_get_flags(ol2e) & _PAGE_PRESENT) )
{
@@ -5457,8 +5456,7 @@ int map_pages_to_xen(
if ( (l2e_get_flags(*pl2e) & _PAGE_PRESENT) &&
(l2e_get_flags(*pl2e) & _PAGE_PSE) )
{
l2e_write_atomic(pl2e, l2e_from_mfn(l1mfn,
__PAGE_HYPERVISOR));
l2e_write(pl2e, l2e_from_mfn(l1mfn, __PAGE_HYPERVISOR));
l1mfn = INVALID_MFN;
}
if ( locking )
@@ -5471,7 +5469,7 @@ int map_pages_to_xen(
if ( !pl1e )
pl1e = map_l1t_from_l2e(*pl2e) + l1_table_offset(virt);
ol1e = *pl1e;
l1e_write_atomic(pl1e, l1e_from_mfn(mfn, flags));
l1e_write(pl1e, l1e_from_mfn(mfn, flags));
UNMAP_DOMAIN_PAGE(pl1e);
if ( (l1e_get_flags(ol1e) & _PAGE_PRESENT) )
{
@@ -5524,8 +5522,7 @@ int map_pages_to_xen(
UNMAP_DOMAIN_PAGE(l1t);
if ( i == L1_PAGETABLE_ENTRIES )
{
l2e_write_atomic(pl2e, l2e_from_pfn(base_mfn,
l1f_to_lNf(flags)));
l2e_write(pl2e, l2e_from_pfn(base_mfn, l1f_to_lNf(flags)));
if ( locking )
spin_unlock(&map_pgdir_lock);
flush_area(virt - PAGE_SIZE,
@@ -5574,8 +5571,7 @@ int map_pages_to_xen(
UNMAP_DOMAIN_PAGE(l2t);
if ( i == L2_PAGETABLE_ENTRIES )
{
l3e_write_atomic(pl3e, l3e_from_pfn(base_mfn,
l1f_to_lNf(flags)));
l3e_write(pl3e, l3e_from_pfn(base_mfn, l1f_to_lNf(flags)));
if ( locking )
spin_unlock(&map_pgdir_lock);
flush_area(virt - PAGE_SIZE,
@@ -5674,7 +5670,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
: l3e_from_pfn(l3e_get_pfn(*pl3e),
(l3e_get_flags(*pl3e) & ~FLAGS_MASK) | nf);
l3e_write_atomic(pl3e, nl3e);
l3e_write(pl3e, nl3e);
v += 1UL << L3_PAGETABLE_SHIFT;
continue;
}
@@ -5696,8 +5692,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
if ( (l3e_get_flags(*pl3e) & _PAGE_PRESENT) &&
(l3e_get_flags(*pl3e) & _PAGE_PSE) )
{
l3e_write_atomic(pl3e,
l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR));
l3e_write(pl3e, l3e_from_mfn(l2mfn, __PAGE_HYPERVISOR));
l2mfn = INVALID_MFN;
}
if ( locking )
@@ -5732,7 +5727,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
: l2e_from_pfn(l2e_get_pfn(*pl2e),
(l2e_get_flags(*pl2e) & ~FLAGS_MASK) | nf);
l2e_write_atomic(pl2e, nl2e);
l2e_write(pl2e, nl2e);
v += 1UL << L2_PAGETABLE_SHIFT;
}
else
@@ -5755,8 +5750,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
if ( (l2e_get_flags(*pl2e) & _PAGE_PRESENT) &&
(l2e_get_flags(*pl2e) & _PAGE_PSE) )
{
l2e_write_atomic(pl2e, l2e_from_mfn(l1mfn,
__PAGE_HYPERVISOR));
l2e_write(pl2e, l2e_from_mfn(l1mfn, __PAGE_HYPERVISOR));
l1mfn = INVALID_MFN;
}
if ( locking )
@@ -5785,7 +5779,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
: l1e_from_pfn(l1e_get_pfn(*pl1e),
(l1e_get_flags(*pl1e) & ~FLAGS_MASK) | nf);
l1e_write_atomic(pl1e, nl1e);
l1e_write(pl1e, nl1e);
UNMAP_DOMAIN_PAGE(pl1e);
v += PAGE_SIZE;
@@ -5824,7 +5818,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
if ( i == L1_PAGETABLE_ENTRIES )
{
/* Empty: zap the L2E and free the L1 page. */
l2e_write_atomic(pl2e, l2e_empty());
l2e_write(pl2e, l2e_empty());
if ( locking )
spin_unlock(&map_pgdir_lock);
flush_area(NULL, FLUSH_TLB_GLOBAL); /* flush before free */
@@ -5868,7 +5862,7 @@ int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
if ( i == L2_PAGETABLE_ENTRIES )
{
/* Empty: zap the L3E and free the L2 page. */
l3e_write_atomic(pl3e, l3e_empty());
l3e_write(pl3e, l3e_empty());
if ( locking )
spin_unlock(&map_pgdir_lock);
flush_area(NULL, FLUSH_TLB_GLOBAL); /* flush before free */
@@ -5940,7 +5934,7 @@ void init_or_livepatch modify_xen_mappings_lite(
{
ASSERT(IS_ALIGNED(v, 1UL << L2_PAGETABLE_SHIFT));
l2e_write_atomic(pl2e, l2e_from_intpte((l2e.l2 & ~fm) | flags));
l2e_write(pl2e, l2e_from_intpte((l2e.l2 & ~fm) | flags));
v += 1UL << L2_PAGETABLE_SHIFT;
continue;
@@ -5958,8 +5952,7 @@ void init_or_livepatch modify_xen_mappings_lite(
ASSERT(l1f & _PAGE_PRESENT);
l1e_write_atomic(pl1e,
l1e_from_intpte((l1e.l1 & ~fm) | flags));
l1e_write(pl1e, l1e_from_intpte((l1e.l1 & ~fm) | flags));
v += 1UL << L1_PAGETABLE_SHIFT;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.