aboutsummaryrefslogtreecommitdiff
path: root/ipc
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2015-06-19 23:04:49 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2015-07-06 18:11:04 +0200
commit462d196d27840d84e1ff686c481fbbd99509864e (patch)
tree13e277e88cf1e3c4f196d1e263c23365c9361c72 /ipc
parent5347bdd081c75f847c9739fc50e43f71440687bb (diff)
kdbus: simplify collecting metadata on messages
Instead of collecting metadata on the call-side for each message origin, move it to the core: Handle it directly before allocating the message slice. The number of times we call into the helper stays exactly the same, but the code paths are reduced significantly. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/kdbus/bus.c16
-rw-r--r--ipc/kdbus/connection.c31
-rw-r--r--ipc/kdbus/message.c4
-rw-r--r--ipc/kdbus/message.h4
4 files changed, 16 insertions, 39 deletions
diff --git a/ipc/kdbus/bus.c b/ipc/kdbus/bus.c
index 16f69acfec8a..bc3c3c0383cb 100644
--- a/ipc/kdbus/bus.c
+++ b/ipc/kdbus/bus.c
@@ -284,13 +284,6 @@ void kdbus_bus_broadcast(struct kdbus_bus *bus,
*/
if (!kdbus_conn_policy_talk(conn_dst, NULL, conn_src))
continue;
-
- ret = kdbus_kmsg_collect_metadata(kmsg, conn_src,
- conn_dst);
- if (ret < 0) {
- kdbus_conn_lost_message(conn_dst);
- continue;
- }
} else {
/*
* Check if there is a policy db that prevents the
@@ -338,15 +331,6 @@ void kdbus_bus_eavesdrop(struct kdbus_bus *bus,
down_read(&bus->conn_rwlock);
list_for_each_entry(conn_dst, &bus->monitors_list, monitor_entry) {
- if (conn_src) {
- ret = kdbus_kmsg_collect_metadata(kmsg, conn_src,
- conn_dst);
- if (ret < 0) {
- kdbus_conn_lost_message(conn_dst);
- continue;
- }
- }
-
ret = kdbus_conn_entry_insert(conn_src, conn_dst, kmsg, NULL,
NULL);
if (ret < 0)
diff --git a/ipc/kdbus/connection.c b/ipc/kdbus/connection.c
index 2ce63ccca3b4..25e49455b24b 100644
--- a/ipc/kdbus/connection.c
+++ b/ipc/kdbus/connection.c
@@ -813,7 +813,12 @@ static int kdbus_conn_entry_sync_attach(struct kdbus_conn *conn_dst,
{
struct kdbus_queue_entry *entry;
int remote_ret;
- int ret = 0;
+ int ret;
+
+ ret = kdbus_kmsg_collect_metadata(kmsg, reply_wake->reply_src,
+ conn_dst);
+ if (ret < 0)
+ return ret;
mutex_lock(&reply_wake->reply_dst->lock);
@@ -879,6 +884,12 @@ int kdbus_conn_entry_insert(struct kdbus_conn *conn_src,
struct kdbus_queue_entry *entry;
int ret;
+ if (conn_src) {
+ ret = kdbus_kmsg_collect_metadata(kmsg, conn_src, conn_dst);
+ if (ret < 0)
+ return ret;
+ }
+
kdbus_conn_lock2(conn_src, conn_dst);
entry = kdbus_conn_entry_make(conn_src, conn_dst, kmsg);
@@ -1132,12 +1143,6 @@ static int kdbus_conn_reply(struct kdbus_conn *src, struct kdbus_kmsg *kmsg)
goto exit;
}
- /* attach metadata */
-
- ret = kdbus_kmsg_collect_metadata(kmsg, src, dst);
- if (ret < 0)
- goto exit;
-
/* send message */
kdbus_bus_eavesdrop(bus, src, kmsg);
@@ -1210,12 +1215,6 @@ static struct kdbus_reply *kdbus_conn_call(struct kdbus_conn *src,
goto exit;
}
- /* attach metadata */
-
- ret = kdbus_kmsg_collect_metadata(kmsg, src, dst);
- if (ret < 0)
- goto exit;
-
/* send message */
kdbus_bus_eavesdrop(bus, src, kmsg);
@@ -1279,12 +1278,6 @@ static int kdbus_conn_unicast(struct kdbus_conn *src, struct kdbus_kmsg *kmsg)
}
}
- /* attach metadata */
-
- ret = kdbus_kmsg_collect_metadata(kmsg, src, dst);
- if (ret < 0)
- goto exit;
-
/* send message */
if (!is_signal)
diff --git a/ipc/kdbus/message.c b/ipc/kdbus/message.c
index 974e8c4f6039..9346a04e10ef 100644
--- a/ipc/kdbus/message.c
+++ b/ipc/kdbus/message.c
@@ -619,8 +619,8 @@ exit_free:
*
* Return: 0 on success, negative error code on failure.
*/
-int kdbus_kmsg_collect_metadata(struct kdbus_kmsg *kmsg, struct kdbus_conn *src,
- struct kdbus_conn *dst)
+int kdbus_kmsg_collect_metadata(const struct kdbus_kmsg *kmsg,
+ struct kdbus_conn *src, struct kdbus_conn *dst)
{
u64 attach;
int ret;
diff --git a/ipc/kdbus/message.h b/ipc/kdbus/message.h
index 88e2366e49b6..9a11389d9f27 100644
--- a/ipc/kdbus/message.h
+++ b/ipc/kdbus/message.h
@@ -125,7 +125,7 @@ struct kdbus_kmsg *kdbus_kmsg_new(struct kdbus_bus *bus, size_t extra_size);
struct kdbus_kmsg *kdbus_kmsg_new_from_cmd(struct kdbus_conn *conn,
struct kdbus_cmd_send *cmd_send);
void kdbus_kmsg_free(struct kdbus_kmsg *kmsg);
-int kdbus_kmsg_collect_metadata(struct kdbus_kmsg *kmsg, struct kdbus_conn *src,
- struct kdbus_conn *dst);
+int kdbus_kmsg_collect_metadata(const struct kdbus_kmsg *kmsg,
+ struct kdbus_conn *src, struct kdbus_conn *dst);
#endif