static int afu_release(struct inode *inode, struct file *file) { struct cxl_context *ctx = file->private_data; pr_devel("%s: closing cxl file descriptor. pe: %i\n", __func__, ctx->pe); cxl_context_detach(ctx); mutex_lock(&ctx->mapping_lock); ctx->mapping = NULL; mutex_unlock(&ctx->mapping_lock); put_device(&ctx->afu->dev); /* * At this this point all bottom halfs have finished and we should be * getting no more IRQs from the hardware for this context. Once it's * removed from the IDR (and RCU synchronised) it's safe to free the * sstp and context. */ cxl_context_free(ctx); cxl_ctx_put(); return 0; }
int afu_release(struct inode *inode, struct file *file) { struct cxl_context *ctx = file->private_data; pr_devel("%s: closing cxl file descriptor. pe: %i\n", __func__, ctx->pe); cxl_context_detach(ctx); /* * Delete the context's mapping pointer, unless it's created by the * kernel API, in which case leave it so it can be freed by reclaim_ctx() */ if (!ctx->kernelapi) { mutex_lock(&ctx->mapping_lock); ctx->mapping = NULL; mutex_unlock(&ctx->mapping_lock); } /* * At this this point all bottom halfs have finished and we should be * getting no more IRQs from the hardware for this context. Once it's * removed from the IDR (and RCU synchronised) it's safe to free the * sstp and context. */ cxl_context_free(ctx); return 0; }
int cxl_release_context(struct cxl_context *ctx) { if (ctx->status >= STARTED) return -EBUSY; cxl_context_free(ctx); return 0; }
int cxl_release_context(struct cxl_context *ctx) { if (ctx->status != CLOSED) return -EBUSY; put_device(&ctx->afu->dev); cxl_context_free(ctx); return 0; }