All of lore.kernel.org
 help / color / mirror / Atom feed
From: bibo mao <bibo_mao@linux.intel.com>
To: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Anderw Morton <akpm@osdl.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Keith Owens <kaos@americas.sgi.com>,
	Dean Nelson <dnc@americas.sgi.com>,
	Tony Luck <tony.luck@intel.com>,
	Anath Mavinakayanahalli <ananth@in.ibm.com>,
	Prasanna Panchamukhi <prasanna@in.ibm.com>,
	Dave M <davem@davemloft.net>, Andi Kleen <ak@suse.de>
Subject: Re: [(take 2)patch 7/7] Notify page fault call chain
Date: Mon, 24 Apr 2006 17:19:01 +0800	[thread overview]
Message-ID: <444C9805.4060303@linux.intel.com> (raw)
In-Reply-To: <20060420233912.570729645@csdlinux-2.jf.intel.com>

I have some questions about page fault call chain.
1) Can kprobe_exceptions_notify be divided into two sub-functions, one 
is for die call chain, which handles DIE_BREAK/DIE_FAULT trap, the other 
is specially for DIE_PAGE_FAULT trap.

2) page_fault_notifier is conditionally registered/unregistered in this 
patch, notify_page_fault(DIE_PAGE_FAULT...) is unconditionally called in 
  ia64_do_page_fault() function. I do not know whether it is possible to 
unconditionally register page_fault_notifier() call chain, but 
conditionally call notify_page_fault(DIE_PAGE_FAULT...) function.

3) I do know whether there are other conditions like kdb/kgdb which need
call page fault call chain when page fault happens. If only kprobe need 
handle page fault, then I think kprobe_exceptions_notify can be called 
directly in ia64_do_page_fault() function. Of course,  the call chain 
method is more convenient and easy to extend for other fault causes(like 
kdb/kgdb).

thanks
bibo,mao

