Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp663725pxv; Thu, 15 Jul 2021 12:51:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUcyJztrjz5fafi9fhaBzgzOqXzWrTlaFXzB3TS1z/R1o58xMPpVzx4jt3J8esOolKQuvA X-Received: by 2002:a02:2a07:: with SMTP id w7mr5519050jaw.96.1626378666508; Thu, 15 Jul 2021 12:51:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626378666; cv=none; d=google.com; s=arc-20160816; b=XBLRWxdQb4VOMweLyptizDelLGaR0NXXJMjPfcJF6JARbb7OfW9bSVsVZvLfO/azAS TdHdykYFK3/AH/s31xWWSM2OcXUqkbljoY9wNboQc/lqXp5ttX4IXTRAuaDEuJFOnxh5 2sm6wd21fPdgxi0m3mG9RFzo2SLIqouIGYJH53Q2eeuBAPYUd5HJTm9q03Sb6iH4HoVQ MVflRm2FwZ5rYM3cpRSy62jSKegr+/LsaQeGackALtuYVAaMDYrgZ+g0BHFioNsQv5jX BjkhFqlXNFQILY/HlBNDZ4TEBxFLn9z/jxf3DxjC3OR617bM2OGyOqlSakmi+qzEXEx6 HN/Q== 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=KWR/xhYno21ybK8TsIaq8TIslNXnOgxzPVsPt/2yAClNt3isg+zS+lifblSPnZrwH5 PWZZvu3mFi9DUQwlaQFnH+c2RTElUURXMANKd6itLqMCv8j5a/xIOYNVpePcevTVhuTg FcSRV3bkpK9CQmSLJZ6/VemX1XkIbXHa63I7V0I4YSuNQUEeJ2CGv9MVzW1Msa6SAhVT pzH/G5jPHDN7x7tBzp6nug0B6z+nXEVePnGvYZS4oOz0f0yHYJR1CKd/UBRlqI437UCa aWBfxfkHcIbfGQmw0EHP2J3uyLdxypvdE8/XGaB+vRc9Q/IzdIjEJP+mjcgfSfTOMBeR kiEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=SBAu1K5S; 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 x17si6613628jat.44.2021.07.15.12.50.53; Thu, 15 Jul 2021 12:51:06 -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=SBAu1K5S; 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 S1344153AbhGOTsv (ORCPT + 99 others); Thu, 15 Jul 2021 15:48:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:58950 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241864AbhGOTSH (ORCPT ); Thu, 15 Jul 2021 15:18:07 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 57ADC613EE; Thu, 15 Jul 2021 19:13:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626376383; bh=wJW9/bWdgGLuAi77N/GftS9RWl0VFrkxM6LNFtYqLTQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SBAu1K5S/MZjjRwXvX91lJiRGx8J8wtWDEIfHyMWF8P7TKSJRQEeWfyibGbW3ySHi tdLjukWYokWEX/D7R/ei6W2Zu84vgiF0a/ii4/Xr9PiINdjZ0ImXxJVdHIQOangZhV 6TlvY149SLQhAJigtSpfASqm1JaCoKr7xvbMEWjc= 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.13 246/266] media: i2c: ccs-core: fix pm_runtime_get_sync() usage count Date: Thu, 15 Jul 2021 20:40:01 +0200 Message-Id: <20210715182651.660943093@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210715182613.933608881@linuxfoundation.org> References: <20210715182613.933608881@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)