From patchwork Thu Aug 29 09:29:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 172548 Delivered-To: patch@linaro.org Received: by 2002:ac9:5c4b:0:0:0:0:0 with SMTP id r11csp2072006ocp; Thu, 29 Aug 2019 02:29:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqwa0VbigdJtj5beDyPaVrOpxU6O4TZ7jVCI63BfY1eGW6BfD8o22kTIF2i8mZHdjVIH1tS2 X-Received: by 2002:a17:902:e407:: with SMTP id ci7mr8991494plb.326.1567070982426; Thu, 29 Aug 2019 02:29:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567070982; cv=none; d=google.com; s=arc-20160816; b=QlmQsD/ge8jRaoS7RfUtZ6MA8dVP73pAE0lnShhkxbastRKmkHItngVPguq4NdqnZi K7OpYhm9YlD7uBdsoVurwSc7sc3Teky/OSyLGrTH/7DcfhD5/oVGAgdif6I4Yd643b69 OytsI9Qo8T+VmCAKF5GCO5mzbUMOYamM8X4xNLGRmV1RSviGxdi7nX7l//ogTFcfUW6i OkCSq4r1Wb8zPomNr1ldVqHcPwsLbSU26q9SppcyfYTjrru+5N3gZ1A/L+sPWJgg367u bwc2Ifs38uiDtlIcK3vkFPi+Ff///zM+TsYxOAxFB67fJWyqLqSn8BOBYL1NAU3QMsCV rlcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=XU8VavFbVq1P6J4BGT7bqqCvGA+gvD1YtYfU7w8Ui4Y=; b=eZlUouAdbm7ER1BEnhQn7/XbFAwu/PzOHVtdNRYggXQO57TedOEB56PFmLI3TDoX1y rlp9Tvaj/c3gjFThd/6z1H+XZwoZBehb7yUxK/yURWMNLRv3ejPlnQ3wWT3hVQ5TjZ1R nacWWYb479DHUtu/W78kc7ic4vlyFwgdmrRNWjb/icw7RUh1mIHMEg5TRcLGGGJyhD0v gGh5NU3awvY0kUS/tLkr1CQtKEgEWbhLkeF8M0jig4JceXMrceGRUItp4U/SJro9r4VG C6ulKlw8VRE2vu4qq+VnT4MTXv3hIJolOjjU68Zb3o3vzQw0RVjahEI5NV9cQHaZc/uA bY4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=y2Jad9If; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q11si1741557pjv.95.2019.08.29.02.29.42; Thu, 29 Aug 2019 02:29:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=y2Jad9If; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727122AbfH2J3l (ORCPT + 28 others); Thu, 29 Aug 2019 05:29:41 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:39624 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726009AbfH2J3i (ORCPT ); Thu, 29 Aug 2019 05:29:38 -0400 Received: by mail-wm1-f68.google.com with SMTP id n2so1667846wmk.4 for ; Thu, 29 Aug 2019 02:29:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XU8VavFbVq1P6J4BGT7bqqCvGA+gvD1YtYfU7w8Ui4Y=; b=y2Jad9If07L8NkCkwNdv8YZMdg76iweYq5gnyqU7ZDpAiemuWRrJjbuu5BLDeQUdNp ZPFbRWLdHenEAhkH9KAB4roQxHkuuhxayo9pCXmARueqQY7W1aLx41028c5b967Ih7H2 AbB11KjZHaaeJ4xTfjIhr3tFxpGTl4v6E0DJNc7N11Zf/8b7w1SXYelXiZ3nK7FdyqBm uCJjAeeobnr9UxrtXj7GJYMLGbG/Z6f40SIjgckg7xwUL9jFsAA4qGd2YKOskcCD//AG R3LIqRDSknSJvQGfk5Z3TL7kUjgA4D7Fw/ZYMH/+pN4KfAZCucq8iLiaSUFlWGf/Z/14 Q4eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XU8VavFbVq1P6J4BGT7bqqCvGA+gvD1YtYfU7w8Ui4Y=; b=dVgtd2TMGPMP5bwrYaFLARrmvvWfgE9mCBQlAgpMpqO0q2/BzqaDV/QFSJEemg0042 T3AWntOTxNaf2K0hbFO/HuLWcXHsdvMzAW1sl5mYtLz6J/AIl22Z84ik1WxcjfObyUYL 7J1BlIL8R9Z+rkTBTI/FN5dFt2tu//iKQp/p6wEzJ1tfkCRMHGTrJZj95GOJElJ3oYuS MSqH5BTb21WkshqPTOu7IrhG/FJ0rTWjsK5CyIZWdoB+sCCgjZPBHBNCvHj4YmlSXntu 04BMG3ZVy+4bG5i6Ap6Mr2eBrVUHr9TxViGkOa+cwiMr4o1HD77B//3Wd8lnfec7M4jk wW5A== X-Gm-Message-State: APjAAAVvFhL6O5UrEWoklXkX4j/WqMvS8AgbX4Ui7LgERB6c0sBfWfR/ HfoQ4qQTLJYb9iji3EEDR5ROfA== X-Received: by 2002:a1c:658a:: with SMTP id z132mr10210355wmb.98.1567070975588; Thu, 29 Aug 2019 02:29:35 -0700 (PDT) Received: from srini-hackbox.lan (cpc89974-aztw32-2-0-cust43.18-1.cable.virginm.net. [86.30.250.44]) by smtp.gmail.com with ESMTPSA id f197sm3609512wme.22.2019.08.29.02.29.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2019 02:29:35 -0700 (PDT) From: Srinivas Kandagatla To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson , Mayank Chopra , Abhinav Asati , Vamsi Singamsetty , Srinivas Kandagatla Subject: [PATCH v2 1/5] misc: fastrpc: Reference count channel context Date: Thu, 29 Aug 2019 10:29:22 +0100 Message-Id: <20190829092926.12037-2-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190829092926.12037-1-srinivas.kandagatla@linaro.org> References: <20190829092926.12037-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bjorn Andersson The channel context is referenced from the fastrpc user and might as user space holds the file descriptor open outlive the fastrpc device, which is removed when the remote processor is shutting down. Reference count the channel context in order to retain this object until all references has been relinquished. Signed-off-by: Bjorn Andersson Signed-off-by: Mayank Chopra Signed-off-by: Abhinav Asati Signed-off-by: Vamsi Singamsetty Signed-off-by: Srinivas Kandagatla --- drivers/misc/fastrpc.c | 43 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) -- 2.21.0 diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index c790585da14c..c019e867e7fa 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -186,6 +186,7 @@ struct fastrpc_channel_ctx { struct idr ctx_idr; struct list_head users; struct miscdevice miscdev; + struct kref refcount; }; struct fastrpc_user { @@ -293,6 +294,25 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev, return 0; } +static void fastrpc_channel_ctx_free(struct kref *ref) +{ + struct fastrpc_channel_ctx *cctx; + + cctx = container_of(ref, struct fastrpc_channel_ctx, refcount); + + kfree(cctx); +} + +static void fastrpc_channel_ctx_get(struct fastrpc_channel_ctx *cctx) +{ + kref_get(&cctx->refcount); +} + +static void fastrpc_channel_ctx_put(struct fastrpc_channel_ctx *cctx) +{ + kref_put(&cctx->refcount, fastrpc_channel_ctx_free); +} + static void fastrpc_context_free(struct kref *ref) { struct fastrpc_invoke_ctx *ctx; @@ -316,6 +336,8 @@ static void fastrpc_context_free(struct kref *ref) kfree(ctx->maps); kfree(ctx->olaps); kfree(ctx); + + fastrpc_channel_ctx_put(cctx); } static void fastrpc_context_get(struct fastrpc_invoke_ctx *ctx) @@ -422,6 +444,9 @@ static struct fastrpc_invoke_ctx *fastrpc_context_alloc( fastrpc_get_buff_overlaps(ctx); } + /* Released in fastrpc_context_put() */ + fastrpc_channel_ctx_get(cctx); + ctx->sc = sc; ctx->retval = -1; ctx->pid = current->pid; @@ -451,6 +476,7 @@ static struct fastrpc_invoke_ctx *fastrpc_context_alloc( spin_lock(&user->lock); list_del(&ctx->node); spin_unlock(&user->lock); + fastrpc_channel_ctx_put(cctx); kfree(ctx->maps); kfree(ctx->olaps); kfree(ctx); @@ -1123,6 +1149,7 @@ static int fastrpc_device_release(struct inode *inode, struct file *file) } fastrpc_session_free(cctx, fl->sctx); + fastrpc_channel_ctx_put(cctx); mutex_destroy(&fl->mutex); kfree(fl); @@ -1141,6 +1168,9 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) if (!fl) return -ENOMEM; + /* Released in fastrpc_device_release() */ + fastrpc_channel_ctx_get(cctx); + filp->private_data = fl; spin_lock_init(&fl->lock); mutex_init(&fl->mutex); @@ -1398,10 +1428,6 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) int i, err, domain_id = -1; const char *domain; - data = devm_kzalloc(rdev, sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - err = of_property_read_string(rdev->of_node, "label", &domain); if (err) { dev_info(rdev, "FastRPC Domain not specified in DT\n"); @@ -1420,6 +1446,10 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) return -EINVAL; } + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + data->miscdev.minor = MISC_DYNAMIC_MINOR; data->miscdev.name = kasprintf(GFP_KERNEL, "fastrpc-%s", domains[domain_id]); @@ -1428,6 +1458,8 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) if (err) return err; + kref_init(&data->refcount); + dev_set_drvdata(&rpdev->dev, data); dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32)); INIT_LIST_HEAD(&data->users); @@ -1462,7 +1494,8 @@ static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev) misc_deregister(&cctx->miscdev); of_platform_depopulate(&rpdev->dev); - kfree(cctx); + + fastrpc_channel_ctx_put(cctx); } static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,