lkml.org 
[lkml]   [2006]   [Apr]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[(take 2)patch 5/7] Notify page fault call chain for sparc64
    Overloading of page fault notification with the
    notify_die() has performance issues(since the
    only interested components for page fault is
    kprobes and/or kdb) and hence this patch introduces
    the new notifier call chain exclusively for page
    fault notifications their by avoiding notifying
    unnecessary components in the do_page_fault() code
    path.

    Changes since previous version:
    1) Moved the implementaion of register/unregister_page_fault_notifier()
    call to arch/xxx/mm/fault.c
    2) Added #ifdef CONFIG_KPROBES around this register/unregister calls
    as currently kprobes is the only potential user.

    Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>


    ---
    arch/sparc64/mm/fault.c | 36 +++++++++++++++++++++++++++++++++++-
    include/asm-sparc64/kdebug.h | 2 ++
    2 files changed, 37 insertions(+), 1 deletion(-)

    Index: linux-2.6.17-rc1-mm3/arch/sparc64/mm/fault.c
    ===================================================================
    --- linux-2.6.17-rc1-mm3.orig/arch/sparc64/mm/fault.c
    +++ linux-2.6.17-rc1-mm3/arch/sparc64/mm/fault.c
    @@ -31,6 +31,40 @@
    #include <asm/kdebug.h>
    #include <asm/mmu_context.h>

    +#ifdef CONFIG_KPROBES
    +ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
    +
    +/* Hook to register for page fault notifications */
    +int register_page_fault_notifier(struct notifier_block *nb)
    +{
    + return atomic_notifier_chain_register(&notify_page_fault_chain, nb);
    +}
    +
    +int unregister_page_fault_notifier(struct notifier_block *nb)
    +{
    + return atomic_notifier_chain_unregister(&notify_page_fault_chain, nb);
    +}
    +
    +static inline int notify_page_fault(enum die_val val, const char *str,
    + struct pt_regs *regs, long err, int trap, int sig)
    +{
    + struct die_args args = {
    + .regs = regs,
    + .str = str,
    + .err = err,
    + .trapnr = trap,
    + .signr = sig
    + };
    + return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
    +}
    +#else
    +static inline int notify_page_fault(enum die_val val, const char *str,
    + struct pt_regs *regs, long err, int trap, int sig)
    +{
    + return NOTIFY_DONE;
    +}
    +#endif
    +
    /*
    * To debug kernel to catch accesses to certain virtual/physical addresses.
    * Mode = 0 selects physical watchpoints, mode = 1 selects virtual watchpoints.
    @@ -263,7 +297,7 @@ asmlinkage void __kprobes do_sparc64_fau

    fault_code = get_thread_fault_code();

    - if (notify_die(DIE_PAGE_FAULT, "page_fault", regs,
    + if (notify_page_fault(DIE_PAGE_FAULT, "page_fault", regs,
    fault_code, 0, SIGSEGV) == NOTIFY_STOP)
    return;

    Index: linux-2.6.17-rc1-mm3/include/asm-sparc64/kdebug.h
    ===================================================================
    --- linux-2.6.17-rc1-mm3.orig/include/asm-sparc64/kdebug.h
    +++ linux-2.6.17-rc1-mm3/include/asm-sparc64/kdebug.h
    @@ -17,6 +17,8 @@ struct die_args {

    extern int register_die_notifier(struct notifier_block *);
    extern int unregister_die_notifier(struct notifier_block *);
    +extern int register_page_fault_notifier(struct notifier_block *);
    +extern int unregister_page_fault_notifier(struct notifier_block *);
    extern struct atomic_notifier_head sparc64die_chain;

    extern void bad_trap(struct pt_regs *, long);
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-04-21 01:55    [W:0.035 / U:61.868 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site