From 462d196d27840d84e1ff686c481fbbd99509864e Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Fri, 19 Jun 2015 23:04:49 +0200 Subject: 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 --- ipc/kdbus/bus.c | 16 ---------------- ipc/kdbus/connection.c | 31 ++++++++++++------------------- ipc/kdbus/message.c | 4 ++-- ipc/kdbus/message.h | 4 ++-- 4 files changed, 16 insertions(+), 39 deletions(-) (limited to 'ipc') 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 -- cgit v1.2.3