All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Mike Frysinger <vapier.adi@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: David Howells <dhowells@redhat.com>,
	Roland McGrath <roland@redhat.com>,
	linux-sh@vger.kernel.org, Paul Mundt <lethal@linux-sh.org>,
	uclinux-dist-devel@blackfin.uclinux.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH 2/2] blackfin: use ->mmap_sem to protect
Date: Thu, 27 May 2010 19:56:33 +0000	[thread overview]
Message-ID: <20100527195633.GC25935@redhat.com> (raw)
In-Reply-To: <20100527195544.GA25935@redhat.com>

Any usage of mm->context.sram_list is not safe, is_user_addr_valid()
and sram_free_with_lsl/sram_free_with_lsl can race with each other.

Change sram_free_with_lsl/sram_free_with_lsl to take mm->mmap_sem
for writing, is_user_addr_valid() was already modified to take it
for reading and it doesn't modify this list.

destroy_context() reaps this list lockless, this is OK.

This patch assumes that sram_free() doesn't need to be serialized
(afaics it does the locking correctly), and it is safe to call
sram_free(addr) after its sram_list_struct was removed from list.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---

 arch/blackfin/mm/sram-alloc.c |   24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

--- 34-rc1/arch/blackfin/mm/sram-alloc.c~IUAV_2_SRAM_LIST_LOCKING	2010-05-27 17:51:48.000000000 +0200
+++ 34-rc1/arch/blackfin/mm/sram-alloc.c	2010-05-27 21:31:01.000000000 +0200
@@ -702,19 +702,23 @@ EXPORT_SYMBOL(l2_sram_free);
 
 int sram_free_with_lsl(const void *addr)
 {
-	struct sram_list_struct *lsl, **tmp;
+	struct sram_list_struct *lsl = NULL, **tmp;
 	struct mm_struct *mm = current->mm;
 
+	down_write(&mm->mmap_sem);
 	for (tmp = &mm->context.sram_list; *tmp; tmp = &(*tmp)->next)
-		if ((*tmp)->addr = addr)
-			goto found;
-	return -1;
-found:
-	lsl = *tmp;
+		if ((*tmp)->addr = addr) {
+			lsl = *tmp;
+			*tmp = lsl->next;
+			break;
+		}
+	up_write(&mm->mmap_sem);
+
+	if (!lsl)
+		return -1;
+
 	sram_free(addr);
-	*tmp = lsl->next;
 	kfree(lsl);
-
 	return 0;
 }
 EXPORT_SYMBOL(sram_free_with_lsl);
@@ -749,10 +753,14 @@ void *sram_alloc_with_lsl(size_t size, u
 		kfree(lsl);
 		return NULL;
 	}
+
+	down_write(&mm->mmap_sem);
 	lsl->addr = addr;
 	lsl->length = size;
 	lsl->next = mm->context.sram_list;
 	mm->context.sram_list = lsl;
+	up_write(&mm->mmap_sem);
+
 	return addr;
 }
 EXPORT_SYMBOL(sram_alloc_with_lsl);


WARNING: multiple messages have this Message-ID (diff)
From: Oleg Nesterov <oleg@redhat.com>
To: Mike Frysinger <vapier.adi@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: David Howells <dhowells@redhat.com>,
	Roland McGrath <roland@redhat.com>,
	linux-sh@vger.kernel.org, Paul Mundt <lethal@linux-sh.org>,
	uclinux-dist-devel@blackfin.uclinux.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH 2/2] blackfin: use ->mmap_sem to protect mm_context_t->sram_list
Date: Thu, 27 May 2010 21:56:33 +0200	[thread overview]
Message-ID: <20100527195633.GC25935@redhat.com> (raw)
In-Reply-To: <20100527195544.GA25935@redhat.com>

Any usage of mm->context.sram_list is not safe, is_user_addr_valid()
and sram_free_with_lsl/sram_free_with_lsl can race with each other.

Change sram_free_with_lsl/sram_free_with_lsl to take mm->mmap_sem
for writing, is_user_addr_valid() was already modified to take it
for reading and it doesn't modify this list.

destroy_context() reaps this list lockless, this is OK.

This patch assumes that sram_free() doesn't need to be serialized
(afaics it does the locking correctly), and it is safe to call
sram_free(addr) after its sram_list_struct was removed from list.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---

 arch/blackfin/mm/sram-alloc.c |   24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

--- 34-rc1/arch/blackfin/mm/sram-alloc.c~IUAV_2_SRAM_LIST_LOCKING	2010-05-27 17:51:48.000000000 +0200
+++ 34-rc1/arch/blackfin/mm/sram-alloc.c	2010-05-27 21:31:01.000000000 +0200
@@ -702,19 +702,23 @@ EXPORT_SYMBOL(l2_sram_free);
 
 int sram_free_with_lsl(const void *addr)
 {
-	struct sram_list_struct *lsl, **tmp;
+	struct sram_list_struct *lsl = NULL, **tmp;
 	struct mm_struct *mm = current->mm;
 
+	down_write(&mm->mmap_sem);
 	for (tmp = &mm->context.sram_list; *tmp; tmp = &(*tmp)->next)
-		if ((*tmp)->addr == addr)
-			goto found;
-	return -1;
-found:
-	lsl = *tmp;
+		if ((*tmp)->addr == addr) {
+			lsl = *tmp;
+			*tmp = lsl->next;
+			break;
+		}
+	up_write(&mm->mmap_sem);
+
+	if (!lsl)
+		return -1;
+
 	sram_free(addr);
-	*tmp = lsl->next;
 	kfree(lsl);
-
 	return 0;
 }
 EXPORT_SYMBOL(sram_free_with_lsl);
