All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
To: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
	hch@infradead.org, prasanna@in.ibm.com,
	anil.s.keshavamurthy@intel.com, davem@davemloft.net
Subject: Re: [patch 02/11] Kprobes - use a mutex to protect the instruction pages list.
Date: Tue, 21 Aug 2007 09:46:30 +0530	[thread overview]
Message-ID: <20070821041630.GA9226@in.ibm.com> (raw)
In-Reply-To: <20070820202145.502198525@polymtl.ca>

On Mon, Aug 20, 2007 at 04:19:04PM -0400, Mathieu Desnoyers wrote:
> Protect the instruction pages list by a specific insn pages mutex, called in 
> get_insn_slot() and free_insn_slot(). It makes sure that architectures that does
> not need to call arch_remove_kprobe() does not take an unneeded kprobes mutex.
> 
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>

Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>

Thanks Mathieu.

> CC: hch@infradead.org
> CC: prasanna@in.ibm.com
> CC: ananth@in.ibm.com
> CC: anil.s.keshavamurthy@intel.com
> CC: davem@davemloft.net
> ---
>  kernel/kprobes.c |   27 +++++++++++++++++++++------
>  1 file changed, 21 insertions(+), 6 deletions(-)
> 
> Index: linux-2.6-lttng/kernel/kprobes.c
> ===================================================================
> --- linux-2.6-lttng.orig/kernel/kprobes.c	2007-07-14 15:47:19.000000000 -0400
> +++ linux-2.6-lttng/kernel/kprobes.c	2007-07-14 15:48:51.000000000 -0400
> @@ -101,6 +101,10 @@ enum kprobe_slot_state {
>  	SLOT_USED = 2,
>  };
> 
> +/*
> + * Protects the kprobe_insn_pages list. Can nest into kprobe_mutex.
> + */
> +static DEFINE_MUTEX(kprobe_insn_mutex);
>  static struct hlist_head kprobe_insn_pages;
>  static int kprobe_garbage_slots;
>  static int collect_garbage_slots(void);
> @@ -137,7 +141,9 @@ kprobe_opcode_t __kprobes *get_insn_slot
>  {
>  	struct kprobe_insn_page *kip;
>  	struct hlist_node *pos;
> +	kprobe_opcode_t *ret;
> 
> +	mutex_lock(&kprobe_insn_mutex);
>   retry:
>  	hlist_for_each_entry(kip, pos, &kprobe_insn_pages, hlist) {
>  		if (kip->nused < INSNS_PER_PAGE) {
> @@ -146,7 +152,8 @@ kprobe_opcode_t __kprobes *get_insn_slot
>  				if (kip->slot_used[i] == SLOT_CLEAN) {
>  					kip->slot_used[i] = SLOT_USED;
>  					kip->nused++;
> -					return kip->insns + (i * MAX_INSN_SIZE);
> +					ret = kip->insns + (i * MAX_INSN_SIZE);
> +					goto end;
>  				}
>  			}
>  			/* Surprise!  No unused slots.  Fix kip->nused. */
> @@ -160,8 +167,10 @@ kprobe_opcode_t __kprobes *get_insn_slot
>  	}
>  	/* All out of space.  Need to allocate a new page. Use slot 0. */
>  	kip = kmalloc(sizeof(struct kprobe_insn_page), GFP_KERNEL);
> -	if (!kip)
> -		return NULL;
> +	if (!kip) {
> +		ret = NULL;
> +		goto end;
> +	}
> 
>  	/*
>  	 * Use module_alloc so this page is within +/- 2GB of where the
> @@ -171,7 +180,8 @@ kprobe_opcode_t __kprobes *get_insn_slot
>  	kip->insns = module_alloc(PAGE_SIZE);
>  	if (!kip->insns) {
>  		kfree(kip);
> -		return NULL;
> +		ret = NULL;
> +		goto end;
>  	}
>  	INIT_HLIST_NODE(&kip->hlist);
>  	hlist_add_head(&kip->hlist, &kprobe_insn_pages);
> @@ -179,7 +189,10 @@ kprobe_opcode_t __kprobes *get_insn_slot
>  	kip->slot_used[0] = SLOT_USED;
>  	kip->nused = 1;
>  	kip->ngarbage = 0;
> -	return kip->insns;
> +	ret = kip->insns;
> +end:
> +	mutex_unlock(&kprobe_insn_mutex);
> +	return ret;
>  }
> 
>  /* Return 1 if all garbages are collected, otherwise 0. */
> @@ -213,7 +226,7 @@ static int __kprobes collect_garbage_slo
>  	struct kprobe_insn_page *kip;
>  	struct hlist_node *pos, *next;
> 
> -	/* Ensure no-one is preepmted on the garbages */
> +	/* Ensure no-one is preempted on the garbages */
>  	if (check_safety() != 0)
>  		return -EAGAIN;
> 
> @@ -237,6 +250,7 @@ void __kprobes free_insn_slot(kprobe_opc
>  	struct kprobe_insn_page *kip;
>  	struct hlist_node *pos;
> 
> +	mutex_lock(&kprobe_insn_mutex);
>  	hlist_for_each_entry(kip, pos, &kprobe_insn_pages, hlist) {
>  		if (kip->insns <= slot &&
>  		    slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE)) {
> @@ -253,6 +267,7 @@ void __kprobes free_insn_slot(kprobe_opc
> 
>  	if (dirty && ++kprobe_garbage_slots > INSNS_PER_PAGE)
>  		collect_garbage_slots();
> +	mutex_unlock(&kprobe_insn_mutex);
>  }
>  #endif
> 
> 
> -- 
> Mathieu Desnoyers
> Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
> OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

  reply	other threads:[~2007-08-21  4:17 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-20 20:19 [patch 00/11] Text Edit Lock / text poke Mathieu Desnoyers
2007-08-20 20:19 ` [patch 01/11] Fall back on interrupt disable in cmpxchg8b on 80386 and 80486 Mathieu Desnoyers
2007-08-20 20:38   ` Mathieu Desnoyers
2007-08-20 20:19 ` [patch 02/11] Kprobes - use a mutex to protect the instruction pages list Mathieu Desnoyers
2007-08-21  4:16   ` Ananth N Mavinakayanahalli [this message]
2007-08-20 20:19 ` [patch 03/11] Kprobes - do not use kprobes mutex in arch code Mathieu Desnoyers
2007-08-21  4:17   ` Ananth N Mavinakayanahalli
2007-08-20 20:19 ` [patch 04/11] Kprobes - declare kprobe_mutex static Mathieu Desnoyers
2007-08-21  4:17   ` Ananth N Mavinakayanahalli
2007-08-20 20:19 ` [patch 05/11] Text Edit Lock - Architecture Independent Code Mathieu Desnoyers
2007-08-20 20:19 ` [patch 06/11] Text Edit Lock - Alternative code for i386 and x86_64 Mathieu Desnoyers
2007-08-20 20:19 ` [patch 07/11] Text Edit Lock - kprobes architecture independent support Mathieu Desnoyers
2007-08-20 20:19 ` [patch 08/11] Text Edit Lock - kprobes i386 Mathieu Desnoyers
2007-08-20 20:19 ` [patch 09/11] Text Edit Lock - kprobes x86_64 Mathieu Desnoyers
2007-08-20 20:19 ` [patch 10/11] Text Edit Lock - i386 standardize debug rodata Mathieu Desnoyers
2007-08-20 20:19 ` [patch 11/11] Text Edit Lock - x86_64 " Mathieu Desnoyers

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=20070821041630.GA9226@in.ibm.com \
    --to=ananth@in.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=anil.s.keshavamurthy@intel.com \
    --cc=davem@davemloft.net \
    --cc=hch@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@polymtl.ca \
    --cc=prasanna@in.ibm.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.