.. | .. |
---|
247 | 247 | dma_buf_put(map->buf); |
---|
248 | 248 | } |
---|
249 | 249 | |
---|
| 250 | + if (map->fl) { |
---|
| 251 | + spin_lock(&map->fl->lock); |
---|
| 252 | + list_del(&map->node); |
---|
| 253 | + spin_unlock(&map->fl->lock); |
---|
| 254 | + map->fl = NULL; |
---|
| 255 | + } |
---|
| 256 | + |
---|
250 | 257 | kfree(map); |
---|
251 | 258 | } |
---|
252 | 259 | |
---|
.. | .. |
---|
256 | 263 | kref_put(&map->refcount, fastrpc_free_map); |
---|
257 | 264 | } |
---|
258 | 265 | |
---|
259 | | -static void fastrpc_map_get(struct fastrpc_map *map) |
---|
| 266 | +static int fastrpc_map_get(struct fastrpc_map *map) |
---|
260 | 267 | { |
---|
261 | | - if (map) |
---|
262 | | - kref_get(&map->refcount); |
---|
| 268 | + if (!map) |
---|
| 269 | + return -ENOENT; |
---|
| 270 | + |
---|
| 271 | + return kref_get_unless_zero(&map->refcount) ? 0 : -ENOENT; |
---|
263 | 272 | } |
---|
264 | 273 | |
---|
265 | 274 | static int fastrpc_map_find(struct fastrpc_user *fl, int fd, |
---|
.. | .. |
---|
1097 | 1106 | |
---|
1098 | 1107 | sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE, 4, 0); |
---|
1099 | 1108 | if (init.attrs) |
---|
1100 | | - sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 6, 0); |
---|
| 1109 | + sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 4, 0); |
---|
1101 | 1110 | |
---|
1102 | 1111 | err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, |
---|
1103 | 1112 | sc, args); |
---|
.. | .. |
---|
1112 | 1121 | fl->init_mem = NULL; |
---|
1113 | 1122 | fastrpc_buf_free(imem); |
---|
1114 | 1123 | err_alloc: |
---|
1115 | | - if (map) { |
---|
1116 | | - spin_lock(&fl->lock); |
---|
1117 | | - list_del(&map->node); |
---|
1118 | | - spin_unlock(&fl->lock); |
---|
1119 | | - fastrpc_map_put(map); |
---|
1120 | | - } |
---|
| 1124 | + fastrpc_map_put(map); |
---|
1121 | 1125 | err: |
---|
1122 | 1126 | kfree(args); |
---|
1123 | 1127 | |
---|
.. | .. |
---|
1194 | 1198 | fastrpc_context_put(ctx); |
---|
1195 | 1199 | } |
---|
1196 | 1200 | |
---|
1197 | | - list_for_each_entry_safe(map, m, &fl->maps, node) { |
---|
1198 | | - list_del(&map->node); |
---|
| 1201 | + list_for_each_entry_safe(map, m, &fl->maps, node) |
---|
1199 | 1202 | fastrpc_map_put(map); |
---|
1200 | | - } |
---|
1201 | 1203 | |
---|
1202 | 1204 | list_for_each_entry_safe(buf, b, &fl->mmaps, node) { |
---|
1203 | 1205 | list_del(&buf->node); |
---|
.. | .. |
---|
1673 | 1675 | struct fastrpc_invoke_ctx *ctx; |
---|
1674 | 1676 | |
---|
1675 | 1677 | spin_lock(&user->lock); |
---|
1676 | | - list_for_each_entry(ctx, &user->pending, node) |
---|
| 1678 | + list_for_each_entry(ctx, &user->pending, node) { |
---|
| 1679 | + ctx->retval = -EPIPE; |
---|
1677 | 1680 | complete(&ctx->work); |
---|
| 1681 | + } |
---|
1678 | 1682 | spin_unlock(&user->lock); |
---|
1679 | 1683 | } |
---|
1680 | 1684 | |
---|
.. | .. |
---|
1684 | 1688 | struct fastrpc_user *user; |
---|
1685 | 1689 | unsigned long flags; |
---|
1686 | 1690 | |
---|
| 1691 | + /* No invocations past this point */ |
---|
1687 | 1692 | spin_lock_irqsave(&cctx->lock, flags); |
---|
| 1693 | + cctx->rpdev = NULL; |
---|
1688 | 1694 | list_for_each_entry(user, &cctx->users, user) |
---|
1689 | 1695 | fastrpc_notify_users(user); |
---|
1690 | 1696 | spin_unlock_irqrestore(&cctx->lock, flags); |
---|
.. | .. |
---|
1692 | 1698 | misc_deregister(&cctx->miscdev); |
---|
1693 | 1699 | of_platform_depopulate(&rpdev->dev); |
---|
1694 | 1700 | |
---|
1695 | | - cctx->rpdev = NULL; |
---|
1696 | 1701 | fastrpc_channel_ctx_put(cctx); |
---|
1697 | 1702 | } |
---|
1698 | 1703 | |
---|