diff options
author | Tejun Heo <tj@kernel.org> | 2013-02-27 20:04:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-27 22:10:18 -0500 |
commit | d0ffce779d667ec0684309797c187846cedab6d4 (patch) | |
tree | e9523b0e8c71735bd40af2b60e4e21d959314b24 | |
parent | 15fc61106a203b4601336cdc2dd9efba259d491e (diff) |
rpmsg: convert to idr_alloc()
Convert to the much saner new idr interface.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/rpmsg/virtio_rpmsg_bus.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index aaa6840ee05b..a59684b5fc68 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c | |||
@@ -213,13 +213,10 @@ static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, | |||
213 | struct rpmsg_channel *rpdev, rpmsg_rx_cb_t cb, | 213 | struct rpmsg_channel *rpdev, rpmsg_rx_cb_t cb, |
214 | void *priv, u32 addr) | 214 | void *priv, u32 addr) |
215 | { | 215 | { |
216 | int err, tmpaddr, request; | 216 | int id_min, id_max, id; |
217 | struct rpmsg_endpoint *ept; | 217 | struct rpmsg_endpoint *ept; |
218 | struct device *dev = rpdev ? &rpdev->dev : &vrp->vdev->dev; | 218 | struct device *dev = rpdev ? &rpdev->dev : &vrp->vdev->dev; |
219 | 219 | ||
220 | if (!idr_pre_get(&vrp->endpoints, GFP_KERNEL)) | ||
221 | return NULL; | ||
222 | |||
223 | ept = kzalloc(sizeof(*ept), GFP_KERNEL); | 220 | ept = kzalloc(sizeof(*ept), GFP_KERNEL); |
224 | if (!ept) { | 221 | if (!ept) { |
225 | dev_err(dev, "failed to kzalloc a new ept\n"); | 222 | dev_err(dev, "failed to kzalloc a new ept\n"); |
@@ -234,31 +231,28 @@ static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, | |||
234 | ept->priv = priv; | 231 | ept->priv = priv; |
235 | 232 | ||
236 | /* do we need to allocate a local address ? */ | 233 | /* do we need to allocate a local address ? */ |
237 | request = addr == RPMSG_ADDR_ANY ? RPMSG_RESERVED_ADDRESSES : addr; | 234 | if (addr == RPMSG_ADDR_ANY) { |
235 | id_min = RPMSG_RESERVED_ADDRESSES; | ||
236 | id_max = 0; | ||
237 | } else { | ||
238 | id_min = addr; | ||
239 | id_max = addr + 1; | ||
240 | } | ||
238 | 241 | ||
239 | mutex_lock(&vrp->endpoints_lock); | 242 | mutex_lock(&vrp->endpoints_lock); |
240 | 243 | ||
241 | /* bind the endpoint to an rpmsg address (and allocate one if needed) */ | 244 | /* bind the endpoint to an rpmsg address (and allocate one if needed) */ |
242 | err = idr_get_new_above(&vrp->endpoints, ept, request, &tmpaddr); | 245 | id = idr_alloc(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL); |
243 | if (err) { | 246 | if (id < 0) { |
244 | dev_err(dev, "idr_get_new_above failed: %d\n", err); | 247 | dev_err(dev, "idr_alloc failed: %d\n", id); |
245 | goto free_ept; | 248 | goto free_ept; |
246 | } | 249 | } |
247 | 250 | ept->addr = id; | |
248 | /* make sure the user's address request is fulfilled, if relevant */ | ||
249 | if (addr != RPMSG_ADDR_ANY && tmpaddr != addr) { | ||
250 | dev_err(dev, "address 0x%x already in use\n", addr); | ||
251 | goto rem_idr; | ||
252 | } | ||
253 | |||
254 | ept->addr = tmpaddr; | ||
255 | 251 | ||
256 | mutex_unlock(&vrp->endpoints_lock); | 252 | mutex_unlock(&vrp->endpoints_lock); |
257 | 253 | ||
258 | return ept; | 254 | return ept; |
259 | 255 | ||
260 | rem_idr: | ||
261 | idr_remove(&vrp->endpoints, request); | ||
262 | free_ept: | 256 | free_ept: |
263 | mutex_unlock(&vrp->endpoints_lock); | 257 | mutex_unlock(&vrp->endpoints_lock); |
264 | kref_put(&ept->refcount, __ept_release); | 258 | kref_put(&ept->refcount, __ept_release); |