Anil S Keshavamurthy wrote:
> With this patch Kprobes now registers for page fault notifications only
> when their is an active probe registered. Once all the active probes are
> unregistered their is no need to be notified of page faults and kprobes
> unregisters itself from the page fault notifications. Hence we
> will have ZERO side effects when no probes are active.
> 
> Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
> ---
>  include/asm-i386/kprobes.h    |    1 +
>  include/asm-ia64/kprobes.h    |    1 +
>  include/asm-powerpc/kprobes.h |    2 ++
>  include/asm-sparc64/kprobes.h |    1 +
>  include/asm-x86_64/kprobes.h  |    1 +
>  kernel/kprobes.c              |   30 +++++++++++++++++++++++-------
>  6 files changed, 29 insertions(+), 7 deletions(-)
> 
> Index: linux-2.6.17-rc1-mm3/include/asm-i386/kprobes.h
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/include/asm-i386/kprobes.h
> +++ linux-2.6.17-rc1-mm3/include/asm-i386/kprobes.h
> @@ -44,6 +44,7 @@ typedef u8 kprobe_opcode_t;
>  
>  #define JPROBE_ENTRY(pentry)	(kprobe_opcode_t *)pentry
>  #define ARCH_SUPPORTS_KRETPROBES
> +#define  ARCH_INACTIVE_KPROBE_COUNT 0
>  
>  void arch_remove_kprobe(struct kprobe *p);
>  void kretprobe_trampoline(void);
> Index: linux-2.6.17-rc1-mm3/include/asm-ia64/kprobes.h
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/include/asm-ia64/kprobes.h
> +++ linux-2.6.17-rc1-mm3/include/asm-ia64/kprobes.h
> @@ -82,6 +82,7 @@ struct kprobe_ctlblk {
>  #define JPROBE_ENTRY(pentry)	(kprobe_opcode_t *)pentry
>  
>  #define ARCH_SUPPORTS_KRETPROBES
> +#define  ARCH_INACTIVE_KPROBE_COUNT 1
>  
>  #define SLOT0_OPCODE_SHIFT	(37)
>  #define SLOT1_p1_OPCODE_SHIFT	(37 - (64-46))
> Index: linux-2.6.17-rc1-mm3/include/asm-powerpc/kprobes.h
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/include/asm-powerpc/kprobes.h
> +++ linux-2.6.17-rc1-mm3/include/asm-powerpc/kprobes.h
> @@ -50,6 +50,8 @@ typedef unsigned int kprobe_opcode_t;
>  			IS_TWI(instr) || IS_TDI(instr))
>  
>  #define ARCH_SUPPORTS_KRETPROBES
> +#define  ARCH_INACTIVE_KPROBE_COUNT 1
> +
>  void kretprobe_trampoline(void);
>  extern void arch_remove_kprobe(struct kprobe *p);
>  
> Index: linux-2.6.17-rc1-mm3/include/asm-sparc64/kprobes.h
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/include/asm-sparc64/kprobes.h
> +++ linux-2.6.17-rc1-mm3/include/asm-sparc64/kprobes.h
> @@ -13,6 +13,7 @@ typedef u32 kprobe_opcode_t;
>  
>  #define JPROBE_ENTRY(pentry)	(kprobe_opcode_t *)pentry
>  #define arch_remove_kprobe(p)	do {} while (0)
> +#define  ARCH_INACTIVE_KPROBE_COUNT 0
>  
>  /* Architecture specific copy of original instruction*/
>  struct arch_specific_insn {
> Index: linux-2.6.17-rc1-mm3/include/asm-x86_64/kprobes.h
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/include/asm-x86_64/kprobes.h
> +++ linux-2.6.17-rc1-mm3/include/asm-x86_64/kprobes.h
> @@ -43,6 +43,7 @@ typedef u8 kprobe_opcode_t;
>  
>  #define JPROBE_ENTRY(pentry)	(kprobe_opcode_t *)pentry
>  #define ARCH_SUPPORTS_KRETPROBES
> +#define  ARCH_INACTIVE_KPROBE_COUNT 1
>  
>  void kretprobe_trampoline(void);
>  extern void arch_remove_kprobe(struct kprobe *p);
> Index: linux-2.6.17-rc1-mm3/kernel/kprobes.c
> ===================================================================
> --- linux-2.6.17-rc1-mm3.orig/kernel/kprobes.c
> +++ linux-2.6.17-rc1-mm3/kernel/kprobes.c
> @@ -47,11 +47,17 @@
>  
>  static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
>  static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
> +static atomic_t kprobe_count;
>  
>  DEFINE_MUTEX(kprobe_mutex);		/* Protects kprobe_table */
>  DEFINE_SPINLOCK(kretprobe_lock);	/* Protects kretprobe_inst_table */
>  static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL;
>  
> +static struct notifier_block kprobe_page_fault_nb = {
> +	.notifier_call = kprobe_exceptions_notify,
> +	.priority = 0x7fffffff /* we need to notified first */
> +};
> +
>  #ifdef __ARCH_WANT_KPROBES_INSN_SLOT
>  /*
>   * kprobe->ainsn.insn points to the copy of the instruction to be
> @@ -464,6 +470,8 @@ static int __kprobes __register_kprobe(s
>  	old_p = get_kprobe(p->addr);
>  	if (old_p) {
>  		ret = register_aggr_kprobe(old_p, p);
> +		if (!ret)
> +			atomic_inc(&kprobe_count);
>  		goto out;
>  	}
>  
> @@ -474,6 +482,10 @@ static int __kprobes __register_kprobe(s
>  	hlist_add_head_rcu(&p->hlist,
>  		       &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]);
>  
> +	if (atomic_add_return(1, &kprobe_count) == \
> +				(ARCH_INACTIVE_KPROBE_COUNT + 1))
> +		register_page_fault_notifier(&kprobe_page_fault_nb);
> +
>    	arch_arm_kprobe(p);
>  
>  out:
> @@ -537,6 +549,16 @@ valid_p:
>  		}
>  		arch_remove_kprobe(p);
>  	}
> +
> +	/* Call unregister_page_fault_notifier()
> +	 * if no probes are active
> +	 */
> +	mutex_lock(&kprobe_mutex);
> +	if (atomic_add_return(-1, &kprobe_count) == \
> +				ARCH_INACTIVE_KPROBE_COUNT)
> +		unregister_page_fault_notifier(&kprobe_page_fault_nb);
> +	mutex_unlock(&kprobe_mutex);
> +	return;
>  }
>  
>  static struct notifier_block kprobe_exceptions_nb = {
> @@ -544,10 +566,6 @@ static struct notifier_block kprobe_exce
>  	.priority = 0x7fffffff /* we need to notified first */
>  };
>  
> -static struct notifier_block kprobe_page_fault_nb = {
> -	.notifier_call = kprobe_exceptions_notify,
> -	.priority = 0x7fffffff /* we need to notified first */
> -};
>  
>  int __kprobes register_jprobe(struct jprobe *jp)
>  {
> @@ -654,14 +672,12 @@ static int __init init_kprobes(void)
>  		INIT_HLIST_HEAD(&kprobe_table[i]);
>  		INIT_HLIST_HEAD(&kretprobe_inst_table[i]);
>  	}
> +	atomic_set(&kprobe_count, 0);
>  
>  	err = arch_init_kprobes();
>  	if (!err)
>  		err = register_die_notifier(&kprobe_exceptions_nb);
>  
> -	if (!err)
> -		err = register_page_fault_notifier(&kprobe_page_fault_nb);
> -
>  	return err;
>  }
>  
> 
> --
> -
> 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/
> 

  reply	other threads:[~2006-04-24  9:18 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-20 23:24 [(take 2)patch 0/7] Notify page fault call chain Anil S Keshavamurthy
2006-04-20 23:24 ` [(take 2)patch 1/7] Notify page fault call chain for x86_64 Anil S Keshavamurthy
2006-04-20 23:24 ` [(take 2)patch 2/7] Notify page fault call chain for i386 Anil S Keshavamurthy
2006-04-20 23:24 ` [(take 2)patch 3/7] Notify page fault call chain for ia64 Anil S Keshavamurthy
2006-04-20 23:25 ` [(take 2)patch 4/7] Notify page fault call chain for powerpc Anil S Keshavamurthy
2006-04-20 23:25 ` [(take 2)patch 5/7] Notify page fault call chain for sparc64 Anil S Keshavamurthy
2006-04-20 23:25 ` [(take 2)patch 6/7] Kprobes registers for notify page fault Anil S Keshavamurthy
2006-04-21  0:07   ` Keshavamurthy Anil S
2006-04-21  0:14   ` Keith Owens
2006-04-21  0:38     ` Keshavamurthy Anil S
2006-04-21  0:53       ` Keith Owens
2006-04-21  1:03         ` Keshavamurthy Anil S
2006-04-20 23:25 ` [(take 2)patch 7/7] Notify page fault call chain Anil S Keshavamurthy
2006-04-24  9:19   ` bibo mao [this message]
2006-04-25  1:10     ` Keith Owens
2006-04-25  5:43       ` Keshavamurthy Anil S
2006-04-24 19:28 ` [(take 2)patch 0/7] " Robin Holt
2006-04-25  6:01   ` Keshavamurthy Anil S
2006-04-25 10:15     ` Robin Holt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=444C9805.4060303@linux.intel.com \
    --to=bibo_mao@linux.intel.com \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=ananth@in.ibm.com \
    --cc=anil.s.keshavamurthy@intel.com \
    --cc=davem@davemloft.net \
    --cc=dnc@americas.sgi.com \
    --cc=kaos@americas.sgi.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=prasanna@in.ibm.com \
    --cc=tony.luck@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.