From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE854C433E0 for ; Wed, 12 Aug 2020 19:37:49 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BE113206DA for ; Wed, 12 Aug 2020 19:37:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="VCe+z8ns"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="qcd8cSv2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BE113206DA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=GDtbf3iKo4wh+uyMiqBe/heAeWeJGKKhhFOPAaUpM7U=; b=VCe+z8nsPDarXFhBZO9IWEkn/ HGXvSKDWkiD5c1z3ORxasUQOrxtEJ4wkkGEBO+4SUOYaTsIgPf7/9vdmmsRNsQY3Zrdjlwdr77SNc ZRli/aYFqX397ThTdBNi/EPChiB7vGRQP/uU5I6iEn5fJBQn9fZadO3TARkLanT5luQ90w/nA9vI2 ajLFyLePzYjiqVY+jZnGvhEa048Ve6csb2OtetO3xhQl3P7E2WPTsf62LldPTTUBlcFWd7b+tVVh3 leR5jMY2w006pg8H0gt+oeMhHR9c4ZljG/zyHII3PdjjDatinhYD6SqgXrz1IyywYgOGB+hhHNGai NpfcABRQQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5wXt-00049Z-OC; Wed, 12 Aug 2020 19:36:21 +0000 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5wXr-00048f-6Z for linux-arm-kernel@lists.infradead.org; Wed, 12 Aug 2020 19:36:20 +0000 Received: by mail-pg1-x542.google.com with SMTP id j21so1551107pgi.9 for ; Wed, 12 Aug 2020 12:36:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=M9s0jHVYghqG9Lqq6mF58MUGWUWBruNnwySbFqw2+6A=; b=qcd8cSv2VWsvagTTe8BTR0kufOzwPO4wfuoOXSJfwsIAoZVlenGxd6p/gXF8UUK52F +rYyqSMzLsNRzFgTm5p2yZ24JxEylxqtki5ofZlRVtaob3OMZnyvMGQy8R+ntDI/YVF7 /ld2LPW9tLUmOi4N154FzulAlNYtxqZ5/NKqwXfvHW54CPp/4cUDTFfKY0H7l7BUF4+c IAMPWB33GA4LHzketYVsKpquSmRnFCqVar9IF/zbOOIdgTtNuXgx+jlou1xlYFWrL/Qb p2uMqOE+ps9y0PjiED46PLYWy92cQr2+9qKhWadVW/0yY+Rp9JhLvY8xt1eW+6yy+cqQ TU7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=M9s0jHVYghqG9Lqq6mF58MUGWUWBruNnwySbFqw2+6A=; b=PfbVdBIja5ode5DcLvwXGTw3Qzuvg8mj9lIArtBMoRd/1CkiHdaZIQKtgWiyh6+UjC lltvzICE1xXKQg04IWHEfCIX6HoT0PuhLSFb1wJ7MNs73MFPerDTYUEV05COIZ+lxhaw E8W1ZudPE/ZNR3X9aiB3O054jd5jG6ozWGfBTGNevgarIE1OMd0jokDLrj5Ls6iVJ4Mt PBHGlNSqhRqfoVFN/dtXmxwiPasnekLxDHd1H27AsztY2IbKRKLH5Y20CJ8Jl4yV2xiW umEKba3j/v5uiNVaNym8o4ViPMWtDx0dEWDI5tEWYtKmVGF4STm4gmkz4iAGcdgFpE0p lsOg== X-Gm-Message-State: AOAM533BmNr3SwP2YxAxfqhgS3ayeUH/mIE+38TgFrPUADUBD2+pnRuM Vpi7r4DBy0RQdTlCoIU0F9JW1g== X-Google-Smtp-Source: ABdhPJz+Kxu9T3Kbox05SCsLs/dkzkLF0y2nOAxjkEGji888uKPsE3EmyoMDNIl5qfb/XYkGIWFAsw== X-Received: by 2002:a65:4183:: with SMTP id a3mr605655pgq.448.1597260975729; Wed, 12 Aug 2020 12:36:15 -0700 (PDT) Received: from xps15 (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id o134sm3153083pfg.200.2020.08.12.12.36.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Aug 2020 12:36:15 -0700 (PDT) Date: Wed, 12 Aug 2020 13:36:12 -0600 From: Mathieu Poirier To: Tingwei Zhang Subject: Re: [PATCH v8 06/24] coresight: add try_get_module() in coresight_grab_device() Message-ID: <20200812193612.GE3393195@xps15> References: <20200807111153.7784-1-tingwei@codeaurora.org> <20200807111153.7784-7-tingwei@codeaurora.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200807111153.7784-7-tingwei@codeaurora.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200812_153619_575167_F0592F33 X-CRM114-Status: GOOD ( 33.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: tsoni@codeaurora.org, Sai Prakash Ranjan , Kim Phillips , Mao Jinlong , Suzuki K Poulose , Alexander Shishkin , Greg Kroah-Hartman , coresight@lists.linaro.org, Randy Dunlap , Mian Yousaf Kaukab , Russell King , Leo Yan , linux-arm-kernel@lists.infradead.org, Mike Leach Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Aug 07, 2020 at 07:11:35PM +0800, Tingwei Zhang wrote: > When coresight device is in an active session, driver module of > that device should not be removed. Use try_get_module() in > coresight_grab_device() to prevent module to be unloaded. > Use get_device()/put_device() to protect device data > in the middle of active session. > > Signed-off-by: Tingwei Zhang > Tested-by: Mike Leach > Suggested-by: Suzuki K Poulose > --- > drivers/hwtracing/coresight/coresight.c | 61 ++++++++++++++++++++++--- > 1 file changed, 54 insertions(+), 7 deletions(-) > > diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c > index b7151c5f81b1..0b0e31577b9b 100644 > --- a/drivers/hwtracing/coresight/coresight.c > +++ b/drivers/hwtracing/coresight/coresight.c > @@ -634,13 +634,45 @@ struct coresight_device *coresight_get_sink_by_id(u32 id) > return dev ? to_coresight_device(dev) : NULL; > } > > +/** > + * coresight_get_ref- Helper function to increase reference count to module > + * and device. > + * Return true in successful case and power up the device. > + * Return false when failed to get reference of module. > + */ > +static inline bool coresight_get_ref(struct coresight_device *csdev) > +{ > + struct device *dev = csdev->dev.parent; > + > + /* Make sure the driver can't be removed */ > + if (!try_module_get(dev->driver->owner)) > + return false; > + /* Make sure the device can't go away */ > + get_device(dev); > + pm_runtime_get_sync(dev); > + return true; > +} > + > +/** > + * coresight_put_ref- Helper function to decrease reference count to module > + * and device. Power off the device. > + */ > +static inline void coresight_put_ref(struct coresight_device *csdev) > +{ > + struct device *dev = csdev->dev.parent; > + > + pm_runtime_put(dev); > + put_device(dev); > + module_put(dev->driver->owner); > +} > + > /* > * coresight_grab_device - Power up this device and any of the helper > * devices connected to it for trace operation. Since the helper devices > * don't appear on the trace path, they should be handled along with the > * the master device. > */ > -static void coresight_grab_device(struct coresight_device *csdev) > +static int coresight_grab_device(struct coresight_device *csdev) > { > int i; > > @@ -649,9 +681,20 @@ static void coresight_grab_device(struct coresight_device *csdev) > > child = csdev->pdata->conns[i].child_dev; > if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) > - pm_runtime_get_sync(child->dev.parent); > + if (!coresight_get_ref(child)) > + goto err; > + } > + if (coresight_get_ref(csdev)) > + return 0; > +err: > + for (i--; i >= 0; i--) { > + struct coresight_device *child; > + > + child = csdev->pdata->conns[i].child_dev; > + if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) > + coresight_put_ref(child); > } > - pm_runtime_get_sync(csdev->dev.parent); > + return -ENODEV; > } > > /* > @@ -662,13 +705,13 @@ static void coresight_drop_device(struct coresight_device *csdev) > { > int i; > > - pm_runtime_put(csdev->dev.parent); > + coresight_put_ref(csdev); > for (i = 0; i < csdev->pdata->nr_outport; i++) { > struct coresight_device *child; > > child = csdev->pdata->conns[i].child_dev; > if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) > - pm_runtime_put(child->dev.parent); > + coresight_put_ref(child); > } > } > > @@ -687,7 +730,7 @@ static int _coresight_build_path(struct coresight_device *csdev, > struct coresight_device *sink, > struct list_head *path) > { > - int i; > + int i, ret; > bool found = false; > struct coresight_node *node; > > @@ -721,7 +764,11 @@ static int _coresight_build_path(struct coresight_device *csdev, > if (!node) > return -ENOMEM; > > - coresight_grab_device(csdev); > + ret = coresight_grab_device(csdev); I suggest trying to grab the device before allocating memory for the node. If grabing the device fails memory doesn't have to be allocated and released needlessly. I will likely come back to this patch later after reviewing the rest the this set. Thanks, Mathieu > + if (ret) { > + kfree(node); > + return ret; > + } > node->csdev = csdev; > list_add(&node->link, path); > > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel