msm: ipc: Update server lookup to multiple compatible services
IPC Router looks up all compatible services during the server
lookup using the compatibility mask provided by the clients.
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
diff --git a/arch/arm/mach-msm/ipc_router.c b/arch/arm/mach-msm/ipc_router.c
index 70393e4..ea9d246 100644
--- a/arch/arm/mach-msm/ipc_router.c
+++ b/arch/arm/mach-msm/ipc_router.c
@@ -2001,11 +2001,12 @@
int msm_ipc_router_lookup_server_name(struct msm_ipc_port_name *srv_name,
struct msm_ipc_port_addr *srv_addr,
- int num_entries_in_array)
+ int num_entries_in_array,
+ uint32_t lookup_mask)
{
struct msm_ipc_server *server;
struct msm_ipc_server_port *server_port;
- int i = 0; /*num_entries_found*/
+ int key, i = 0; /*num_entries_found*/
if (!srv_name) {
pr_err("%s: Invalid srv_name\n", __func__);
@@ -2017,18 +2018,27 @@
return -EINVAL;
}
- server = msm_ipc_router_lookup_server(srv_name->service,
- srv_name->instance, 0, 0);
- if (!server)
- return -ENODEV;
-
mutex_lock(&server_list_lock);
- list_for_each_entry(server_port, &server->server_port_list, list) {
- if (i < num_entries_in_array) {
- srv_addr[i].node_id = server_port->server_addr.node_id;
- srv_addr[i].port_id = server_port->server_addr.port_id;
+ if (!lookup_mask)
+ lookup_mask = 0xFFFFFFFF;
+ for (key = 0; key < SRV_HASH_SIZE; key++) {
+ list_for_each_entry(server, &server_list[key], list) {
+ if ((server->name.service != srv_name->service) ||
+ ((server->name.instance & lookup_mask) !=
+ srv_name->instance))
+ continue;
+
+ list_for_each_entry(server_port,
+ &server->server_port_list, list) {
+ if (i < num_entries_in_array) {
+ srv_addr[i].node_id =
+ server_port->server_addr.node_id;
+ srv_addr[i].port_id =
+ server_port->server_addr.port_id;
+ }
+ i++;
+ }
}
- i++;
}
mutex_unlock(&server_list_lock);
diff --git a/arch/arm/mach-msm/ipc_router.h b/arch/arm/mach-msm/ipc_router.h
index d058e9b..b125185 100644
--- a/arch/arm/mach-msm/ipc_router.h
+++ b/arch/arm/mach-msm/ipc_router.h
@@ -182,7 +182,8 @@
int msm_ipc_router_bind_control_port(struct msm_ipc_port *port_ptr);
int msm_ipc_router_lookup_server_name(struct msm_ipc_port_name *srv_name,
struct msm_ipc_port_addr *port_addr,
- int num_entries_in_array);
+ int num_entries_in_array,
+ uint32_t lookup_mask);
int msm_ipc_router_close_port(struct msm_ipc_port *port_ptr);
struct msm_ipc_port *msm_ipc_router_create_port(
diff --git a/arch/arm/mach-msm/ipc_socket.c b/arch/arm/mach-msm/ipc_socket.c
index 132f2a9..467c2c2 100644
--- a/arch/arm/mach-msm/ipc_socket.c
+++ b/arch/arm/mach-msm/ipc_socket.c
@@ -431,7 +431,8 @@
}
}
ret = msm_ipc_router_lookup_server_name(&server_arg.port_name,
- port_addr, server_arg.num_entries_in_array);
+ port_addr, server_arg.num_entries_in_array,
+ server_arg.lookup_mask);
if (ret < 0) {
pr_err("%s: Server not found\n", __func__);
ret = -ENODEV;
diff --git a/include/linux/msm_ipc.h b/include/linux/msm_ipc.h
index 19cb82e..82f76a6 100644
--- a/include/linux/msm_ipc.h
+++ b/include/linux/msm_ipc.h
@@ -66,6 +66,7 @@
struct msm_ipc_port_name port_name;
int num_entries_in_array;
int num_entries_found;
+ uint32_t lookup_mask;
struct msm_ipc_port_addr port_addr[0];
};