lkml.org 
[lkml]   [2008]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 2 of 4] paravirt: add hooks for pte_rmw_start/commit
    Date
    From
    This patch adds paravirt-ops hooks in pv_mmu_ops for pte_rmw_start and
    pte_rmw_commit. This allows the hypervisor-specific backends to
    implement these in some more efficient way.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    ---
    arch/x86/kernel/paravirt.c | 3 +++
    arch/x86/xen/enlighten.c | 3 +++
    include/asm-x86/paravirt.h | 26 ++++++++++++++++++++++++++
    3 files changed, 32 insertions(+)

    diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
    --- a/arch/x86/kernel/paravirt.c
    +++ b/arch/x86/kernel/paravirt.c
    @@ -383,6 +383,9 @@
    .pte_update = paravirt_nop,
    .pte_update_defer = paravirt_nop,

    + .pte_rmw_start = __pte_rmw_start,
    + .pte_rmw_commit = __pte_rmw_commit,
    +
    #ifdef CONFIG_HIGHPTE
    .kmap_atomic_pte = kmap_atomic,
    #endif
    diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    --- a/arch/x86/xen/enlighten.c
    +++ b/arch/x86/xen/enlighten.c
    @@ -1103,6 +1103,9 @@
    .set_pte_at = xen_set_pte_at,
    .set_pmd = xen_set_pmd,

    + .pte_rmw_start = __pte_rmw_start,
    + .pte_rmw_commit = __pte_rmw_commit,
    +
    .pte_val = xen_pte_val,
    .pte_flags = native_pte_val,
    .pgd_val = xen_pgd_val,
    diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
    --- a/include/asm-x86/paravirt.h
    +++ b/include/asm-x86/paravirt.h
    @@ -238,6 +238,11 @@
    pte_t *ptep);
    void (*pte_update_defer)(struct mm_struct *mm,
    unsigned long addr, pte_t *ptep);
    +
    + pte_t (*pte_rmw_start)(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep);
    + void (*pte_rmw_commit)(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep, pte_t pte);

    pteval_t (*pte_val)(pte_t);
    pteval_t (*pte_flags)(pte_t);
    @@ -1040,6 +1045,27 @@
    return ret;
    }

    +#define __HAVE_ARCH_PTE_RMW_TRANSACTION
    +static inline pte_t pte_rmw_start(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep)
    +{
    + pteval_t ret;
    +
    + ret = PVOP_CALL3(pteval_t, pv_mmu_ops.pte_rmw_start, mm, addr, ptep);
    +
    + return (pte_t) { .pte = ret };
    +}
    +
    +static inline void pte_rmw_commit(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep, pte_t pte)
    +{
    + if (sizeof(pteval_t) > sizeof(long))
    + /* 5 arg words */
    + pv_mmu_ops.pte_rmw_commit(mm, addr, ptep, pte);
    + else
    + PVOP_VCALL4(pv_mmu_ops.pte_rmw_commit, mm, addr, ptep, pte.pte);
    +}
    +
    static inline void set_pte(pte_t *ptep, pte_t pte)
    {
    if (sizeof(pteval_t) > sizeof(long))



    \
     
     \ /
      Last update: 2008-05-23 16:29    [W:0.023 / U:0.252 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site