Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp713273pxv; Thu, 15 Jul 2021 14:12:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjSQsbHGF0K1BJrAej/Oi4/yqB2q0OGlYNolsVQWr8xHnm3XuqGedziBZIXi+GJoC0vfMk X-Received: by 2002:a05:6402:3507:: with SMTP id b7mr9949399edd.254.1626383532732; Thu, 15 Jul 2021 14:12:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626383532; cv=none; d=google.com; s=arc-20160816; b=oxhTabpFUSKwPV/G6r3AHM8bcRtIojS2H8U132QIpXQEv9Vhb8Wq+ZKhM1sTDqeZ3N Sylg/rtnofuORV6la9/lbN5Uk8iaaufn+/vxHqKgxorA7W+LQaHRsyPFI6/+1k4KYA36 FbfqMvYzWGOeS9nkaY9LsCdWf15+vKY9EUoV8SOJ1muy0x6iCY2BBntBhYQwH2DlWrxh E57lncMf2y0FWCvAszp59mCInTfQrDSGlh4SVPXmn6+yIuD4V2FS9BEz1yD+pdsDaeTZ ucAtW22svzYBg3bX5NQlcDEaq3C4YUagz2yD2dJE+C2dxxbWy293YAoxUNaVj4ZuN/ZE 1ofQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=CWvmIw1gRUuAie9NXGGY/lskTEQUqq4Wd5CbNYklHbs=; b=ZuNqnbf6BLith7lOKMNYPazvPdCexpld/UJbueT58TsVvn/dYFyHRsFwdyXRqTPbyS +iHibHuNd2FXy0nSe40o2RSi7KDbqEphMN557G+90JUDFB+v2UnYjo8jBj+zmVhjUEkP /AksbVrU05DRlccgKEICNVbC0dlnlJsygzWqZpkhddjJEd6BgW1DVAuSGrY3ZHHzMC/4 E5WSvdJ2yAcoEkd9QWzAwZ4Ala7drkoCNY3Ql2uBOj/0M/tV2L9HNsj/1p5Dv5WTmTMq FZ5BalyOShBhAABWdQ+ulnCGBYLs/FskY5O/7k57k8oKSGjncP1A3BVzG+j05QfWn/x4 3MWA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=S15XtuDi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o17si7863784eji.157.2021.07.15.14.11.49; Thu, 15 Jul 2021 14:12:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=S15XtuDi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242937AbhGOTWp (ORCPT + 99 others); Thu, 15 Jul 2021 15:22:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:45622 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241811AbhGOTGU (ORCPT ); Thu, 15 Jul 2021 15:06:20 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3AFE9613E6; Thu, 15 Jul 2021 19:02:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626375752; bh=wJW9/bWdgGLuAi77N/GftS9RWl0VFrkxM6LNFtYqLTQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S15XtuDi72S2L1UVQ40LrC0hd34b1a9Z4hTqAdjVIpvYejcKkG4kLCvA6z8G9Ubud MF3skfDAWFAdukdoXr3VwtPA/G/OsgJLZDwnyDRK1ZjgzZYSSS9CecBqOdONSAJ1Vd ZlOgdVEqBJ8xPD83hhrusZk1gygLq4ThoJsX34MI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sakari Ailus , Mauro Carvalho Chehab Subject: [PATCH 5.12 222/242] media: i2c: ccs-core: fix pm_runtime_get_sync() usage count Date: Thu, 15 Jul 2021 20:39:44 +0200 Message-Id: <20210715182632.093534439@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210715182551.731989182@linuxfoundation.org> References: <20210715182551.731989182@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mauro Carvalho Chehab commit da3a1858c3a37c09446e1470c48352897d59d11b upstream. The pm_runtime_get_sync() internally increments the dev->power.usage_count without decrementing it, even on errors. There is a bug at ccs_pm_get_init(): when this function returns an error, the stream is not started, and RPM usage_count should not be incremented. However, if the calls to v4l2_ctrl_handler_setup() return errors, it will be kept incremented. At ccs_suspend() the best is to replace it by the new pm_runtime_resume_and_get(), introduced by: commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter") in order to properly decrement the usage counter automatically, in the case of errors. Fixes: 96e3a6b92f23 ("media: smiapp: Avoid maintaining power state information") Cc: stable@vger.kernel.org Acked-by: Sakari Ailus Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Greg Kroah-Hartman --- drivers/media/i2c/ccs/ccs-core.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) --- a/drivers/media/i2c/ccs/ccs-core.c +++ b/drivers/media/i2c/ccs/ccs-core.c @@ -1880,21 +1880,33 @@ static int ccs_pm_get_init(struct ccs_se struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); int rval; + /* + * It can't use pm_runtime_resume_and_get() here, as the driver + * relies at the returned value to detect if the device was already + * active or not. + */ rval = pm_runtime_get_sync(&client->dev); - if (rval < 0) { - pm_runtime_put_noidle(&client->dev); + if (rval < 0) + goto error; - return rval; - } else if (!rval) { - rval = v4l2_ctrl_handler_setup(&sensor->pixel_array-> - ctrl_handler); - if (rval) - return rval; + /* Device was already active, so don't set controls */ + if (rval == 1) + return 0; - return v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler); - } + /* Restore V4L2 controls to the previously suspended device */ + rval = v4l2_ctrl_handler_setup(&sensor->pixel_array->ctrl_handler); + if (rval) + goto error; + rval = v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler); + if (rval) + goto error; + + /* Keep PM runtime usage_count incremented on success */ return 0; +error: + pm_runtime_put(&client->dev); + return rval; } static int ccs_set_stream(struct v4l2_subdev *subdev, int enable)