From: Stanislav Kinsbursky <skinsbursky@parallels.com>
To: akpm@linux-foundation.org
Cc: Larry.Finger@lwfinger.net, mitsuo.hayasaka.hu@hitachi.com,
nhorman@tuxdriver.com, linux-doc@vger.kernel.org,
catalin.marinas@arm.com, xemul@parallels.com,
will.deacon@arm.com, linux-kernel@vger.kernel.org,
cmetcalf@tilera.com, dhowells@redhat.com, ebiederm@xmission.com,
rob@landley.net, dan@mindstab.net, tglx@linutronix.de,
paulmck@linux.vnet.ibm.com, devel@openvz.org,
mtk.manpages@gmail.com
Subject: [PATCH 5/5] ipc: cleanup do_msgrcv() aroung MSG_COPY feature
Date: Fri, 26 Oct 2012 15:06:17 +0400 [thread overview]
Message-ID: <20121026110617.17494.87320.stgit@localhost.localdomain> (raw)
In-Reply-To: <20121026110103.17494.28182.stgit@localhost.localdomain>
MSG_COPY feature was developed for Checkpoint/Restart In User space project
and thus wrapped in CONFIG_CHECKPOINT_RESTORE macro. But code look a bit ugly.
So this patch is an attempt to cleanup do_msgrcv() a bit and make it looks
better.
Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
---
ipc/msg.c | 79 +++++++++++++++++++++++++++++++++++++------------------------
1 files changed, 48 insertions(+), 31 deletions(-)
diff --git a/ipc/msg.c b/ipc/msg.c
index 91873df..d20ffc7 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -769,6 +769,45 @@ static long do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
return msgsz;
}
+#ifdef CONFIG_CHECKPOINT_RESTORE
+static inline struct msg_msg *fill_copy(unsigned long copy_nr,
+ unsigned long msg_nr,
+ struct msg_msg *msg,
+ struct msg_msg *copy)
+{
+ if (copy_nr == msg_nr)
+ return copy_msg(msg, copy);
+ return NULL;
+}
+
+static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz,
+ int msgflg, long *msgtyp,
+ unsigned long *copy_number)
+{
+ struct msg_msg *copy;
+
+ *copy_number = *msgtyp;
+ *msgtyp = 0;
+ /*
+ * Create dummy message to copy real message to.
+ */
+ copy = load_msg(buf, bufsz);
+ if (!IS_ERR(copy))
+ copy->m_ts = bufsz;
+ return copy;
+}
+
+static inline void free_copy(int msgflg, struct msg_msg *copy)
+{
+ if (msgflg & MSG_COPY)
+ free_msg(copy);
+}
+#else
+#define free_copy(msgflg, copy) do {} while (0)
+#define prepare_copy(buf, sz, msgflg, msgtyp, copy_nr) ERR_PTR(-ENOSYS)
+#define fill_copy(copy_nr, msg_nr, msg, copy) NULL
+#endif
+
long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
int msgflg,
long (*msg_handler)(void __user *, struct msg_msg *, size_t))
@@ -777,38 +816,22 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
struct msg_msg *msg;
int mode;
struct ipc_namespace *ns;
-#ifdef CONFIG_CHECKPOINT_RESTORE
- struct msg_msg *copy = NULL;
- unsigned long copy_number = 0;
-#endif
+ struct msg_msg *copy;
+ unsigned long __maybe_unused copy_number;
if (msqid < 0 || (long) bufsz < 0)
return -EINVAL;
if (msgflg & MSG_COPY) {
-#ifdef CONFIG_CHECKPOINT_RESTORE
- copy_number = msgtyp;
- msgtyp = 0;
-
- /*
- * Create dummy message to copy real message to.
- */
- copy = load_msg(buf, bufsz);
+ copy = prepare_copy(buf, bufsz, msgflg, &msgtyp, ©_number);
if (IS_ERR(copy))
return PTR_ERR(copy);
- copy->m_ts = bufsz;
-#else
- return -ENOSYS;
-#endif
}
mode = convert_mode(&msgtyp, msgflg);
ns = current->nsproxy->ipc_ns;
msq = msg_lock_check(ns, msqid);
if (IS_ERR(msq)) {
-#ifdef CONFIG_CHECKPOINT_RESTORE
- if (msgflg & MSG_COPY)
- free_msg(copy);
-#endif
+ free_copy(msgflg, copy);
return PTR_ERR(msq);
}
@@ -835,13 +858,12 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
if (mode == SEARCH_LESSEQUAL &&
walk_msg->m_type != 1) {
msgtyp = walk_msg->m_type - 1;
-#ifdef CONFIG_CHECKPOINT_RESTORE
} else if (msgflg & MSG_COPY) {
- if (copy_number == msg_counter) {
- msg = copy_msg(walk_msg, copy);
+ msg = fill_copy(copy_number,
+ msg_counter,
+ walk_msg, copy);
+ if (msg)
break;
- }
-#endif
} else
break;
msg_counter++;
@@ -857,10 +879,8 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
msg = ERR_PTR(-E2BIG);
goto out_unlock;
}
-#ifdef CONFIG_CHECKPOINT_RESTORE
if (msgflg & MSG_COPY)
goto out_unlock;
-#endif
list_del(&msg->m_list);
msq->q_qnum--;
msq->q_rtime = get_seconds();
@@ -945,10 +965,7 @@ out_unlock:
}
}
if (IS_ERR(msg)) {
-#ifdef CONFIG_CHECKPOINT_RESTORE
- if (msgflg & MSG_COPY)
- free_msg(copy);
-#endif
+ free_copy(msgflg, copy);
return PTR_ERR(msg);
}
prev parent reply other threads:[~2012-10-26 11:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-26 11:05 [RFC PATCH 0/5] IPC: CRIU enhancements update Stanislav Kinsbursky
2012-10-26 11:05 ` [PATCH 1/5] ipc: wrap new sysctls for CRIU inside CONFIG_CHECKPOINT_RESTORE Stanislav Kinsbursky
2012-10-26 11:06 ` [PATCH 2/5] ipc: remove redundant MSG_COPY check Stanislav Kinsbursky
2012-10-26 11:06 ` [PATCH 3/5] test: IPC message queue copy feature test update Stanislav Kinsbursky
2012-10-26 11:06 ` [PATCH 4/5] Documentation: update sysctl/kernel.txt Stanislav Kinsbursky
2012-10-26 11:06 ` Stanislav Kinsbursky [this message]
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=20121026110617.17494.87320.stgit@localhost.localdomain \
--to=skinsbursky@parallels.com \
--cc=Larry.Finger@lwfinger.net \
--cc=akpm@linux-foundation.org \
--cc=catalin.marinas@arm.com \
--cc=cmetcalf@tilera.com \
--cc=dan@mindstab.net \
--cc=devel@openvz.org \
--cc=dhowells@redhat.com \
--cc=ebiederm@xmission.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mitsuo.hayasaka.hu@hitachi.com \
--cc=mtk.manpages@gmail.com \
--cc=nhorman@tuxdriver.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=rob@landley.net \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.com \
--cc=xemul@parallels.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