@@ -749,10 +753,14 @@ void *sram_alloc_with_lsl(size_t size, u
 		kfree(lsl);
 		return NULL;
 	}
+
+	down_write(&mm->mmap_sem);
 	lsl->addr = addr;
 	lsl->length = size;
 	lsl->next = mm->context.sram_list;
 	mm->context.sram_list = lsl;
+	up_write(&mm->mmap_sem);
+
 	return addr;
 }
 EXPORT_SYMBOL(sram_alloc_with_lsl);


  parent reply	other threads:[~2010-05-27 19:56 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-11  9:36 [PATCH] ptrace: unify FDPIC implementations Mike Frysinger
2010-02-11  9:36 ` Mike Frysinger
2010-02-11 20:24 ` Roland McGrath
2010-02-11 20:24   ` Roland McGrath
2010-02-11 21:07 ` David Howells
2010-02-11 23:26 ` Paul Mundt
2010-02-11 23:26   ` Paul Mundt
2010-02-16  0:30 ` Mike Frysinger
2010-02-16  0:30   ` Mike Frysinger
2010-02-16  1:10   ` Paul Mundt
2010-02-16  1:10     ` Paul Mundt
2010-02-16  8:12     ` Mike Frysinger
2010-02-16  8:12       ` Mike Frysinger
2010-05-21  8:42   ` [PATCH v2] " Mike Frysinger
2010-05-21  8:42     ` Mike Frysinger
2010-05-21 16:26     ` Oleg Nesterov
2010-05-21 16:26       ` Oleg Nesterov
2010-05-21 18:35       ` Roland McGrath
2010-05-21 18:35         ` Roland McGrath
2010-05-22 14:54         ` [PATCH -mm 0/1] (Was: ptrace: unify FDPIC implementations) Oleg Nesterov
2010-05-22 16:53           ` Oleg Nesterov
2010-05-22 14:55           ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of Oleg Nesterov
2010-05-22 16:54             ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Oleg Nesterov
2010-05-24  4:33             ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix Mike Frysinger
2010-05-24  4:33               ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Mike Frysinger
2010-05-24  8:38             ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of Roland McGrath
2010-05-24  8:38               ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Roland McGrath
2010-05-24 14:36             ` David Howells
2010-05-24 14:36               ` David Howells
2010-05-24 15:14               ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage Oleg Nesterov
2010-05-24 15:14                 ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Oleg Nesterov
2010-05-24 23:42                 ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage Roland McGrath
2010-05-24 23:42                   ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Roland McGrath
2010-05-25  1:29                   ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix Mike Frysinger
2010-05-25  1:29                     ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Mike Frysinger
2010-05-25 19:11                     ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix Roland McGrath
2010-05-25 19:11                       ` [Uclinux-dist-devel] [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Roland McGrath
2010-05-25  9:14                   ` David Howells
2010-05-25  9:14                     ` David Howells
2010-05-25 10:23                     ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage Oleg Nesterov
2010-05-25 10:23                       ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Oleg Nesterov
2010-05-25 12:24                       ` David Howells
2010-05-25 12:24                         ` David Howells
2010-05-25 12:30                         ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage Oleg Nesterov
2010-05-25 12:30                           ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Oleg Nesterov
2010-05-25 17:28                       ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of Mike Frysinger
2010-05-25 17:28                         ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Mike Frysinger
2010-05-26 12:40                         ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage Oleg Nesterov
2010-05-26 12:40                           ` [PATCH -mm 1/1] ptrace: PTRACE_GETFDPIC: fix the unsafe usage of child->mm Oleg Nesterov
2010-05-27 19:55                           ` [PATCH 0/2] blackfin: ptrace mm/sram_list fixes Oleg Nesterov
2010-05-27 19:55                             ` Oleg Nesterov
2010-05-27 19:56                             ` [PATCH 1/2] blackfin: ptrace: fix the unsafe usage of mm/find_vma Oleg Nesterov
2010-05-27 19:56                               ` [PATCH 1/2] blackfin: ptrace: fix the unsafe usage of mm/find_vma in is_user_addr_valid() Oleg Nesterov
2010-05-27 19:56                             ` Oleg Nesterov [this message]
2010-05-27 19:56                               ` [PATCH 2/2] blackfin: use ->mmap_sem to protect mm_context_t->sram_list Oleg Nesterov
2010-05-27 20:21                             ` [PATCH 0/2] blackfin: ptrace mm/sram_list fixes Mike Frysinger
2010-05-27 20:21                               ` Mike Frysinger
2010-05-28 19:43                               ` Oleg Nesterov
2010-05-28 19:43                                 ` Oleg Nesterov

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=20100527195633.GC25935@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=lethal@linux-sh.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=roland@redhat.com \
    --cc=uclinux-dist-devel@blackfin.uclinux.org \
    --cc=vapier.adi@gmail.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.