From: Davidlohr Bueso <davidlohr.bueso@hp.com>
To: akpm@linux-foundation.org, riel@redhat.com,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Cc: Davidlohr Bueso <davidlohr.bueso@hp.com>
Subject: [PATCH 05/11] ipc,shm: make shmctl_nolock lockless
Date: Tue, 18 Jun 2013 18:18:30 -0700 [thread overview]
Message-ID: <1371604716-3439-6-git-send-email-davidlohr.bueso@hp.com> (raw)
In-Reply-To: <1371604716-3439-1-git-send-email-davidlohr.bueso@hp.com>
While the INFO cmd doesn't take the ipc lock, the STAT commands do acquire
it unnecessarily. We can do the permissions and security checks only
holding the rcu lock.
Signed-off-by: Davidlohr Bueso <davidlohr.bueso@hp.com>
---
ipc/shm.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/ipc/shm.c b/ipc/shm.c
index 3e12398..43a8786 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -882,27 +882,31 @@ static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
struct shmid64_ds tbuf;
int result;
+ rcu_read_lock();
if (cmd == SHM_STAT) {
- shp = shm_lock(ns, shmid);
+ shp = shm_obtain_object(ns, shmid);
if (IS_ERR(shp)) {
err = PTR_ERR(shp);
- goto out;
+ goto out_unlock;
}
result = shp->shm_perm.id;
} else {
- shp = shm_lock_check(ns, shmid);
+ shp = shm_obtain_object_check(ns, shmid);
if (IS_ERR(shp)) {
err = PTR_ERR(shp);
- goto out;
+ goto out_unlock;
}
result = 0;
}
+
err = -EACCES;
if (ipcperms(ns, &shp->shm_perm, S_IRUGO))
goto out_unlock;
+
err = security_shm_shmctl(shp, cmd);
if (err)
goto out_unlock;
+
memset(&tbuf, 0, sizeof(tbuf));
kernel_to_ipc64_perm(&shp->shm_perm, &tbuf.shm_perm);
tbuf.shm_segsz = shp->shm_segsz;
@@ -912,8 +916,9 @@ static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
tbuf.shm_cpid = shp->shm_cprid;
tbuf.shm_lpid = shp->shm_lprid;
tbuf.shm_nattch = shp->shm_nattch;
- shm_unlock(shp);
- if(copy_shmid_to_user (buf, &tbuf, version))
+ rcu_read_unlock();
+
+ if (copy_shmid_to_user (buf, &tbuf, version))
err = -EFAULT;
else
err = result;
@@ -924,7 +929,7 @@ static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
}
out_unlock:
- shm_unlock(shp);
+ rcu_read_unlock();
out:
return err;
}
--
1.7.11.7
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2013-06-19 1:18 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-19 1:18 [PATCH 00/11] sysv ipc shared mem optimizations Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 01/11] ipc,shm: introduce lockless functions to obtain the ipc object Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 02/11] ipc,shm: shorten critical region in shmctl_down Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 03/11] ipc: drop ipcctl_pre_down Davidlohr Bueso
2013-07-16 22:49 ` Andrew Morton
2013-06-19 1:18 ` [PATCH 04/11] ipc,shm: introduce shmctl_nolock Davidlohr Bueso
2013-06-19 1:18 ` Davidlohr Bueso [this message]
2013-06-19 1:18 ` [PATCH 06/11] ipc,shm: shorten critical region for shmctl Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 07/11] ipc,shm: cleanup do_shmat pasta Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 08/11] ipc,shm: shorten critical region for shmat Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 09/11] ipc: rename ids->rw_mutex Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 10/11] ipc,msg: drop msg_unlock Davidlohr Bueso
2013-06-19 1:18 ` [PATCH 11/11] ipc: document general ipc locking scheme Davidlohr Bueso
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=1371604716-3439-6-git-send-email-davidlohr.bueso@hp.com \
--to=davidlohr.bueso@hp.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=riel@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox