From: Tatyana E. Nikolova Date: Thu, 2 Jul 2015 19:20:29 +0000 (-0700) Subject: RDMA/iwpm: Updated fixes for the client registration functionality X-Git-Tag: vofed-3.18~1^2~2 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=dcb616d6fe44ec809f6d747b9b70e80d0d80987d;p=compat-rdma%2Fcompat-rdma.git RDMA/iwpm: Updated fixes for the client registration functionality Signed-off-by: Tatyana Nikolova --- diff --git a/linux-next-pending/0004-core-iwpm-client-reg.patch b/linux-next-pending/0004-core-iwpm-client-reg.patch index ac6a774..fd6f9c3 100644 --- a/linux-next-pending/0004-core-iwpm-client-reg.patch +++ b/linux-next-pending/0004-core-iwpm-client-reg.patch @@ -1,37 +1,42 @@ -IWPM_REG_CLIENT and IWPM_PREV_REG_CLIENT are added: +[PATCH 1/1] RDMA/core: Fixes for port mapper client registration -IWPM_REG_CLIENT is a client, registered with the user -space port mapper daemon, available at the time of the -client register pid request. -IWPM_PREV_REG_CLIENT is a client, which has been IWPM_REG_CLIENT -before the user space port mapper daemon is stopped. -After restarting the port mapper, IWPM_PREV_REG_CLIENTs provide -their mapping info to the port mapper daemon and -they are allowed to send remove mapping requests aftewards. +Fixes to allow clients to make remove mapping requests, after +they have provided the user space service with the mapping +information, they are using when the service is restarted. -Signed-off-by: Tatyana Nikolova +1) Adding IWPM_REG_VALID, IWPM_REG_INCOMPL and IWPM_REG_UNDEF + registration types for the port mapper clients and functions + to set/check the registration type. +2) If the port mapper user space service is not available to register + the client, then its registration stays IWPM_REG_UNDEF and the + registration isn't checked until the service becomes available + (no mappings are possible, if the user space service isn't running). +3) After the service is restarted, the user space port mapper pid is set + to valid and the client registration is set to IWPM_REG_INCOMPL + to allow the client to make remove mapping requests. + +Signed-off-by: Tatyana Nikolova --- - drivers/infiniband/core/iwpm_msg.c | 13 +++++++------ - drivers/infiniband/core/iwpm_util.c | 1 + - drivers/infiniband/core/iwpm_util.h | 3 +++ - 3 files changed, 11 insertions(+), 6 deletions(-) + drivers/infiniband/core/iwpm_msg.c | 33 ++++++++++++++++----------------- + drivers/infiniband/core/iwpm_util.c | 12 ++++++++++-- + drivers/infiniband/core/iwpm_util.h | 28 ++++++++++++++++++++++------ + 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/drivers/infiniband/core/iwpm_msg.c b/drivers/infiniband/core/iwpm_msg.c -index ab08170..2aca295 100644 +index e6ffa2e..22a3abe 100644 --- a/drivers/infiniband/core/iwpm_msg.c +++ b/drivers/infiniband/core/iwpm_msg.c -@@ -67,7 +67,9 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) +@@ -67,7 +67,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) err_str = "Invalid port mapper client"; goto pid_query_error; } - if (iwpm_registered_client(nl_client)) -+ if (iwpm_registered_client(nl_client) == IWPM_REG_CLIENT) -+ return 0; -+ if (iwpm_user_pid == IWPM_PID_UNAVAILABLE) ++ if (iwpm_check_registration(nl_client, IWPM_REG_VALID) || ++ iwpm_user_pid == IWPM_PID_UNAVAILABLE) return 0; skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client); if (!skb) { -@@ -106,7 +108,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) +@@ -106,7 +107,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL); if (ret) { skb = NULL; /* skb is freed in the netlink send-op handling */ @@ -39,68 +44,197 @@ index ab08170..2aca295 100644 iwpm_user_pid = IWPM_PID_UNAVAILABLE; err_str = "Unable to send a nlmsg"; goto pid_query_error; -@@ -144,7 +145,7 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) +@@ -144,12 +144,12 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) err_str = "Invalid port mapper client"; goto add_mapping_error; } - if (!iwpm_registered_client(nl_client)) { -+ if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) { ++ if (!iwpm_valid_pid()) ++ return 0; ++ if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) { err_str = "Unregistered port mapper client"; goto add_mapping_error; } -@@ -214,7 +215,7 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) +- if (!iwpm_valid_pid()) +- return 0; + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client); + if (!skb) { + err_str = "Unable to create a nlmsg"; +@@ -214,12 +214,12 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) err_str = "Invalid port mapper client"; goto query_mapping_error; } - if (!iwpm_registered_client(nl_client)) { -+ if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) { ++ if (!iwpm_valid_pid()) ++ return 0; ++ if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) { err_str = "Unregistered port mapper client"; goto query_mapping_error; } -@@ -388,7 +389,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb) +- if (!iwpm_valid_pid()) +- return 0; + ret = -ENOMEM; + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client); + if (!skb) { +@@ -288,12 +288,12 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client) + err_str = "Invalid port mapper client"; + goto remove_mapping_error; + } +- if (!iwpm_registered_client(nl_client)) { ++ if (!iwpm_valid_pid()) ++ return 0; ++ if (iwpm_check_registration(nl_client, IWPM_REG_UNDEF)) { + err_str = "Unregistered port mapper client"; + goto remove_mapping_error; + } +- if (!iwpm_valid_pid()) +- return 0; + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client); + if (!skb) { + ret = -ENOMEM; +@@ -388,7 +388,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb) pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", __func__, iwpm_user_pid); if (iwpm_valid_client(nl_client)) - iwpm_set_registered(nl_client, 1); -+ iwpm_set_registered(nl_client, IWPM_REG_CLIENT); ++ iwpm_set_registration(nl_client, IWPM_REG_VALID); register_pid_response_exit: nlmsg_request->request_done = 1; /* always for found nlmsg_request */ -@@ -669,7 +670,7 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) +@@ -644,7 +644,6 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) + { + struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX]; + const char *msg_type = "Mapping Info response"; +- int iwpm_pid; + u8 nl_client; + char *iwpm_name; + u16 iwpm_version; +@@ -669,14 +668,14 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) __func__, nl_client); return ret; } - iwpm_set_registered(nl_client, 0); -+ iwpm_set_registered(nl_client, IWPM_PREV_REG_CLIENT); ++ iwpm_set_registration(nl_client, IWPM_REG_INCOMPL); atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); ++ iwpm_user_pid = cb->nlh->nlmsg_pid; if (!iwpm_mapinfo_available()) return 0; +- iwpm_pid = cb->nlh->nlmsg_pid; + pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", +- __func__, iwpm_pid); +- ret = iwpm_send_mapinfo(nl_client, iwpm_pid); ++ __func__, iwpm_user_pid); ++ ret = iwpm_send_mapinfo(nl_client, iwpm_user_pid); + return ret; + } + EXPORT_SYMBOL(iwpm_mapping_info_cb); diff --git a/drivers/infiniband/core/iwpm_util.c b/drivers/infiniband/core/iwpm_util.c -index a626795..7a20a1b 100644 +index a626795..5fb089e 100644 --- a/drivers/infiniband/core/iwpm_util.c +++ b/drivers/infiniband/core/iwpm_util.c -@@ -106,6 +106,7 @@ int iwpm_exit(u8 nl_client) +@@ -78,6 +78,7 @@ init_exit: + mutex_unlock(&iwpm_admin_lock); + if (!ret) { + iwpm_set_valid(nl_client, 1); ++ iwpm_set_registration(nl_client, IWPM_REG_UNDEF); + pr_debug("%s: Mapinfo and reminfo tables are created\n", + __func__); + } +@@ -106,6 +107,7 @@ int iwpm_exit(u8 nl_client) } mutex_unlock(&iwpm_admin_lock); iwpm_set_valid(nl_client, 0); -+ iwpm_set_registered(nl_client, 0); ++ iwpm_set_registration(nl_client, IWPM_REG_UNDEF); return 0; } EXPORT_SYMBOL(iwpm_exit); +@@ -397,17 +399,23 @@ void iwpm_set_valid(u8 nl_client, int valid) + } + + /* valid client */ +-int iwpm_registered_client(u8 nl_client) ++u32 iwpm_get_registration(u8 nl_client) + { + return iwpm_admin.reg_list[nl_client]; + } + + /* valid client */ +-void iwpm_set_registered(u8 nl_client, int reg) ++void iwpm_set_registration(u8 nl_client, u32 reg) + { + iwpm_admin.reg_list[nl_client] = reg; + } + ++/* valid client */ ++u32 iwpm_check_registration(u8 nl_client, u32 reg) ++{ ++ return (iwpm_get_registration(nl_client) & reg); ++} ++ + int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, + struct sockaddr_storage *b_sockaddr) + { diff --git a/drivers/infiniband/core/iwpm_util.h b/drivers/infiniband/core/iwpm_util.h -index ee2d9ff..b1dfd1a 100644 +index ee2d9ff..b7b9e19 100644 --- a/drivers/infiniband/core/iwpm_util.h +++ b/drivers/infiniband/core/iwpm_util.h -@@ -58,6 +58,9 @@ +@@ -58,6 +58,10 @@ #define IWPM_PID_UNDEFINED -1 #define IWPM_PID_UNAVAILABLE -2 -+#define IWPM_REG_CLIENT 1 -+#define IWPM_PREV_REG_CLIENT 2 ++#define IWPM_REG_UNDEF 0x01 ++#define IWPM_REG_VALID 0x02 ++#define IWPM_REG_INCOMPL 0x04 + struct iwpm_nlmsg_request { struct list_head inprocess_list; __u32 nlmsg_seq; +@@ -88,7 +92,7 @@ struct iwpm_admin_data { + atomic_t refcount; + atomic_t nlmsg_seq; + int client_list[RDMA_NL_NUM_CLIENTS]; +- int reg_list[RDMA_NL_NUM_CLIENTS]; ++ u32 reg_list[RDMA_NL_NUM_CLIENTS]; + }; + + /** +@@ -159,19 +163,31 @@ int iwpm_valid_client(u8 nl_client); + void iwpm_set_valid(u8 nl_client, int valid); + + /** +- * iwpm_registered_client - Check if the port mapper client is registered ++ * iwpm_check_registration - Check if the client registration ++ * matches the given one + * @nl_client: The index of the netlink client ++ * @reg: The given registration type to compare with + * + * Call iwpm_register_pid() to register a client ++ * Returns true if the client registration matches reg, ++ * otherwise returns false ++ */ ++u32 iwpm_check_registration(u8 nl_client, u32 reg); ++ ++/** ++ * iwpm_set_registration - Set the client registration ++ * @nl_client: The index of the netlink client ++ * @reg: Registration type to set + */ +-int iwpm_registered_client(u8 nl_client); ++void iwpm_set_registration(u8 nl_client, u32 reg); + + /** +- * iwpm_set_registered - Set the port mapper client to registered or not ++ * iwpm_get_registration + * @nl_client: The index of the netlink client +- * @reg: 1 if registered or 0 if not ++ * ++ * Returns the client registration type + */ +-void iwpm_set_registered(u8 nl_client, int reg); ++u32 iwpm_get_registration(u8 nl_client); + + /** + * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of -- 1.7.1