diff options
author | Sean Hefty <sean.hefty@intel.com> | 2006-10-31 14:12:59 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-11-02 17:26:04 -0500 |
commit | 7a118df3ea23820b9922a1b51cd2f24e464f4c17 (patch) | |
tree | 723e979c84263c52971494b7ba69cbee25f602bc /include | |
parent | 68586b67ab1a2fd618f79e29a06f10ae886f4b46 (diff) |
RDMA/addr: Use client registration to fix module unload race
Require registration with ib_addr module to prevent caller from
unloading while a callback is in progress.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/rdma/ib_addr.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index 81b62307621d..c094e5012862 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
@@ -36,6 +36,22 @@ | |||
36 | #include <linux/socket.h> | 36 | #include <linux/socket.h> |
37 | #include <rdma/ib_verbs.h> | 37 | #include <rdma/ib_verbs.h> |
38 | 38 | ||
39 | struct rdma_addr_client { | ||
40 | atomic_t refcount; | ||
41 | struct completion comp; | ||
42 | }; | ||
43 | |||
44 | /** | ||
45 | * rdma_addr_register_client - Register an address client. | ||
46 | */ | ||
47 | void rdma_addr_register_client(struct rdma_addr_client *client); | ||
48 | |||
49 | /** | ||
50 | * rdma_addr_unregister_client - Deregister an address client. | ||
51 | * @client: Client object to deregister. | ||
52 | */ | ||
53 | void rdma_addr_unregister_client(struct rdma_addr_client *client); | ||
54 | |||
39 | struct rdma_dev_addr { | 55 | struct rdma_dev_addr { |
40 | unsigned char src_dev_addr[MAX_ADDR_LEN]; | 56 | unsigned char src_dev_addr[MAX_ADDR_LEN]; |
41 | unsigned char dst_dev_addr[MAX_ADDR_LEN]; | 57 | unsigned char dst_dev_addr[MAX_ADDR_LEN]; |
@@ -52,6 +68,7 @@ int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr); | |||
52 | /** | 68 | /** |
53 | * rdma_resolve_ip - Resolve source and destination IP addresses to | 69 | * rdma_resolve_ip - Resolve source and destination IP addresses to |
54 | * RDMA hardware addresses. | 70 | * RDMA hardware addresses. |
71 | * @client: Address client associated with request. | ||
55 | * @src_addr: An optional source address to use in the resolution. If a | 72 | * @src_addr: An optional source address to use in the resolution. If a |
56 | * source address is not provided, a usable address will be returned via | 73 | * source address is not provided, a usable address will be returned via |
57 | * the callback. | 74 | * the callback. |
@@ -64,7 +81,8 @@ int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr); | |||
64 | * or been canceled. A status of 0 indicates success. | 81 | * or been canceled. A status of 0 indicates success. |
65 | * @context: User-specified context associated with the call. | 82 | * @context: User-specified context associated with the call. |
66 | */ | 83 | */ |
67 | int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr, | 84 | int rdma_resolve_ip(struct rdma_addr_client *client, |
85 | struct sockaddr *src_addr, struct sockaddr *dst_addr, | ||
68 | struct rdma_dev_addr *addr, int timeout_ms, | 86 | struct rdma_dev_addr *addr, int timeout_ms, |
69 | void (*callback)(int status, struct sockaddr *src_addr, | 87 | void (*callback)(int status, struct sockaddr *src_addr, |
70 | struct rdma_dev_addr *addr, void *context), | 88 | struct rdma_dev_addr *addr, void *context), |