This is a note to let you know that I've just added the patch titled
ipc,shm: introduce shmctl_nolock
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ipc-shm-introduce-shmctl_nolock.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.
>From 68eccc1dc345539d589ae78ee43b835c1a06a134 Mon Sep 17 00:00:00 2001
From: Davidlohr Bueso <[email protected]>
Date: Wed, 11 Sep 2013 14:26:18 -0700
Subject: ipc,shm: introduce shmctl_nolock
From: Davidlohr Bueso <[email protected]>
commit 68eccc1dc345539d589ae78ee43b835c1a06a134 upstream.
Similar to semctl and msgctl, when calling msgctl, the *_INFO and *_STAT
commands can be performed without acquiring the ipc object.
Add a shmctl_nolock() function and move the logic of *_INFO and *_STAT out
of msgctl(). Since we are just moving functionality, this change still
takes the lock and it will be properly lockless in the next patch.
Signed-off-by: Davidlohr Bueso <[email protected]>
Tested-by: Sedat Dilek <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Manfred Spraul <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Cc: Mike Galbraith <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
ipc/shm.c | 57 +++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 39 insertions(+), 18 deletions(-)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -820,29 +820,24 @@ out_up:
return err;
}
-SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
+static int shmctl_nolock(struct ipc_namespace *ns, int shmid,
+ int cmd, int version, void __user *buf)
{
+ int err;
struct shmid_kernel *shp;
- int err, version;
- struct ipc_namespace *ns;
- if (cmd < 0 || shmid < 0) {
- err = -EINVAL;
- goto out;
+ /* preliminary security checks for *_INFO */
+ if (cmd == IPC_INFO || cmd == SHM_INFO) {
+ err = security_shm_shmctl(NULL, cmd);
+ if (err)
+ return err;
}
- version = ipc_parse_version(&cmd);
- ns = current->nsproxy->ipc_ns;
-
- switch (cmd) { /* replace with proc interface ? */
+ switch (cmd) {
case IPC_INFO:
{
struct shminfo64 shminfo;
- err = security_shm_shmctl(NULL, cmd);
- if (err)
- return err;
-
memset(&shminfo, 0, sizeof(shminfo));
shminfo.shmmni = shminfo.shmseg = ns->shm_ctlmni;
shminfo.shmmax = ns->shm_ctlmax;
@@ -864,10 +859,6 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int,
{
struct shm_info shm_info;
- err = security_shm_shmctl(NULL, cmd);
- if (err)
- return err;
-
memset(&shm_info, 0, sizeof(shm_info));
down_read(&shm_ids(ns).rw_mutex);
shm_info.used_ids = shm_ids(ns).in_use;
@@ -928,6 +919,36 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int,
err = result;
goto out;
}
+ default:
+ return -EINVAL;
+ }
+
+out_unlock:
+ shm_unlock(shp);
+out:
+ return err;
+}
+
+SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
+{
+ struct shmid_kernel *shp;
+ int err, version;
+ struct ipc_namespace *ns;
+
+ if (cmd < 0 || shmid < 0) {
+ err = -EINVAL;
+ goto out;
+ }
+
+ version = ipc_parse_version(&cmd);
+ ns = current->nsproxy->ipc_ns;
+
+ switch (cmd) {
+ case IPC_INFO:
+ case SHM_INFO:
+ case SHM_STAT:
+ case IPC_STAT:
+ return shmctl_nolock(ns, shmid, cmd, version, buf);
case SHM_LOCK:
case SHM_UNLOCK:
{
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/ipc-shm-shorten-critical-region-in-shmctl_down.patch
queue-3.10/ipc-msg-introduce-lockless-functions-to-obtain-the-ipc-object.patch
queue-3.10/ipc-msg-shorten-critical-region-in-msgctl_down.patch
queue-3.10/ipc-shm-introduce-lockless-functions-to-obtain-the-ipc-object.patch
queue-3.10/ipc-remove-unused-functions.patch
queue-3.10/ipc-shm-shorten-critical-region-for-shmat.patch
queue-3.10/ipc-msg-introduce-msgctl_nolock.patch
queue-3.10/ipc-move-rcu-lock-out-of-ipc_addid.patch
queue-3.10/ipc-sem-separate-wait-for-zero-and-alter-tasks-into-seperate-queues.patch
queue-3.10/ipc-shm-shorten-critical-region-for-shmctl.patch
queue-3.10/ipc-msg-shorten-critical-region-in-msgsnd.patch
queue-3.10/ipc-shm-introduce-shmctl_nolock.patch
queue-3.10/ipc-drop-ipcctl_pre_down.patch
queue-3.10/ipc-util.c-ipc_rcu_alloc-cacheline-align-allocation.patch
queue-3.10/ipc-introduce-ipc-object-locking-helpers.patch
queue-3.10/ipc-sem.c-cacheline-align-the-semaphore-structures.patch
queue-3.10/ipc-msg-shorten-critical-region-in-msgrcv.patch
queue-3.10/ipc-msg-make-msgctl_nolock-lockless.patch
queue-3.10/ipc-sem.c-always-use-only-one-queue-for-alter-operations.patch
queue-3.10/ipc-shm-cleanup-do_shmat-pasta.patch
queue-3.10/ipc-move-locking-out-of-ipcctl_pre_down_nolock.patch
queue-3.10/ipc-close-open-coded-spin-lock-calls.patch
queue-3.10/ipc-sem.c-rename-try_atomic_semop-to-perform_atomic_semop-docu-update.patch
queue-3.10/ipc-shm-make-shmctl_nolock-lockless.patch
queue-3.10/ipc-sem.c-replace-shared-sem_otime-with-per-semaphore-value.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html