aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-02-27 20:04:40 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-27 22:10:18 -0500
commitd0ffce779d667ec0684309797c187846cedab6d4 (patch)
treee9523b0e8c71735bd40af2b60e4e21d959314b24
parent15fc61106a203b4601336cdc2dd9efba259d491e (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.c30
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
260rem_idr:
261 idr_remove(&vrp->endpoints, request);
262free_ept: 256free_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);