From nobody Wed Apr 1 12:38:01 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013063.outbound.protection.outlook.com [52.101.83.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 422263BFE2F; Tue, 31 Mar 2026 07:25:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941906; cv=fail; b=jLOszq948zMhSNzDbb4gQ3o2eZk8qYMfWtrt36OCefUEcpcrtqCbk4WhwkYW2LDymKELbkFp8bps526exeFu7dSGFHC0kEdA9CKTeruJow5QAWYp6wuSl+OeOaEfJBlCqtrAR/tuMKi0tWKCmyzDFOc8xRdXG8Y2/Bz2zOwLUoA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941906; c=relaxed/simple; bh=dxqwC4iZox6/8g7y9TIXO2niVHVRP5fhMYEMPdNOZGM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ZdDyioepu77x19dyFWkIfEnuOv4+9Cwpdw9UOY4kz/hpnIDLR2ZWSBn2azYAnytpC+gMnxpZZ1336fJloXV3i12MLEWsgxcZvdPf/TGRKTL5HSNPYCMqNV3BV/+mEbjKtGJN/5R8HaWaKWO7ubhG5j9wJC6YUH77jx6rd/r+SSk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=llldHKDD; arc=fail smtp.client-ip=52.101.83.63 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="llldHKDD" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FyhllBTYsxhpr9Czm0LYiaRJndZTb+iBFEHXEwKMJzijma7tcJ7vA5L0XENMlF8sKvKTbQOpgoeltSeJEswL41iCqNqy1UerDYTo7iv95PnPQQbVSXvuQWod4zzF7reWRbTlco2et7IUTVXOr9jiUZ3qPpJ2cdQwPpqsXjqJROR//Ag7zx9N9pU2FLTdm/PLbcZwJq9FFO8H9QoA8wqH2pnxvAJ16OgfkrGKScJSTip5zelbMToHZSlee92GDF7I0DdnhTzdn8kBy4MAlEx3lMc7ZvuCUJNKgXyqPtYXVWfEAycaJjG7gczM8t5d8MTGz7VUKKqwoHb+5Mxfbv3gng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dWzVJ63pGh3vNJoRsqFe5lreamznhZFozyFzoLtLHWw=; b=aPMcVuYGztUkHD8ChkssuT6mJugS5wSVvrdk2Kj0vtkMVSh3h58vFjhbBIpGfydjb2V5JWbIXPgRn+ml/UL5rnl2+PMwSVySbFSdKGzFcf7SLn8KIVr3WYJk7aPlSjY5fxeVkUkdbTNJqG+TBxFz75gB1UlKQPhNcGLSo+9KB9yPXQhpDg+F9IVkP2szXnrxrX8v3cpOaDMTMbhJi7xbkijN40M85VlaeKB2oR+5a4vBx+Ij51tuaZisWd5gi17rSsn3+9rvPP4wgxIrc4RR6l/vGk1TAZB+u9VcetATadTFISigDcadOf52iZyfAsypElc6CTqt1w7EcIDVxHSYaw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dWzVJ63pGh3vNJoRsqFe5lreamznhZFozyFzoLtLHWw=; b=llldHKDDsfZ1m0qiRUtE42M5bi8HM87N4yQ/JafpQVegJunTStqzRkHmObaTEULLUGSG8G28mbfivlLbuPZTvkNucLaaaX+jKXTM0WHNeK2ryEKgOjfPANWmY7mGPBVgeM4/TYAEE3Ybp+JwMSVAJ4JEzOEGaO55Ua3PJCMNh6EfInKl0e3vwAmSuoJRvTK9jlvZlbG+3lca7vG2KJ8a3fvp1HP6YInvajynaivwsxGfyoFD0CR6KB+//iCrDCHviZ9Tlz4MwYSfX51qlWo64R4N2Qkr9GVK27uC3qC43Ka1zMzcMO7tukvkSU7KwixVodf9ph5OgpGG0WiJex3oBg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by DUZPR04MB9968.eurprd04.prod.outlook.com (2603:10a6:10:4d8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.28; Tue, 31 Mar 2026 07:25:02 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:01 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 1/7] media: v4l2-ctrls: Add V4L2_CID_MEMORY_USAGE control Date: Tue, 31 Mar 2026 15:23:11 +0800 Message-ID: <20260331072347.253-2-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|DUZPR04MB9968:EE_ X-MS-Office365-Filtering-Correlation-Id: 2776bf93-6e35-4634-ccb2-08de8ef69f1a X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014|52116014|19092799006|18002099003|56012099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: lGUT0afL/7F/Rh7iabA9zqOS7Rf5GQ/9VsK6UzN4BARpPeYecsDlVaNN9yZ9FzDdSnzTTF/+kmvMrm9hte9AQrHsdIpsY+55YvpPDSV/nFTOJAHL8mpDNtaXNuygl5ZKKI+ighwk5w3LiwmDh8oQ73Ll8oLVuMo65BvngOxPtzTm3QC6XVsTZWZUUkgOcji3nJGrYbVBuSm2Y+leHpytXo/j412FcHYDDYVEReIiJNPd5GB+FKDQtLK7TB4J8T9Sz8D2TIlcV/hKNrbe1yF5gV27Fy9KoPh5kWkMfTs4sgm3sITskP+Omh07RtcyNdKBV+pOPsKRZ/NgR1TNxzc29CIs06il6B+pfRWGyKPSr8vs/TL3jIhnsNSou5AiZ/zxO8bmtT5rYZ3175EBpdoLU+xZm/7+NwWR24zunJv/kie+/Yj/kbKWpJw5o1h9bPjLwcuXgX0uRPS/e6fjI05K23kXmN2zeULypdG6rXeVFGH30dBnp000/xccWRnYBeN9xxc4LG3ryJTTubx8IFaTlJuMVkrtYonWEMAL7aXYIomx9axTdPUuDd+v4mGmBEfG8eXx0FpU6Iwfi4fHfWMjGqUW9iN1kwqnRqC6nLKxH4G6S+nayfHQCIOR54u8wiMHRXBw3v/R9VB7ptNQ3xkgJmbV+Kndr0A0etGeToqOJCMrYLoKvh7ryMeRRAmznL4/VddbHgHmKw4CzsENQ9d7uHuR7rEl7httMhgu3WszXh7r+jayg2AbWUfKL52DTzFYpIIf1mJA/oBp2QGsrMODYDvuHkGxpDw2LfyKBtXiGoA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014)(52116014)(19092799006)(18002099003)(56012099003)(22082099003)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?jxserZ1NssyFoUg3bVnxjg7fBOAJwwa8fTRi4cA/ohkW2uJBidRFxa7Cm/Hj?= =?us-ascii?Q?KcQPUz/6rQUoI3rS1fLUwzxXoAuNStDViT9WufqoBXPn6SZISaAg/+99WazS?= =?us-ascii?Q?TY8Iw/rU3a9Y9osKBVgkUeNCtNfz60Z7oWyPNq/8/dtgfsoSnP2/S5FyXBf0?= =?us-ascii?Q?tQZ/E7/3MapD9tM/ZeitS+G5QJrSKaTAVuP1UdXl6QGlc3u8iSauUHuVY317?= =?us-ascii?Q?mkFJXYtFd8WZF1VosCMUgtDHA+6bdvmhRnHe3vspnfDZPbh2FR3JIlCDQHSi?= =?us-ascii?Q?nNc92BF4F8mtp1dwgJKgr9CXpn2ZB4J2ybHbPc+hxmLc/dihgqAcdtFy2alL?= =?us-ascii?Q?QNCOQGxX9dsicP47/x6WJJPGltNHGdqxDwutbuKSpNAnBkDRK7itSWRKvmQQ?= =?us-ascii?Q?9fXsfPmKLLlBYEZ4yZWPfIuKMdHQU0FnxLG0D37zB3KZ2F094REIVNZORlrQ?= =?us-ascii?Q?2juloSKxugjem07+Ij7G9BaIUGrIsFc9FHSmqOzEyI9nk5Jp5JWXkYk6G4Vz?= =?us-ascii?Q?JxMOLk6Kg5TAo+kybGytqOtOSeG7kLeOFHKry6AtS29rqeA45QqRukyc4yEo?= =?us-ascii?Q?1hzdC/WkipmHuuZlJbbht079bwATpRHjsKvzkZuXYkHtBKUlAONtJN+o+FcK?= =?us-ascii?Q?1XEE1EEKa2JUA/obFeGCPKnnDO7rmMqEwCpmFPzhRtEWx/WNRBvhaRnT0MkK?= =?us-ascii?Q?nIWKghGZDN0zKNwBuYdvkWPMGdgPFGe5lupacTOAOevQzQBCjbWNP+kESsR7?= =?us-ascii?Q?9i3ZeMS0SYA5PevjGXZfGF1kqycwIU67bI/7b6PMzTKNIQmMuUJQHS7Lj5/1?= =?us-ascii?Q?8JRzBRv9eDdYZVTaJHdfKlDHEBzTtXpPdV1/raKnZd5vvKIk+SjgzR1MNqAE?= =?us-ascii?Q?R/HvkyEH5bgzr6sMRI7hVZPMPD6auAZuzltjlbjaRlcHOtkRGvZX56HJPv4T?= =?us-ascii?Q?DGQQQKFB2y12uxstk1mey+9P0Zr0qwtJ1lSoDn/4KITf9Plu2Kdjq+bAFZ+F?= =?us-ascii?Q?IQZxWOrXgszz8vV+D4942P3kWhrOzlmhbCUEqBfc81Q8nyDH/X2m8yn16g68?= =?us-ascii?Q?dlarDJnqy7QzKbzV4K2PauJmvuAPHWyS+4jn3zZFL+gY9PiDvNOKgj0WArMA?= =?us-ascii?Q?vslWGpFa8o2kCIIUqRXMbMXcR4w2QKnzLUNpfPk1IFguPWdQtwaDJmn5xyYk?= =?us-ascii?Q?Gq3qUa4tQ+RwWCx0oiW2aliJxaI/jdMxQwWIfbzZKkZUiO6pcXryaqND3nNt?= =?us-ascii?Q?TgByF1NKhT36oYGzp5qi6W+w5eCoOIEVwIVMLkFgJEAzE41Mv2ePYXACxLgr?= =?us-ascii?Q?VKtBDDYtmsHy9qM+1uyi/Mb8829eL6xl7CpnOmKB8SvC2McqQc5MH6nKC0Mz?= =?us-ascii?Q?kQ3tYhOU5h0ShOzkTDTP9sJbFmANm9MhvmZYrfZaMpfoSUlTP+Yrj6NENXHU?= =?us-ascii?Q?b4kxcWFMNb0QbDKyTbCaxPMC2RrrDcu2OWWpKX9Ks/LgF/r4ygtZDv9S79O0?= =?us-ascii?Q?PxwPrKaIw6Md/ndw2HbIuK8fg3m+YrAqCJ31NqxN0/CNg1Brc3V7BwNiGMfv?= =?us-ascii?Q?VNUSVNxcL5ru9kH52+rcAL0mDv9uc0gLR2DUenPfeBny6nLjV8RXdyEmCfyR?= =?us-ascii?Q?2VtY/xNQdTQ4WlHDELVE8nZZAZWViDRfNI+BnXvNBuOwk3thq+1wBYsVcDyS?= =?us-ascii?Q?zm9/f6WshFNC6xjdQ4s3lBxKLlm+yGGaXVfte8ayrDzqqWMJw7Q4qkgohI9B?= =?us-ascii?Q?084weQnWSA=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2776bf93-6e35-4634-ccb2-08de8ef69f1a X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:01.8554 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IO+rA0r2u3qm46Fq1o6j+RHNoMpWDDxKoj0/0R0Q+uC0MDXrFS6Q4h9zE8y94NvddtHaqUgsVkyXgjqatFvRWg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DUZPR04MB9968 Content-Type: text/plain; charset="utf-8" From: Ming Qian Add a new read-only control V4L2_CID_MEMORY_USAGE that allows applications to query the total amount of memory currently used by a device instance. This control reports the memory consumption in bytes, including internal buffers, intermediate processing data, and other driver-managed allocations. Applications can use this information for debugging, resource monitoring, or making informed decisions about buffer allocation strategies. Signed-off-by: Ming Qian --- drivers/media/v4l2-core/v4l2-ctrls-defs.c | 8 ++++++++ include/uapi/linux/v4l2-controls.h | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2= -core/v4l2-ctrls-defs.c index 551426c4cd01..053db78ff661 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c @@ -831,6 +831,7 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_ALPHA_COMPONENT: return "Alpha Component"; case V4L2_CID_COLORFX_CBCR: return "Color Effects, CbCr"; case V4L2_CID_COLORFX_RGB: return "Color Effects, RGB"; + case V4L2_CID_MEMORY_USAGE: return "Memory Usage"; =20 /* * Codec controls @@ -1476,6 +1477,13 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum = v4l2_ctrl_type *type, *min =3D 0; *max =3D 0xffff; break; + case V4L2_CID_MEMORY_USAGE: + *type =3D V4L2_CTRL_TYPE_INTEGER64; + *flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + *min =3D 0; + *max =3D S64_MAX; + *step =3D 1; + break; case V4L2_CID_FLASH_FAULT: case V4L2_CID_JPEG_ACTIVE_MARKER: case V4L2_CID_3A_LOCK: diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-c= ontrols.h index 68dd0c4e47b2..02c6f960d38e 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -110,8 +110,10 @@ enum v4l2_colorfx { #define V4L2_CID_COLORFX_CBCR (V4L2_CID_BASE+42) #define V4L2_CID_COLORFX_RGB (V4L2_CID_BASE+43) =20 +#define V4L2_CID_MEMORY_USAGE (V4L2_CID_BASE+44) + /* last CID + 1 */ -#define V4L2_CID_LASTP1 (V4L2_CID_BASE+44) +#define V4L2_CID_LASTP1 (V4L2_CID_BASE+45) =20 /* USER-class private control IDs */ =20 --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11010056.outbound.protection.outlook.com [52.101.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FCF23BC67D; Tue, 31 Mar 2026 07:25:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.84.56 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941912; cv=fail; b=XE61dpMABwxSF8J9I3VfQfutg31pmfNfYNj6PQtQZQrwGCb4Ru6PJuyCBYApfsdIMDUoRYU8zN1bHFAeSktmneaAk03gNfSIsT/PElv2fqauDbbAH/Mdrrw9dbxXuIZ1M/Ut8Eog+3rfgk0XLKQkJVl2RU1e5fiODh+0hcAJmIk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941912; c=relaxed/simple; bh=hWKpmWOufJmSLGv7xPU79TLS9GbtWtcXVwLTxhBsuW4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=WpR7kcMUyjcuZZl/EmG2or1YVvQuGs4/AMxtg4umD0S3tlYP87w68+oKWjk1XJPW0PVlhfoP9ETHvTEY+9u4L06XjolrT80XZZcgk0qCI94O45AGO5JqhH++O98OZ4HQR3tjSAWTMc4mXGMKoXZmxqRmrnehRHHEW/5LppH6Lp8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=EjwXkK21; arc=fail smtp.client-ip=52.101.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="EjwXkK21" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=t8V/ybwK4anaStLs4dm+4xufYtFr9bDBcDnwn6eg1DNSP/7igjdI5AhnntMXqsahIZh09Mlgq818nW9ltJ8Cx9z5BDrK0Vurv5h72BzSSe2+h2ObmZaHyb7pMGjCYSCopItZteFiTDdQqBaTagIGw7rPG6nLNgZaSK/VDu1a8shREwWBF70q+N+MhyQLm13VtpBxAeTWbEzvqUIBuN1sebDaGlhHuc28yzDYT2+SPWVvDsFgMway1wHNIv4AZILCLrnYsXDFJnmqmMsJBVML80Owp+zTuOKNhrL24mKzTIA6QvGgpUt1X2pYMvBTLDADAOFga+Rr8vJC05k/znjnBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=p6NUmA4qkRY/wUZ93SuhH+Y5gV/K7uEqrf1r9MuqcTE=; b=p2vy1UBuOOesC2902ElGrx/Gv72mo9xeGsl6Fa/6S4bAEk5RjHlzJXymz5qHVuZBkbt/wXTnMb9wxxajCyWAoMTzVczTd6ONu0AIM1soRNnZNS3BN6Hy4c5CR8eCLjgTkLW8YRd4vfG6foR1y5OG3QvytKy9zmWBb7LJNIDntUurZjDG3cwm4lnaRZ+87QzvqLMVxS8rglx+0f5TzDWxaph/PnonZ2I/x9nJ5Cubtrf7uXmCQjycp4S0XHmZpH05/VqH+2sw6d4LzK9o4KxeQ9YId3Rb3CM2cYVAuhMIuk3FOa5cPa1PEdseQj85YWMgjo8pA0gcArvvf+qjiCtaGw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=p6NUmA4qkRY/wUZ93SuhH+Y5gV/K7uEqrf1r9MuqcTE=; b=EjwXkK21+z0CJgThcCxdz8G+U0MuTQ0xL2EvdVf75qlBaZZ2ZuVmVaWzdnS3i7WWJNKmblrJKf4MWRecbnid1HLthYdRfZyrYD8Nc6NW5qEuTVx+qnLYW4inTyOFU/e1VeGr3QSjQujilDNZgyYjvn+dy1dQbFWmIo1qS3Z0JUBZFfZ8E60WB7MPeQFzFXmZFQQkHXAoJ+dZQJtU+JqHk4f0HkK5Kvo4a35P2MvDRg6BApqbDrnIamcygfFYRcLpOFbPTUz92jfC202dIxmSX2TfDmRCacXBYvmBOtqkMVmjlVq5dh+0CLiWno7wy3NC4p5bekCvD3FkLb+ehWQOcg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by DUZPR04MB9968.eurprd04.prod.outlook.com (2603:10a6:10:4d8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.28; Tue, 31 Mar 2026 07:25:07 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:07 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 2/7] docs: media: v4l2-ctrls: Add V4L2_CID_MEMORY_USAGE control Date: Tue, 31 Mar 2026 15:23:12 +0800 Message-ID: <20260331072347.253-3-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|DUZPR04MB9968:EE_ X-MS-Office365-Filtering-Correlation-Id: 67a0fccb-ff38-4284-05b6-08de8ef6a2ad X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014|52116014|19092799006|18002099003|56012099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: LY1F7OlDZCAmdB6fv0ndJEWmMJ0IThJUwGAnJMvKQNmpK9pjVmF9Aet3qbINZ5hpaGEKjTWpgtnHoX4EbSuQAaRKIRo2cShZ1tiE6iPRXcDp8qQJivqKOsajWSeYan4pVH1GkGDMA4IXzRMOFzgka9Zk+3/zN12HV1tlSW+XGxiuu0G1zPxAV2xHBAOxUAVT3xjA0/v3Udz/mH2Ks6H3Rf2mVnUiGOn+KfWLERD0cA0er3qkObraIWawXUvMbQu3eJX6Phb05t9JxFV+MQPKZXE/tDOeP5y2s+2SQpTDyrHwAvJZFIx+F1YPBY0v+CKG/QNJR/Qbv8Gw8T6sh7N6qoZT/ngusyAVV8avF7dr0MySv0QsZKeMqUdGZI3HsoJcFEh111GzzuTYCs8V+Nug3tT71lGCBWfWcuMUDqz8+GrJLxCaAQ1PwJghXV40Y7/VJHaadgWDl69HbGQKKDQb5ykK31VSDZkUZjN1tS8DFIQrcd0bMh2nVerUsCXNxlogMsP6craJSDsb819hHRBJcjSmKxttnLme70uf2pDLplbQYvXBbBaqU/fS/KkjrDtG3GnM6eMnW0N9CYPPBsIDiuCtJoOiCgLLHqQZ5LCw2NauPdsnJXeYKFys9DdLLcv9V1JPdKFuK6f+1h8ud5CjxAopnucKvG4qTMc/cV+qWzxVzKA59x2BKapNKCLXuxxh3rxxrwCRK5EDJU5CvMv2P+p0bUA6IeJfPFnFQtDA5lUFAgo5ZWqd2XlGJsJRq4ACVPyuMvZMwptRpNaWJna/h1RlSXSL3yZaUxRcne3eQuo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014)(52116014)(19092799006)(18002099003)(56012099003)(22082099003)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?HnV8ISG44Ta4yoHE55NM0hbD/D9WnWE1yC8DYVeWRpHn/IPatVMOQLm1p8Bx?= =?us-ascii?Q?PpL6qZY2oLv1J0oFiOPYKZfQQtzYBIO1n0x49GMc5QUjGTngqK6FqeCXGp3J?= =?us-ascii?Q?YokxLvYpmmhfLU9v1PAXYkd35iI5H48HPDZBFqYkw04ZrRhin6NhFYgtn73J?= =?us-ascii?Q?zAAKaUnRRBbhT/AXJsN/RiCKU9fLVjfjZDqgmaiQj0ZSYQvDvhyhOLTS2gx5?= =?us-ascii?Q?FkDPZYiFdEL3zhKfgrnZqozYyvGRwXbxEBc0E5H3Wn3meb1Oilq7sE3gq6lx?= =?us-ascii?Q?DqIRhTWegv9k8Ocz0UJFkNFXZEuYbc0uStI6ZgWwSouxwOq3bKBujhqbRMpg?= =?us-ascii?Q?H5JpG1mYQ307J+ds2voErOhN++NR8Igmdm5o2zej+jLcgGfgc+uMST9BIOaD?= =?us-ascii?Q?bGKk+U7ussMOKIHpJbwwsFHSjbKT/5mxfpeLgFLFstM2xIMSF2DgffsOO2lh?= =?us-ascii?Q?6rlPRFFAg7qmup9dJ2eeTlgi4WivtpffiQ+cmNyMTDu/KyMBS346cpv1xFAo?= =?us-ascii?Q?mC8II1iN7CdWSl2eFMLiH+ETJwKCYDoulIxTMcuOi83QuOCtijDiGwKdnVEW?= =?us-ascii?Q?LWiR2Efk/MrnwQGfzoNLGhjxb9Zc8gaie2zYvVWDqGjmphCnZ/FRnee5Hfop?= =?us-ascii?Q?LPsNT17oegSQUtMYcnAcMNtdI0d6vlI7k5OXPb8owLMNiwieKLJRVtJf26b3?= =?us-ascii?Q?QJkYxFEWqp0FCjmlllS2GCrvRFLxwJ8RwgpDyH5QiqxMyXkA0yFCjmdvdX3i?= =?us-ascii?Q?Mohg3IEWMF1WolzBdy/dGkvUwaYVJUCelqKCLVwghAxCE/QHSM+ellGziLmH?= =?us-ascii?Q?2ZsF0mC3tGCp8Xg++qAXGsEVAyfrowUKHv2zLQKR2q3sy3dpCPfhTTk7Q9Qy?= =?us-ascii?Q?aAMXgBQbkT12vpFb1MJkWmOwXl+KdHx3Gf/LsTdwUeTNKOP1F1t/FmOZHABt?= =?us-ascii?Q?RNqc8sRYuy1rBE/29rAqgaLKIf6iVkc4OaUHkv0bzauyLcJtVdbPtcMJ65/n?= =?us-ascii?Q?0A0mg3oV0qX/IFpiNhawgKAqk3JYOEo87IDZ26zp3ZiCDLmb/m3bkKcArXoA?= =?us-ascii?Q?62CG8+nSgCqZcXparrutlycLg06KPLAIqlJFSF2tNAz68AtJogVUhln8DKf4?= =?us-ascii?Q?/V7ZT1q5YIsBmf9Pp7GDe+fdgdGZY+YZuzDfKme8bAS/jDP4Cg5zqH/QNyt6?= =?us-ascii?Q?JoQMFsJEJ06trrm1L5EXv9ufjfQEnaCei4Sc5QbZ/Wd3FzEMjL4NGo7VLXG6?= =?us-ascii?Q?sgaPOScHIWVx4yKHEKUT13gMi8TLvkRr7myvadqEIkq1JF1oMjp3Tc7dH5Gx?= =?us-ascii?Q?gOW2uk0ZRLhsHgOjBhDsn5APkIljdM/AebNjEfY+dsaOKNDFK8GukHVV+9yp?= =?us-ascii?Q?wTi3Uh4G8c1QJjNESpXYiAsusFFgUW0nzRsV7EUridM7kLpPjuEZhEWkStKy?= =?us-ascii?Q?r1PIqNF942Nf1QqXpuNayIynMRRoprXEOBXcC8kdCjdporIZ8A+SJW03yq3G?= =?us-ascii?Q?VzNhMDOjOeFADnAiiTrThZpJFNIltUgovfQWSwQCw4uoFHjPjEKRZz9QRKoa?= =?us-ascii?Q?wP4O6qVcVkT4cmxWojJZiESQ7cvU3f9O3PtkQn7DsbW7uj8SaZAOX8pdrDF+?= =?us-ascii?Q?tIU8Ea5nJva7JFbjWZOXFz8yGxdwIOhpZVUsIrny9u+dEZ4AbfUpCqhgz/vj?= =?us-ascii?Q?riFyAptToOTpklg7k2/xFJuS85d68P3hQQIhRmWhOmXXK1ZkODT2w97tcon4?= =?us-ascii?Q?HL+1qt1Bqg=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 67a0fccb-ff38-4284-05b6-08de8ef6a2ad X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:07.8187 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vI6/grQU25kBrP1HTciMoh69kjWMA2wemTkHk5v1ehtRPmpAcBq43HBU0fQcJ1zVCT1CNeUSFmjV8pGkkIp2ew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DUZPR04MB9968 Content-Type: text/plain; charset="utf-8" From: Ming Qian Add documentation for the V4L2_CID_MEMORY_USAGE control in the userspace API documentation. This read-only control allows applications to query the total amount of memory currently used by a device instance. The documentation explains: - The control reports memory usage in bytes for driver-managed allocations - It includes internal buffers, intermediate processing data, and other driver allocations associated with the instance - Applications can use it for debugging, resource monitoring, and making informed buffer allocation decisions - The value may change dynamically during device operation - It only reports driver-managed memory, not application-allocated buffers Update V4L2_CID_LASTP1 definition to reflect the new control as the last predefined control ID. Signed-off-by: Ming Qian --- .../userspace-api/media/v4l/control.rst | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Documentation/userspace-api/media/v4l/control.rst b/Documentat= ion/userspace-api/media/v4l/control.rst index 19372bb32c4b..6904c5bdbf37 100644 --- a/Documentation/userspace-api/media/v4l/control.rst +++ b/Documentation/userspace-api/media/v4l/control.rst @@ -316,9 +316,29 @@ Control IDs set the alpha component value of all pixels for further processing in the device. =20 +``V4L2_CID_MEMORY_USAGE`` ``(integer64)`` + This is an optional read-only control that reports the total amount of + memory, in bytes, currently allocated and used by this device instance. + This includes memory used for internal buffers, intermediate processing + data, and any other driver-managed allocations associated with the + instance. + + Applications can use this control to monitor memory consumption for + debugging purposes, resource management, or to make informed decisions + about buffer allocation strategies. The value may change dynamically + as the device operates, for example when buffers are allocated or + released during streaming. + + Note that this control only reports memory managed by the driver for + this specific instance; it does not include memory allocated by the + application itself (e.g., userspace buffers passed to the driver). + + Not all drivers support this control. Applications should query for + its availability before use. + ``V4L2_CID_LASTP1`` End of the predefined control IDs (currently - ``V4L2_CID_ALPHA_COMPONENT`` + 1). + ``V4L2_CID_MEMORY_USAGE`` + 1). =20 ``V4L2_CID_PRIVATE_BASE`` ID of the first custom (driver specific) control. Applications --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11013028.outbound.protection.outlook.com [52.101.72.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C5113A63F2; Tue, 31 Mar 2026 07:25:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.72.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941920; cv=fail; b=aZFctHqglwh4jE2YSl2loUENFqS0KFEwNVhQHppoQGvJdXtwOXTbPuQrMIv67ZHR+FvueckkfJdI3cXM9aGDAxoVUAVL0a2H1PKP61obbW+FufVYdE/2v24SQgDdt6tNVzrCKSJBWXn6hWFvULYub1cWLr7A+Ur5HBfUiV+5X0Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941920; c=relaxed/simple; bh=FaKrky4vn7jlxAivrAQapWGzpeTGaOcMVSKF8tlLPlE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=r9j1ylT9d4G8G9GuhqL16yUrNMapxF1qYkJEVri+1Qr9ERtHHwFzgJn7vYAeTCLbw1q4it2jMaiXGCsxsz4i5GZschnziCyJLc9fFpqkwwMiX4N3XvcT/EKdANiqLylSWhXEBQ4Er+74JXmWxUk4GcG2FysW+aUE/MmRkLNDTss= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=QYrs+y+H; arc=fail smtp.client-ip=52.101.72.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="QYrs+y+H" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LSn1PX8DuU9gfV58lk1FHfgOIX6pb6L7TEfg8DcOUUjx5hFihJe/T4e4CKsFBNC0APjtmaahFbB1FbRLaw/6ZXO5B9tKB9f6+ONPLqWggsZzkeROEXGYI38UEhsxEiSwIqG4IrCVl/qfL4erh3zo5nGkAsnOu958BOdgaxk1CMOxWIIAk7+2dnXGOfg3itkisMAUooSeWliISIJ82vT0r1oRR0+g9O0LhNS6cEBJ2PC5sXBOpH105+VevnLjrxqVNyhyah9zSAECRuhWzRHdTF5VCduhwsJmPi4QZ3vxJNxy9YlA+jLXXNCduYsTQ6scgB4R28DuQoEVHt21kMvjTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8UDKDpFdvlu+yHmlkw8x0m/80ZzvHagyajHrAnppOIs=; b=gcK9c0dlWYmWpbKuQZQAOpnxU3Y0ko9q4yLGgpQwaKECe8IdjfO6mZwa10FYUNx4zkhLDlE5+DZQY6K/hQVEEco+OpqJuMHHT/jugHGTQRPxzLvbfQxcOYOsV5alsOgP3YX5QrYySX4Q1gShFB0uQ5SZGYK72Bs7uk/xTPTbfuVBwtscQOhu5gWrtQrJMuRDGOzB1oXrxJS9JW8xBB0UA8qWWLGQKX6HJv7JpgfE1ietQzNMN9fyF0ZAvYxeQO2Eleg1fxloGRhqXmOLs8QLgdK+AYUFj+iMFlMAky43ulD0c+zleqy0s2yG1XNiSC+TwMLDVZ/LwijEp5cv696vDw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8UDKDpFdvlu+yHmlkw8x0m/80ZzvHagyajHrAnppOIs=; b=QYrs+y+HkfzuccplJMylBcn9sj1gayJF6mXeku+vBOoD6wrDmSxevXplMYTZX0AcuayTsVyqJlC+BPH7fmWrnVvOkMS/In8yDAcBg4RcF4O2eFgjW5VtQ/enX2/yYqkEPW2dyhjgRYKGB+J2FiUp5Va8jDiP46wmwA43Cx/XxrGV8Oa445jNQWrNU/kpKDRM8xu83bGt67h6jaj27UP0VuF6aJ0TwV0zdskq3lfBHNV7XnxDRABC1V5qfGUbugaUD6g+G7iMjZF+/3+BHsUHwIsYCuw1BVAQ6omWPlFNDxOELdJZ6FEgJHDHcfUxMLN1nr81jPVdTrn1jVeYkmOiPA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by DUZPR04MB9968.eurprd04.prod.outlook.com (2603:10a6:10:4d8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.28; Tue, 31 Mar 2026 07:25:13 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:13 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 3/7] media: v4l2-memtrack: Add V4L2 memory tracking infrastructure Date: Tue, 31 Mar 2026 15:23:13 +0800 Message-ID: <20260331072347.253-4-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|DUZPR04MB9968:EE_ X-MS-Office365-Filtering-Correlation-Id: adeb03fa-4526-4c61-0326-08de8ef6a613 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014|52116014|19092799006|18002099003|56012099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: f3x275k4wAiPxVpyQDS7foBv+tXzJh7Uc4fYaqmpOwx7Nic++1nc53TZ9oo6kQwBD/p+jhW2bmvUosvJUO6YmxujVzYj0c7hbulgI5HXXTl4OH6nOMwz0qBLw7SRIFA6+jkcFVwdB1gRNjwFDxjaABRTJwGiVQ6IZDSx1BZgozRtnOChJCk9DASC6XjvUudU9rbYXm9Z2N26oiQt10bBOQVhqq00VN7ZWihCKvVeImkFN0jdiCgwmKZ4++zJD462f2VwaTSzgXyMRzAxIGhZ7YADGmClmZ/+cO1zcTdMaNg5CNlWkOhR/Wud1Zgv1o0tGK/FI2E2mzzXpyY+oe2cOp+Qbzkm0o6KyOTgCE9GY6oO4/n1PdvQNGFpoEUh/4pcDj+nGhOj/H8rfIdKxXLfkmoBLC3GGXzcqBCUgfyLwGswtU8gyjyOn73j6fgHJj1dEH+15sZndHxVT46TRCEoyYPHXlpwwzBYYTcu5hgeK8L0Pbe3ej9hMoattX96tJdq4nAUBNIJ2XcDLGFFsboDRNCuHgerMCizOgwFV1Kf1FBIPww3+ONuGEzNb8H6FoYVGJvJQQu9kPot5d+q3nih6028PXA96/3h4v43i5Efsno9a5KowClw0o90fBl522oROy8p02otPtfDxr/9E2dlN5gpWBAB2BqslBRgZLN8/+cqf+Y0adjHSjv9DQpkv4YDHDXlS3gSbhAYhQMcr1SJk86OGcEsdlScH+9T6/7XaDtAGm94EtL1UCsX4SyArWZ5iw1I2OryUTJSUTiJLe7j49Q5+PyZgZhpg8LKJc+JTuE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014)(52116014)(19092799006)(18002099003)(56012099003)(22082099003)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4SSHuxiIGM1RIHPp+hx9BQgtiqq4pfF8B3rp8VCdo3ZXg1vO1GEfq1BxCLG1?= =?us-ascii?Q?R4kXxUzfsiyz+s/wPVjQdJciYqOHR5cUWmEI4a1XQVi/6tnTu4uXNksRQp5D?= =?us-ascii?Q?PGXJKHNptXykfjtgMsKhNub9KyKaYICD7rejtjeoWZvdrbZPcHMYq3DpEc2d?= =?us-ascii?Q?q89QPrwc5v3jdA5TYM30Y6tsdCea+cqFgNM7udXkER/sxVpMNuxHT9ZjUhnY?= =?us-ascii?Q?9aoSH1OCLGafD6aU2sR0+PXdTZMBKXNgZDAqEi46EoEASgWE1o89EyDDFoK3?= =?us-ascii?Q?/eoO2dYenv3SC10OnJ6KEqhqtaXdS3VTk2TJoYmFSPZAy9XEJvD1hGN9uMUE?= =?us-ascii?Q?y7cAcY4m7eMH6ju9UJbQhhROPoxh1M8mVhs5HOTRJ0gZfr15ruKwZXFWJxVu?= =?us-ascii?Q?naZE73sAHbuzirKVFoJ57Q7+NIvKFAJdSRrS2DitGyrSwkXVSLRoe3FSUT0O?= =?us-ascii?Q?u4KSXcRUDE91Vw2OgVLCmIlKfwtiUk3n2oe536OrT7pk25q1T4crw+MWm9s8?= =?us-ascii?Q?FMlp3INFMF9bjHyj21QolJQOhjH6uCltEPC+Ky8mGtI12GE7Cd8EDm+sYi0g?= =?us-ascii?Q?iOxNZZHEWImSoGL/rBhXfrjTBqudCodvGSYSwssOMTi1z0c8xU9spmP1wMEj?= =?us-ascii?Q?ewQuw0pBqrhbSIfCKohum/kw2uLY5o703dxeSUum+qUhP5rbtk5yu2W02hJZ?= =?us-ascii?Q?VN8UjCDVOTFcTnCb1vEZ1lvW9BY6gnUdM5XSHR31kqLPCZDb5N68JWUpIxgU?= =?us-ascii?Q?rz0yv3s+8GMnxNDTWHqw5Wxfo15N58S9ggDcrmaM8BHZiJ+zMycXzeAwpStt?= =?us-ascii?Q?D3CuVfscAe8T4rbzBPF1yHchjlQnIJ7a/xC6I7XUyubSug4VAUlgNAYth+rF?= =?us-ascii?Q?rimjgZq5XKRVclh8EUOvz8eluAlytBb+H2ocWMjOIvyxm+pxErRPYz37Ri3r?= =?us-ascii?Q?SnWEjxwmbDZrX2FgkOiApeonO4xLJGwTsdaJBWPynte+A18q2YaGEI8+J/6T?= =?us-ascii?Q?ewhzuiKsBzN8OU4N5+qU9BmPe3HDGIHlMV6/3oKwL53oX+BHXu24sdqjlO/t?= =?us-ascii?Q?btIUMdxv1WuW0uSBaOTtNJw1ZKRA0j/MfD9iSzw1FfTv6/GsTBMv2OifpA9J?= =?us-ascii?Q?sDWhZ/FduDNzwFRhRAW2Af4mrkiv/8vKQeEYJDkM5DlU2NMp+zEpacR7WXLE?= =?us-ascii?Q?WK8BnuAUargqoK6tJ7atLp4PUOOkYLa+xkRipsbQmSxhrPgsL4JLeo191rN/?= =?us-ascii?Q?xXNc43ZmjjFpKb6RVuZoNsucsD8ncVLcj9Dwq1kYzsgKCLUW8rbwfkOFnYVJ?= =?us-ascii?Q?zirwrcHlWLrbhTYxbhDc45wmQxQP6tX2mGA8ySF+skKTLoFJk5XouhSS+JTP?= =?us-ascii?Q?G3+qps8dJtBLAw1BMinXEZ2rEmBVDoPQNYDbUlkiiqtt3JJdL06YQtjITg57?= =?us-ascii?Q?2hbFSilI1TobXiU821R2SoH1pYJaZQymZJvgq4gOMKCG7yV0U3JMgXPrnf1b?= =?us-ascii?Q?bTtG8litax9D8BOR4uf7woFoMrM1zUpp6p+0fVLNFAf5/96qethOYrw8I/Vu?= =?us-ascii?Q?1/eZO1BmH0vhPTHThhBilphGUxIVcQjcATUDlbgX+NUaAE/8pFAKNgsgkPnb?= =?us-ascii?Q?in1gpN5di7+cixyY4MlLQv5x+VqqoN306rV2nbEicsjxPf5ZDQU80WIFWnLf?= =?us-ascii?Q?pfkBfl3nfRDDKNJnrr0AdO4wLc2v3hTqvMjdSGLQ39R2nBF1bNmofMOmg1Uv?= =?us-ascii?Q?JNQxla8pjQ=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: adeb03fa-4526-4c61-0326-08de8ef6a613 X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:13.5370 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: j6zt2eLODj4EPvxanosaxeMS9jlOJO6NXdw3Y1BPviO/3lmKj7Bh9owgGfOBDy5AynIMzZmYPvNvgwkc7FFWCQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DUZPR04MB9968 Content-Type: text/plain; charset="utf-8" From: Ming Qian Add a hierarchical memory tracking system for V4L2 devices that allows drivers to monitor and report memory usage. This infrastructure provides: - Tree-structured memory tracking with parent-child relationships - Per-node memory accounting with allocation counts - Automatic aggregation of memory usage up the hierarchy - debugfs interface for inspecting memory usage trees - Notification callbacks for memory usage changes The tracking system uses a context-based design where each root node creates its own tracking tree. Memory changes propagate notifications up the tree, allowing drivers to update controls or take other actions. The debugfs interface creates entries under /v4l2-memtrack/ showing hierarchical memory usage with indentation, allocation counts, and process information. Drivers can use this to track internal buffers, intermediate processing data, and other allocations, providing visibility into memory consumption for debugging and resource monitoring. Signed-off-by: Ming Qian --- drivers/media/common/Kconfig | 1 + drivers/media/common/Makefile | 2 +- drivers/media/common/v4l2-memtrack/Kconfig | 19 + drivers/media/common/v4l2-memtrack/Makefile | 3 + .../common/v4l2-memtrack/v4l2-memtrack.c | 825 ++++++++++++++++++ include/media/v4l2-memtrack.h | 220 +++++ 6 files changed, 1069 insertions(+), 1 deletion(-) create mode 100644 drivers/media/common/v4l2-memtrack/Kconfig create mode 100644 drivers/media/common/v4l2-memtrack/Makefile create mode 100644 drivers/media/common/v4l2-memtrack/v4l2-memtrack.c create mode 100644 include/media/v4l2-memtrack.h diff --git a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig index adcb6655385a..4da632f53970 100644 --- a/drivers/media/common/Kconfig +++ b/drivers/media/common/Kconfig @@ -27,5 +27,6 @@ config VIDEO_TVEEPROM source "drivers/media/common/b2c2/Kconfig" source "drivers/media/common/saa7146/Kconfig" source "drivers/media/common/siano/Kconfig" +source "drivers/media/common/v4l2-memtrack/Kconfig" source "drivers/media/common/v4l2-tpg/Kconfig" source "drivers/media/common/videobuf2/Kconfig" diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile index c5ab905e7c20..0010a4d904ca 100644 --- a/drivers/media/common/Makefile +++ b/drivers/media/common/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only -obj-y +=3D b2c2/ saa7146/ siano/ v4l2-tpg/ videobuf2/ +obj-y +=3D b2c2/ saa7146/ siano/ v4l2-memtrack/ v4l2-tpg/ videobuf2/ =20 # Please keep it alphabetically sorted by Kconfig name # (e. g. LC_ALL=3DC sort Makefile) diff --git a/drivers/media/common/v4l2-memtrack/Kconfig b/drivers/media/com= mon/v4l2-memtrack/Kconfig new file mode 100644 index 000000000000..f4c97117b779 --- /dev/null +++ b/drivers/media/common/v4l2-memtrack/Kconfig @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config V4L2_MEMTRACK + tristate "V4L2 memory usage tracking support" + help + This option enables hierarchical memory allocation tracking + for V4L2 devices. It provides: + + - Tree-structured memory usage monitoring + - Per-device and per-context tracking + - debugfs interface at /sys/kernel/debug/v4l2-memtrack/ + - Optional V4L2 control for userspace queries + + This is useful for debugging memory leaks and monitoring + buffer allocation in video drivers. + + To compile this as a module, choose M here. + + If unsure, say N. diff --git a/drivers/media/common/v4l2-memtrack/Makefile b/drivers/media/co= mmon/v4l2-memtrack/Makefile new file mode 100644 index 000000000000..5ed59453b35a --- /dev/null +++ b/drivers/media/common/v4l2-memtrack/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only + +obj-$(CONFIG_V4L2_MEMTRACK) +=3D v4l2-memtrack.o diff --git a/drivers/media/common/v4l2-memtrack/v4l2-memtrack.c b/drivers/m= edia/common/v4l2-memtrack/v4l2-memtrack.c new file mode 100644 index 000000000000..96eeaef7a653 --- /dev/null +++ b/drivers/media/common/v4l2-memtrack/v4l2-memtrack.c @@ -0,0 +1,825 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * V4L2 Memory Usage Tracker + * + * Copyright 2026 NXP + * + * Provides hierarchical memory allocation tracking for V4L2 devices. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define V4L2_MEMTRACK_DEBUGFS_ROOT "v4l2-memtrack" +#define V4L2_MEMTRACK_MAX_DEPTH 16 + +/** + * struct v4l2_memtrack_ctx - Memory tracker context + * @name: Tracker name (shown in debugfs) + * @root: Root node of tracking hierarchy + * @debugfs: debugfs file entry + * @lock: Protects the node tree + */ +struct v4l2_memtrack_ctx { + const char *name; + struct v4l2_memtrack_node *root; + struct dentry *debugfs; + struct mutex lock; +}; + +/** + * struct v4l2_memtrack_node - Memory tracking node + * @list: Linkage in parent's children list + * @parent: Parent node + * @children: List of child nodes + * @bytes: Memory usage in bytes + * @alloc_count: Number of allocations + * @name: Node name + * @depth: Depth of this node in the tree (root =3D 0) + * @pid: Process ID that created this node + * @tgid: Thread group ID that created this node + * @ctx: Back pointer to context + * @is_leaf: True if this is a leaf node (internal use only) + * @notify: Notification callback for memory changes + * @notify_priv: Private data for notification callback + * @notify_work: Per-node delayed work for coalesced notifications + * @notify_delay_ms: Notification delay (<0: off, 0: immediate, >0: delaye= d) + * @in_notify: Flag indicating if callback is currently executing + * @notify_done: Completion for waiting on callback completion + */ +struct v4l2_memtrack_node { + struct list_head list; + struct v4l2_memtrack_node *parent; + struct list_head children; + + size_t bytes; + unsigned int alloc_count; + + const char *name; + unsigned int depth; + pid_t pid; + pid_t tgid; + + struct v4l2_memtrack_ctx *ctx; + bool is_leaf; + + /* Notify fields - only used by non-leaf nodes */ + v4l2_memtrack_notify_fn notify; + void *notify_priv; + struct delayed_work notify_work; + int notify_delay_ms; + bool in_notify; + struct completion notify_done; +}; + +static struct dentry *v4l2_memtrack_debugfs_root; +static DEFINE_MUTEX(v4l2_memtrack_debugfs_lock); +static struct kref v4l2_memtrack_debugfs_kref; +static bool v4l2_memtrack_debugfs_initialized; + +struct v4l2_memtrack_iter_state { + struct v4l2_memtrack_node *node; + struct list_head *next_child; +}; + +typedef int (*v4l2_memtrack_visit_fn)(struct v4l2_memtrack_node *node, voi= d *data); + +static int v4l2_memtrack_for_each_locked(struct v4l2_memtrack_node *root, + v4l2_memtrack_visit_fn visit, + void *data) +{ + struct v4l2_memtrack_iter_state stack[V4L2_MEMTRACK_MAX_DEPTH]; + struct v4l2_memtrack_node *node; + int sp =3D 0; + int ret; + + lockdep_assert_held(&root->ctx->lock); + + ret =3D visit(root, data); + if (ret) + return ret; + + if (list_empty(&root->children)) + return 0; + + stack[sp].node =3D root; + stack[sp].next_child =3D root->children.next; + sp++; + + while (sp > 0) { + struct v4l2_memtrack_iter_state *top =3D &stack[sp - 1]; + + if (top->next_child =3D=3D &top->node->children) { + sp--; + continue; + } + + node =3D list_entry(top->next_child, + struct v4l2_memtrack_node, list); + top->next_child =3D top->next_child->next; + + ret =3D visit(node, data); + if (ret) + return ret; + + if (!list_empty(&node->children) && + sp < V4L2_MEMTRACK_MAX_DEPTH) { + stack[sp].node =3D node; + stack[sp].next_child =3D node->children.next; + sp++; + } + } + + return 0; +} + +static void v4l2_memtrack_debugfs_release(struct kref *kref) +{ + debugfs_remove(v4l2_memtrack_debugfs_root); + v4l2_memtrack_debugfs_root =3D NULL; + v4l2_memtrack_debugfs_initialized =3D false; +} + +static void v4l2_memtrack_debugfs_get(void) +{ + guard(mutex)(&v4l2_memtrack_debugfs_lock); + + if (!v4l2_memtrack_debugfs_initialized) { + kref_init(&v4l2_memtrack_debugfs_kref); + v4l2_memtrack_debugfs_root =3D + debugfs_create_dir(V4L2_MEMTRACK_DEBUGFS_ROOT, NULL); + v4l2_memtrack_debugfs_initialized =3D true; + } else { + kref_get(&v4l2_memtrack_debugfs_kref); + } +} + +static void v4l2_memtrack_debugfs_put(void) +{ + guard(mutex)(&v4l2_memtrack_debugfs_lock); + kref_put(&v4l2_memtrack_debugfs_kref, v4l2_memtrack_debugfs_release); +} + +static void v4l2_memtrack_notify_work_handler(struct work_struct *work); + +static int v4l2_memtrack_node_init(struct v4l2_memtrack_node *node, + struct v4l2_memtrack_ctx *ctx, + unsigned int depth, + const char *name, + bool is_leaf) +{ + INIT_LIST_HEAD(&node->list); + INIT_LIST_HEAD(&node->children); + node->bytes =3D 0; + node->alloc_count =3D 0; + node->ctx =3D ctx; + node->depth =3D depth; + node->tgid =3D current->tgid; + node->pid =3D current->pid; + node->is_leaf =3D is_leaf; + + /* Initialize notify fields only for non-leaf nodes */ + if (!is_leaf) { + node->notify =3D NULL; + node->notify_priv =3D NULL; + INIT_DELAYED_WORK(&node->notify_work, + v4l2_memtrack_notify_work_handler); + node->notify_delay_ms =3D 0; + node->in_notify =3D false; + init_completion(&node->notify_done); + } + + if (name) { + node->name =3D kstrdup_const(name, GFP_KERNEL); + if (!node->name) + return -ENOMEM; + } else { + node->name =3D NULL; + } + + return 0; +} + +static inline const char *v4l2_memtrack_name(struct v4l2_memtrack_node *no= de) +{ + return node->name ? : "(unnamed)"; +} + +static int v4l2_memtrack_sum_visitor(struct v4l2_memtrack_node *node, void= *data) +{ + size_t *total =3D data; + + *total +=3D node->bytes; + return 0; +} + +static size_t v4l2_memtrack_sum_bytes_locked(struct v4l2_memtrack_node *ro= ot) +{ + size_t total =3D 0; + + lockdep_assert_held(&root->ctx->lock); + + v4l2_memtrack_for_each_locked(root, v4l2_memtrack_sum_visitor, &total); + return total; +} + +static void v4l2_memtrack_do_notify_locked(struct v4l2_memtrack_node *node) +{ + size_t total; + v4l2_memtrack_notify_fn notify; + void *priv; + struct v4l2_memtrack_ctx *ctx =3D node->ctx; + + lockdep_assert_held(&ctx->lock); + + if (!node->notify) + return; + + total =3D v4l2_memtrack_sum_bytes_locked(node); + notify =3D node->notify; + priv =3D node->notify_priv; + + node->in_notify =3D true; + reinit_completion(&node->notify_done); + + mutex_unlock(&ctx->lock); + notify(node, total, priv); + mutex_lock(&ctx->lock); + + node->in_notify =3D false; + complete_all(&node->notify_done); +} + +static void v4l2_memtrack_notify_work_handler(struct work_struct *work) +{ + struct v4l2_memtrack_node *node =3D + container_of(to_delayed_work(work), + struct v4l2_memtrack_node, notify_work); + struct v4l2_memtrack_ctx *ctx =3D node->ctx; + + guard(mutex)(&ctx->lock); + v4l2_memtrack_do_notify_locked(node); +} + +static void v4l2_memtrack_schedule_notify(struct v4l2_memtrack_node *node) +{ + int delay; + + if (node->is_leaf || !node->notify) + return; + + delay =3D node->notify_delay_ms; + if (delay < 0) + return; + + if (delay =3D=3D 0) + v4l2_memtrack_do_notify_locked(node); + else + schedule_delayed_work(&node->notify_work, + msecs_to_jiffies(delay)); +} + +static void v4l2_memtrack_notify_change_locked(struct v4l2_memtrack_node *= node) +{ + struct v4l2_memtrack_node *cur; + + lockdep_assert_held(&node->ctx->lock); + + for (cur =3D node; cur; cur =3D cur->parent) { + if (!cur->is_leaf) + v4l2_memtrack_schedule_notify(cur); + } +} + +static void v4l2_memtrack_do_notify(struct v4l2_memtrack_node *node) +{ + if (!node || !node->ctx) + return; + + guard(mutex)(&node->ctx->lock); + v4l2_memtrack_notify_change_locked(node); +} + +struct v4l2_memtrack_seq_ctx { + struct seq_file *seq; +}; + +static int v4l2_memtrack_seq_visitor(struct v4l2_memtrack_node *node, void= *data) +{ + struct v4l2_memtrack_seq_ctx *ctx =3D data; + struct seq_file *s =3D ctx->seq; + size_t bytes; + + bytes =3D v4l2_memtrack_sum_bytes_locked(node); + + seq_printf(s, "%*s", node->depth * 2, ""); + + if (node->name) + seq_printf(s, "%s ", node->name); + + if (node->is_leaf) + seq_puts(s, "[leaf] "); + + if (node->tgid && node->pid) + seq_printf(s, "(tgid=3D%d, pid=3D%d) ", node->tgid, node->pid); + + seq_printf(s, "usage: %zu", bytes); + + if (node->alloc_count > 1 || (node->alloc_count =3D=3D 1 && !list_empty(&= node->children))) { + seq_printf(s, " (count=3D%u", node->alloc_count); + if (!list_empty(&node->children)) + seq_printf(s, ", self=3D%zu", node->bytes); + seq_puts(s, ")"); + } + + seq_puts(s, "\n"); + return 0; +} + +static int v4l2_memtrack_seq_show(struct seq_file *s, void *data) +{ + struct v4l2_memtrack_ctx *ctx =3D s->private; + struct v4l2_memtrack_seq_ctx seq_ctx =3D { .seq =3D s }; + + guard(mutex)(&ctx->lock); + + seq_printf(s, "Total memory usage: %zu bytes\n", + v4l2_memtrack_sum_bytes_locked(ctx->root)); + v4l2_memtrack_for_each_locked(ctx->root, v4l2_memtrack_seq_visitor, &seq_= ctx); + + return 0; +} + +static int v4l2_memtrack_debugfs_open(struct inode *inode, struct file *fi= le) +{ + return single_open(file, v4l2_memtrack_seq_show, inode->i_private); +} + +static const struct file_operations v4l2_memtrack_debugfs_fops =3D { + .owner =3D THIS_MODULE, + .open =3D v4l2_memtrack_debugfs_open, + .release =3D single_release, + .read =3D seq_read, + .llseek =3D seq_lseek, +}; + +static void v4l2_memtrack_create_debugfs(struct v4l2_memtrack_ctx *ctx) +{ + guard(mutex)(&v4l2_memtrack_debugfs_lock); + + if (IS_ERR_OR_NULL(v4l2_memtrack_debugfs_root)) + return; + + ctx->debugfs =3D debugfs_create_file(ctx->name, 0444, + v4l2_memtrack_debugfs_root, + ctx, &v4l2_memtrack_debugfs_fops); +} + +static struct v4l2_memtrack_ctx *v4l2_memtrack_ctx_create(const char *name) +{ + struct v4l2_memtrack_ctx *ctx; + + ctx =3D kzalloc_obj(*ctx); + if (!ctx) + return NULL; + + if (name) { + ctx->name =3D kstrdup_const(name, GFP_KERNEL); + if (!ctx->name) { + kfree(ctx); + return NULL; + } + } + + mutex_init(&ctx->lock); + + return ctx; +} + +static void v4l2_memtrack_ctx_destroy(struct v4l2_memtrack_ctx *ctx) +{ + debugfs_remove(ctx->debugfs); + mutex_destroy(&ctx->lock); + kfree_const(ctx->name); + kfree(ctx); + v4l2_memtrack_debugfs_put(); +} + +struct v4l2_memtrack_node *v4l2_memtrack_create_root(const char *name) +{ + struct v4l2_memtrack_ctx *ctx; + struct v4l2_memtrack_node *node; + + v4l2_memtrack_debugfs_get(); + + ctx =3D v4l2_memtrack_ctx_create(name); + if (!ctx) { + v4l2_memtrack_debugfs_put(); + return NULL; + } + + node =3D kzalloc_obj(*node); + if (!node) { + v4l2_memtrack_ctx_destroy(ctx); + return NULL; + } + + if (v4l2_memtrack_node_init(node, ctx, 0, name, false)) { + kfree(node); + v4l2_memtrack_ctx_destroy(ctx); + return NULL; + } + + ctx->root =3D node; + + if (name) + v4l2_memtrack_create_debugfs(ctx); + + return node; +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_create_root); + +struct v4l2_memtrack_node *v4l2_memtrack_create_node(struct v4l2_memtrack_= node *parent, + const char *name) +{ + struct v4l2_memtrack_ctx *ctx; + struct v4l2_memtrack_node *node; + unsigned int new_depth; + + if (!parent || !parent->ctx) + return NULL; + + /* Leaf nodes cannot have children */ + if (parent->is_leaf) { + pr_warn_once("v4l2-memtrack: cannot create child under leaf node\n"); + return NULL; + } + + new_depth =3D parent->depth + 1; + if (new_depth >=3D V4L2_MEMTRACK_MAX_DEPTH) { + pr_warn_once("v4l2-memtrack: max depth %d reached, cannot create child n= ode\n", + V4L2_MEMTRACK_MAX_DEPTH); + return NULL; + } + + ctx =3D parent->ctx; + + node =3D kzalloc_obj(*node); + if (!node) + return NULL; + + if (v4l2_memtrack_node_init(node, ctx, new_depth, name, false)) { + kfree(node); + return NULL; + } + + node->parent =3D parent; + + scoped_guard(mutex, &ctx->lock) + list_add_tail(&node->list, &parent->children); + + return node; +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_create_node); + +static void v4l2_memtrack_cancel_notify(struct v4l2_memtrack_node *node) +{ + bool wait_needed =3D false; + + if (node->is_leaf) + return; + + cancel_delayed_work_sync(&node->notify_work); + + scoped_guard(mutex, &node->ctx->lock) { + node->notify =3D NULL; + node->notify_priv =3D NULL; + wait_needed =3D node->in_notify; + } + + if (wait_needed) + wait_for_completion(&node->notify_done); +} + +static void v4l2_memtrack_delete_subtree_locked(struct v4l2_memtrack_node = *root) +{ + struct v4l2_memtrack_ctx *ctx =3D root->ctx; + struct v4l2_memtrack_node * const stop =3D root->parent; + struct v4l2_memtrack_node *node, *parent; + + lockdep_assert_held(&ctx->lock); + + node =3D root; + while (node) { + if (!list_empty(&node->children)) { + node =3D list_first_entry(&node->children, + struct v4l2_memtrack_node, list); + } else { + parent =3D node->parent; + list_del(&node->list); + kfree_const(node->name); + kfree(node); + + if (parent =3D=3D stop) + break; + node =3D parent; + } + } +} + +static int v4l2_memtrack_find_notify_visitor(struct v4l2_memtrack_node *no= de, + void *data) +{ + struct v4l2_memtrack_node **found =3D data; + + if (!node->is_leaf && node->notify) { + *found =3D node; + return 1; /* Stop iteration */ + } + return 0; +} + +static struct v4l2_memtrack_node * +v4l2_memtrack_get_next_notify_node_locked(struct v4l2_memtrack_node *root) +{ + struct v4l2_memtrack_node *found =3D NULL; + + lockdep_assert_held(&root->ctx->lock); + + v4l2_memtrack_for_each_locked(root, v4l2_memtrack_find_notify_visitor, + &found); + return found; +} + +void v4l2_memtrack_destroy_node(struct v4l2_memtrack_node *node) +{ + struct v4l2_memtrack_ctx *ctx; + struct v4l2_memtrack_node *parent; + struct v4l2_memtrack_node *notify_node; + bool is_root; + + if (!node || !node->ctx) + return; + + ctx =3D node->ctx; + parent =3D node->parent; + is_root =3D !parent; + + if (v4l2_memtrack_read(node)) + v4l2_memtrack_print_debug(node); + + /* + * Cancel all notify callbacks in the subtree. + * Get one node with notify at a time while holding lock, + * then cancel it without lock to avoid deadlock. + */ + if (!node->is_leaf) { + while (true) { + scoped_guard(mutex, &ctx->lock) + notify_node =3D v4l2_memtrack_get_next_notify_node_locked(node); + + if (!notify_node) + break; + + v4l2_memtrack_cancel_notify(notify_node); + } + } + + scoped_guard(mutex, &ctx->lock) + v4l2_memtrack_delete_subtree_locked(node); + + if (is_root) + v4l2_memtrack_ctx_destroy(ctx); + else + v4l2_memtrack_do_notify(parent); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_destroy_node); + +static int v4l2_memtrack_create_leaf_locked(struct v4l2_memtrack_node *nod= e, + size_t bytes, const char *name) +{ + struct v4l2_memtrack_ctx *ctx =3D node->ctx; + struct v4l2_memtrack_node *child; + unsigned int new_depth; + + lockdep_assert_held(&ctx->lock); + + new_depth =3D node->depth + 1; + if (new_depth >=3D V4L2_MEMTRACK_MAX_DEPTH) { + pr_warn_once("v4l2-memtrack: max depth %d reached\n", + V4L2_MEMTRACK_MAX_DEPTH); + return -ENOSPC; + } + + child =3D kzalloc(sizeof(*child), GFP_KERNEL); + if (!child) + return -ENOMEM; + + if (v4l2_memtrack_node_init(child, ctx, new_depth, name, true)) { + kfree(child); + return -ENOMEM; + } + + child->parent =3D node; + child->bytes =3D bytes; + child->alloc_count =3D 1; + + list_add_tail(&child->list, &node->children); + + return 0; +} + +void v4l2_memtrack_add(struct v4l2_memtrack_node *node, size_t bytes, + const char *name) +{ + if (!node || !node->ctx) + return; + + /* Leaf nodes cannot have children */ + if (node->is_leaf) { + pr_warn_once("v4l2-memtrack: cannot add to leaf node\n"); + return; + } + + guard(mutex)(&node->ctx->lock); + + if (name) { + /* Create a leaf node for named allocations */ + if (v4l2_memtrack_create_leaf_locked(node, bytes, name) < 0) { + /* Fallback to direct tracking on failure */ + node->bytes +=3D bytes; + node->alloc_count++; + } + } else { + /* Direct tracking for unnamed allocations */ + node->bytes +=3D bytes; + node->alloc_count++; + } + + v4l2_memtrack_notify_change_locked(node); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_add); + +void v4l2_memtrack_sub(struct v4l2_memtrack_node *node, size_t bytes, + const char *name) +{ + struct v4l2_memtrack_node *child; + struct v4l2_memtrack_node *found =3D NULL; + + if (!node || !node->ctx) + return; + + guard(mutex)(&node->ctx->lock); + + /* Try to find and remove a matching leaf node if name is provided */ + if (name && !node->is_leaf) { + list_for_each_entry(child, &node->children, list) { + if (!child->is_leaf) + continue; + if (child->bytes !=3D bytes) + continue; + if (!child->name || strcmp(child->name, name)) + continue; + + list_del(&child->list); + found =3D child; + break; + } + } + + if (found) { + kfree_const(found->name); + kfree(found); + } else { + /* Direct subtraction */ + if (node->bytes < bytes) { + pr_warn_once("v4l2-memtrack: %s: bytes underflow\n", + v4l2_memtrack_name(node)); + node->bytes =3D 0; + } else { + node->bytes -=3D bytes; + } + + if (node->alloc_count > 0) + node->alloc_count--; + } + + v4l2_memtrack_notify_change_locked(node); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_sub); + +void v4l2_memtrack_set(struct v4l2_memtrack_node *node, size_t bytes) +{ + if (!node || !node->ctx) + return; + + guard(mutex)(&node->ctx->lock); + + node->bytes =3D bytes; + node->alloc_count =3D bytes ? 1 : 0; + v4l2_memtrack_notify_change_locked(node); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_set); + +size_t v4l2_memtrack_read(struct v4l2_memtrack_node *node) +{ + struct v4l2_memtrack_ctx *ctx; + size_t total; + + if (!node || !node->ctx) + return 0; + + ctx =3D node->ctx; + + scoped_guard(mutex, &ctx->lock) + total =3D v4l2_memtrack_sum_bytes_locked(node); + + return total; +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_read); + +int v4l2_memtrack_register_notify(struct v4l2_memtrack_node *node, + v4l2_memtrack_notify_fn notify, + void *priv) +{ + if (!node || !node->ctx) + return -EINVAL; + + /* Leaf nodes do not support notifications */ + if (node->is_leaf) + return -EINVAL; + + guard(mutex)(&node->ctx->lock); + + if (node->notify) + return -EBUSY; + + node->notify =3D notify; + node->notify_priv =3D priv; + + return 0; +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_register_notify); + +void v4l2_memtrack_unregister_notify(struct v4l2_memtrack_node *node) +{ + if (!node || !node->ctx || node->is_leaf) + return; + + v4l2_memtrack_cancel_notify(node); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_unregister_notify); + +void v4l2_memtrack_set_notify_delay(struct v4l2_memtrack_node *node, int d= elay_ms) +{ + if (!node || !node->ctx || node->is_leaf) + return; + + guard(mutex)(&node->ctx->lock); + node->notify_delay_ms =3D delay_ms; +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_set_notify_delay); + +static int v4l2_memtrack_print_visitor(struct v4l2_memtrack_node *node, vo= id *data) +{ + pr_debug("v4l2-memtrack: %*s%s%s: usage=3D%zu bytes, count=3D%u\n", + node->depth * 2, "", + v4l2_memtrack_name(node), + node->is_leaf ? " [leaf]" : "", + v4l2_memtrack_sum_bytes_locked(node), + node->alloc_count); + return 0; +} + +void v4l2_memtrack_print_debug(struct v4l2_memtrack_node *node) +{ + struct v4l2_memtrack_ctx *ctx; + + if (!node || !node->ctx) + return; + + ctx =3D node->ctx; + + pr_debug("v4l2-memtrack: Memory Tracker: %s\n", ctx->name ? : "(unnamed)"= ); + + scoped_guard(mutex, &ctx->lock) + v4l2_memtrack_for_each_locked(node, v4l2_memtrack_print_visitor, NULL); +} +EXPORT_SYMBOL_GPL(v4l2_memtrack_print_debug); + +MODULE_DESCRIPTION("V4L2 Memory Usage Tracker"); +MODULE_AUTHOR("Ming Qian "); +MODULE_LICENSE("GPL"); diff --git a/include/media/v4l2-memtrack.h b/include/media/v4l2-memtrack.h new file mode 100644 index 000000000000..b146277ab98f --- /dev/null +++ b/include/media/v4l2-memtrack.h @@ -0,0 +1,220 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * V4L2 Memory Usage Tracker + * + * Copyright 2026 NXP + * + * Provides hierarchical memory allocation tracking for V4L2 devices, + * useful for debugging memory leaks and monitoring buffer usage. + */ + +#ifndef _V4L2_MEMTRACK_H +#define _V4L2_MEMTRACK_H + +#include + +struct v4l2_memtrack_node; + +/** + * typedef v4l2_memtrack_notify_fn - Memory change notification callback + * @node: The node whose subtree memory usage changed + * @total: Total memory usage of the node's subtree in bytes + * @priv: Private data passed during registration + * + * This callback is invoked when memory usage changes in the node or any + * of its descendants. The callback is executed without holding internal + * locks, so it may call most kernel functions safely. + * + * However, the callback MUST NOT call v4l2_memtrack_unregister_notify() + * or v4l2_memtrack_destroy_node() on the same node, as this will cause + * a deadlock. The callback should be kept reasonably short to avoid + * delaying other pending notifications. + */ +typedef void (*v4l2_memtrack_notify_fn)(struct v4l2_memtrack_node *node, s= ize_t total, void *priv); + +#if IS_REACHABLE(CONFIG_V4L2_MEMTRACK) + +/** + * v4l2_memtrack_create_root - Create a root tracking node + * @name: Name for this tracker (shows in debugfs) + * + * Creates a root node that serves as the top of a tracking hierarchy. + * Each root node creates its own debugfs entry under /v4l2-memtr= ack/. + * + * Return: Pointer to the root node, or NULL on failure + */ +struct v4l2_memtrack_node *v4l2_memtrack_create_root(const char *name); + +/** + * v4l2_memtrack_create_node - Create a child tracking node + * @parent: Parent node + * @name: Optional name for this node + * + * Creates a child node under the specified parent. Child nodes + * contribute to their parent's total memory count. + * + * Return: Pointer to the new node, or NULL on failure + */ +struct v4l2_memtrack_node *v4l2_memtrack_create_node(struct v4l2_memtrack_= node *parent, + const char *name); + +/** + * v4l2_memtrack_destroy_node - Destroy a tracking node + * @node: Node to destroy + * + * Destroys the node and all its children. If this is a root node, + * also removes the debugfs entry and frees all resources. + */ +void v4l2_memtrack_destroy_node(struct v4l2_memtrack_node *node); + +/** + * v4l2_memtrack_add - Record a memory allocation + * @node: Tracking node + * @bytes: Number of bytes allocated + * @name: Optional name for the allocation + * + * Records a memory allocation. If @name is provided, creates an internal + * leaf node to track this specific allocation, which can be matched and + * removed later by v4l2_memtrack_sub() with the same name and size. + * If @name is NULL, adds bytes directly to the node's counter. + * + * Triggers notification callbacks on this node and all ancestors. + */ +void v4l2_memtrack_add(struct v4l2_memtrack_node *node, size_t bytes, + const char *name); + +/** + * v4l2_memtrack_sub - Record a memory free + * @node: Tracking node + * @bytes: Number of bytes freed + * @name: Optional name to match (must match what was passed to add) + * + * Records a memory deallocation. If @name is provided, searches for a + * matching internal leaf node (by name and size) and removes it. + * If no match is found or @name is NULL, subtracts directly from the + * node's counter. + * + * Triggers notification callbacks on this node and all ancestors. + */ +void v4l2_memtrack_sub(struct v4l2_memtrack_node *node, size_t bytes, + const char *name); + +/** + * v4l2_memtrack_set - Set memory usage directly + * @node: Tracking node + * @bytes: Total bytes to set + * + * Sets the node's memory counter to the specified value. + * Allocation count is set to 1 if bytes > 0, otherwise 0. + */ +void v4l2_memtrack_set(struct v4l2_memtrack_node *node, size_t bytes); + +/** + * v4l2_memtrack_read - Read total memory usage + * @node: Tracking node + * + * Returns the total memory usage of this node plus all its children. + * + * Return: Total memory usage in bytes + */ +size_t v4l2_memtrack_read(struct v4l2_memtrack_node *node); + +/** + * v4l2_memtrack_register_notify - Register notification callback + * @node: Tracking node + * @notify: Callback function + * @priv: Private data passed to callback + * + * Register a callback that is called when memory usage changes on this + * node or any of its descendants. Only one callback per node is supported. + * + * Return: 0 on success, -EINVAL if node is invalid, -EBUSY if callback + * already registered + */ +int v4l2_memtrack_register_notify(struct v4l2_memtrack_node *node, + v4l2_memtrack_notify_fn notify, + void *priv); + +/** + * v4l2_memtrack_unregister_notify - Unregister notification callback + * @node: The tracking node + * + * Unregisters the notification callback and waits for any in-progress + * callback to complete. + * + * NOTE: This function MUST be called before v4l2_memtrack_destroy_node() + * if a notify callback was registered. Failing to do so will trigger + * a WARN and may cause use-after-free. + */ +void v4l2_memtrack_unregister_notify(struct v4l2_memtrack_node *node); + +/** + * v4l2_memtrack_set_notify_delay - Set notification delay + * @node: Any node in the tracking tree + * @delay_ms: Delay in milliseconds + * < 0: disable notifications + * =3D 0: immediate notification (default) + * > 0: coalesce notifications within delay period + * + * Sets the notification delay for the entire tracking tree. + * When delay > 0, multiple updates within the delay period are + * coalesced into a single notification, reducing overhead for + * batch operations. + */ +void v4l2_memtrack_set_notify_delay(struct v4l2_memtrack_node *node, + int delay_ms); + +/** + * v4l2_memtrack_print_debug - Print memory usage to kernel log + * @node: Tracking node + * + * Prints the memory usage tree starting from this node using pr_debug(). + * Supports dynamic debug when CONFIG_DYNAMIC_DEBUG is enabled. + * + * Enable output with: + * echo 'file v4l2-memtrack.c +p' > /sys/kernel/debug/dynamic_debug/cont= rol + */ +void v4l2_memtrack_print_debug(struct v4l2_memtrack_node *node); + +#else /* !CONFIG_V4L2_MEMTRACK */ + +static inline struct v4l2_memtrack_node *v4l2_memtrack_create_root(const c= har *name) +{ + return NULL; +} + +static inline struct v4l2_memtrack_node *v4l2_memtrack_create_node( + struct v4l2_memtrack_node *parent, const char *name) +{ + return NULL; +} + +static inline void v4l2_memtrack_destroy_node(struct v4l2_memtrack_node *n= ode) {} + +static inline void v4l2_memtrack_add(struct v4l2_memtrack_node *node, + size_t bytes, const char *name) {} + +static inline void v4l2_memtrack_sub(struct v4l2_memtrack_node *node, + size_t bytes, const char *name) {} + +static inline void v4l2_memtrack_set(struct v4l2_memtrack_node *node, size= _t bytes) {} + +static inline size_t v4l2_memtrack_read(struct v4l2_memtrack_node *node) +{ + return 0; +} + +static inline int v4l2_memtrack_register_notify(struct v4l2_memtrack_node = *node, + v4l2_memtrack_notify_fn notify, + void *priv) +{ + return 0; +} + +static inline void v4l2_memtrack_unregister_notify(struct v4l2_memtrack_no= de *node) {} +static inline void v4l2_memtrack_set_notify_delay(struct v4l2_memtrack_nod= e *node, int delay_ms) {} +static inline void v4l2_memtrack_print_debug(struct v4l2_memtrack_node *no= de) {} + +#endif /* CONFIG_V4L2_MEMTRACK */ + +#endif /* _V4L2_MEMTRACK_H */ --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013057.outbound.protection.outlook.com [52.101.83.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFC0A3A3E61; Tue, 31 Mar 2026 07:25:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941924; cv=fail; b=NYB+O0GuOBiRiE66RDrr8Jn1xNbHNljI9LypdWYdDr/IEnFWL9VXsr8kjmW+bqly+gUdgkLh/UGC29BJkn2rQWHLbYHTPI6eLJtuGivRbPvoBv0jElfm+iYwKpa9bUpca51JQL54QgXUql0+C8V117ZiZDmNi9y57ofoTacdZO8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941924; c=relaxed/simple; bh=PTIb6L+GYWMJLvn1qLOeYSViYO7Wf2C3WLfDr6i6GOw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Us1OcZ1xApgeXilMuBManQJBodMx6eVh4T5GKXm70ffEEmEchSwcyL4oEVVWsNE4ppAjF7vAUI754x7lSmptczR2824VByD33sK/U5JcTsmF3hbtxUGz1DAi27hjKJBf7nvwVvPheXXpZ4oN02gNVXZLU9XyZ94psFxgTZB0qho= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=tTZkIgi7; arc=fail smtp.client-ip=52.101.83.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="tTZkIgi7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fmHzis3izGfIg2BKGqH8Ch7LDcBU9SX2oyb7Wd+loAvyKeaGTbucYn1PeIS/4otHq8yJH+uuz7JY26NN50M+GKvL0/L9BaFEHlL8U8yy7FBAXXehAmH9J6jg1g/uVMwDtXu302nS4perIZ14YuTnso7lIEdvLnCTklNcon3jfOBdJGPevw8m/GtbwTst3A0RJuyV/zJFj9+HbE4/tdlANH/mBfrss/IXD1SM9U0WXdYT71TeAGWcv+1RuOWiXQuOhXV7e7rWT7jVTYXWWAW84I4o2Yu5/nkcjh6Ci35iKx3Nesn1vTDk37DqBH3TCYgGC8DXXchwh53FUy/IGh3PDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=r+CqmAlU+kqqhqICDrE2zbMTt0+PF9OoA98TBchEJSg=; b=ebODNttBtsVSsLE7y5rT9tzjKq4V6RyVOvn2Y9l67myM60cMzFvjR7pLItxqsjmA9IoKa6LHMnG15n/ZeKcDtkmSwdXGmrIwCOJBsEYDohREfD/am9rL3rVeUrl4PludTKpjI4hncdRi+G5k3dhxgYHpRzGXErsVZAG7OT34ezHzJLmhHQuxxXAGO+KDZ3zlPTtTFQVqQJ33W/NIsOXOhUWnsPqHYipJfAcuMKYa7D8NuJsuBh5vJ4edMyw9xvFdLkIWtgRCfvUGr0Pw2NgoNX3t27wqBn46f2tEZCkl0FipkFVPDKsTkmV0WQZyGxCWCf7PfX+eC8k64Yz3T+j0pw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=r+CqmAlU+kqqhqICDrE2zbMTt0+PF9OoA98TBchEJSg=; b=tTZkIgi7DkUwLuaV9gM9hWsU4BIhz9QSBo3EsThrZ+LZAWTVXC18AHGw6tb/xfcYAEYYE5kT4UMVyHjb0lZ56KpzttBxEVnK/xiwHQIQINRNkIH/HhCSmPs6fT1I/HNCMfwlD+ZTqhRDgjOPZcqfF5BmAuaI1Um/fkVXGZi/kiOJJipPIoveXSbmxw3Ty1p+znAFHLi3+iEdHgW/4EUQC6sGdPIYju7BrsuMaCCCZpz4SS8UhsEDmb/lbQZyzxAKyLSt6KN3rZK5gC0jBAYE6aczpJckr522Uck/7/MAeoJYb2f5I9SKgFXILveBKMKKYIioEvaTvMCT6PTojJQnQA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by DUZPR04MB9968.eurprd04.prod.outlook.com (2603:10a6:10:4d8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.28; Tue, 31 Mar 2026 07:25:19 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:19 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 4/7] docs: media: v4l2-memtrack: Add driver API documentation Date: Tue, 31 Mar 2026 15:23:14 +0800 Message-ID: <20260331072347.253-5-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|DUZPR04MB9968:EE_ X-MS-Office365-Filtering-Correlation-Id: 7a67a62c-a326-4e0b-9b51-08de8ef6a96f X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014|52116014|19092799006|18002099003|56012099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: ehENZ++LXXgf1YoRIbi3K+LSvMmfF++fUvJmdbH0GsAokKry/lOFOgp3kWg90w/4J9WxG+n2zpRXasqdEYIwQ+SIPgkbkBLamSC/CJc/NAWrynMDpqm6jnKs1vhO2gdVJiJEUjiRAI/w+YcEzS4BfSDxx48bbHBw69NOV4CQbYKrDmuhUYSVmXBMas/z8IoY8Ojt7TqhNeqzgtOm4YmvIMDhw4rsfeLZJ7VKAko4/GMRRAJKoyTpJ3r7eyDYWbTi+2CLAPJRXP0C2DFFHYkZnxex9StvVmmX0gCQd0BwDkivfLhNbJXeRY3kTT6WwkFtpV1I68+trJUjCK9Q0nhHsMOTb7Upe6YuFMlCcCE/NSacvGC6btNCgjh+w6sgUJs08k5g7vq5W1o2EM/Ms9lBK74Po0B9tpyMaBLR9on/iAddvIKlt3kDQ/EC0lEcl4xYxYj1O/q1pXk45mw+2DojI+bo+WausjCC3yyeKsX2QmnsSisWqYL4A0H2UO9RkIrHpne+3kuqzcBgmGIkZbnRc/R1w8n6auvzsSiVv6x/vDNT0lNiWRqI/SIoHhGvtke+bdpBsP0Klz3rwje2ar+i75miKDMztJCvPtezkgHMWhWa60AzIR4OOR4hsoifR8y6fxcUf4/wP/OLS9/kXvzCn50f1KERTKpzE/M5lHQbI24TEN1Oc85ww4zyG3HL6nKaN27BiEH2zvcgAdJdPZeHZnA9n55cS3TMIOEoRd1mocwPJdeCSrLq+Rj/WO3zpFYK/Kd2U5lxVA+wajdBJpUExfylX32ywBrvsraKNQYcvJ0= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014)(52116014)(19092799006)(18002099003)(56012099003)(22082099003)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dVVJN2pLb0JqVzBSTnppM0UwQXhsYVcrT3JaRjZQNUREYXFqVXgyUDNZQ0dy?= =?utf-8?B?N3ROSXp0a1NYem8zWUswc1ZtWFA1Vm5TMVVWS2J4VC9ycFEydnVNaEFiWU1S?= =?utf-8?B?dDJGRGxNVFlHeVBsdlUrbEhJMVRxdXdZN2JLdllyV1dzZnZSQ0Z1TU1sb0wz?= =?utf-8?B?cXVDS0wrSG1JSGdwNjFXcU4zTjYwb29qWHVWbGp1QVNSbEU1WTB5MEZiUGRB?= =?utf-8?B?UVVjWDN4bVRXcWg2eDA2VjlCYngrRzIwUGFQK2JkNHkxbkZwcCswM3BWcEVp?= =?utf-8?B?QWM4RmlVdTVmblBUL0hiNXBqQVBKZTAzdDh5eldzM3NiWkNGc3BsUFJ4SzlF?= =?utf-8?B?RllzUE05OUhIbFhnRGV1QzRNUlhJSG1JWEVJSHUxbFBpdG0xYTNZYjVVZEE0?= =?utf-8?B?L0hGNUNPbGhyUVd5bGJtbDJQZWIwUTNmOXJWUUNybUtRaS9hZ3ZXR1hNaS96?= =?utf-8?B?QitpaGFPeGZBamQ4dFdSQTJ2alNSNmwrKzB4Um5TZ0czbUxpQ0ZVTUpVRzRZ?= =?utf-8?B?NnRQUDdaeW84MC9BcUsvWFRNRm4veEo1Q3ZLWDVFUmgycWQ0N0MzcjZxU1Z2?= =?utf-8?B?NDB6d3BtS0l4dytTT0VraGVYQkNPWUdZK0JMcmVTMHAvUnNzV2V1UVlaOThm?= =?utf-8?B?OVFFZmJoeWRKMUd6N0FrcEVBRzE5UTJCQnFCZUFPY3h5N0NEMmh0UWkrMm1I?= =?utf-8?B?eXkxNzY5L3RjS0NjR21vZ2c2Tkl0aUxKNlpCU1daN2hMN0NHL0RrRnVFMzE0?= =?utf-8?B?ZGJKUisyN0RnWER6eVp3V0RzMmJ2WmVvQktKUWk0L0thQk9qVjY2bVNhVG1i?= =?utf-8?B?aHVaYnRlZzNBREx0OFAvcWgwcXdzandLS2NoMk9UbnpXZ01FVXlDNVowSjhP?= =?utf-8?B?Wm10ZVBhdTBRQmVaWndQczl6MjRKLzJHQlYvRkdib0pvZTBpRHZqOTVSbFBN?= =?utf-8?B?MEJxY0JvRno5MTUwZ2tIcEdzWlkzSVBDclhza2xvNVV3YWhIbHNoVWdGaTVX?= =?utf-8?B?bFJQSnJBRXlZV1cxN3RYSnBRb25RS2tMOHpySmlhWXVIOUNHSFllSEs5bHRN?= =?utf-8?B?eW5mS2JER2RRWWEvSnNTb0lxaGNSeHR2T1h5bkVweHJWS0RwajlMbHJDUG1p?= =?utf-8?B?bGFITDdMTTJVa1UxNnRUS3Ztb0tZZ01pQ3N2dytiLzhUSnNZQUIwU2pkR3RN?= =?utf-8?B?VGtpMjlCOWlZc05QaGRyaFdORGtacHZrcW1acHMxblBFSXgwdVh3NUxZckhU?= =?utf-8?B?VThvem9RcnJuY2NGRmVJc1U3cENRYWlmRlRBM0x3WmErTGhtLzNNVExFWXhq?= =?utf-8?B?cjVNaW5FTVlWWmx4Qm9QT2phT3pBWkliNFlHUWJiU0dqOEMxSmtUUzI1OER3?= =?utf-8?B?YkJsMlFhK0xlMHhhUGg1UldzSm5yQloyWWV5RlVzZ2c4RUk4WGVwZmVNdU94?= =?utf-8?B?d3ZqVUtJekljSEtGam1STTVhR0g0WEpzalBkYTcrRFk4ZkcwN0NHMmZqTFQ2?= =?utf-8?B?VmFmcnlQRXVoU0lmTFpWNzROWFVZU2NIWEdPN2xXeXhQVHpSd0tiVDZNb0tL?= =?utf-8?B?U09qUlh6cnhZTGtxV3pwNDgvNWFVelpDbXo1Q2ZuWStHd2hDQ0pmejJPaGpz?= =?utf-8?B?cm11NlJVenNYQUpoSFo1Mi9nb0NUVkV5TGNTa0lXcGpZY2RKSWZmL1JpRUFL?= =?utf-8?B?Z3BpSlZscy9FekJQOElZcW1VNXdXVGFaQzVHTlpnZEQvdGZBSkRvTy9rTGNS?= =?utf-8?B?Wm1jam1DdlBtNnJvT2l6eFgwSHZCM3kvQmM5Rlo5SFQwOXNYS0laeEtYVThj?= =?utf-8?B?WFRtbHoyZmVGSjRCL1kzNTl0S3ByOE9POXYvSUVCMzl1WlV2aFlnQ0s0MG5T?= =?utf-8?B?d05EbDNoajZBVnpCUWhXQjY5dEJZSTZLcHQ2RFBjWlVsczF6RVlGL2hFYklt?= =?utf-8?B?WkhTR2xCOWU4MzlhWi9hVW1FUXM0eWs2VzhvRmFNcU03N3BSaUxNTUdKOWth?= =?utf-8?B?d2dic08vVTR0ZU5QdXB5ZUZiS1VXSDlIVHVYMExvTVN2YldVcFh5R0JIZnpi?= =?utf-8?B?V2l0OVlFSGE1UVd3LzNEZ0VUVWJaRzAvV2dmdUUwSTBXYVRpVWxzaGx5NGdl?= =?utf-8?B?OFpFRlkvSE1uMTdRZXl1eGFIc2p2eC9JTXh1WTNOM1lBaHBkUzYzZjZRMjNr?= =?utf-8?B?TFpiRElteEdRMlZKR2RQaFl4RXJib2hlNk52dXdSbVUvWFRacjkzNktXZUMx?= =?utf-8?B?dHl3NS9vZWdCSCtGbFQ4bzRjcEU3QTFJRGFldngvNEVra1JwQnV6MVNScFlL?= =?utf-8?B?bW1MeGxvakNGUWMvSFRtTWNUV3E4Sk1QR2JOVXBFQXJYK2hadW9ndz09?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7a67a62c-a326-4e0b-9b51-08de8ef6a96f X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:19.2365 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: HFRXqAoNadOxr8w0rt2X8K/vr85E2eCs7RC7+lpWqqptceCzZWJ8rXr2reh8gaI/tShUQTUyrrtaC1//OtoNVQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DUZPR04MB9968 From: Ming Qian Add comprehensive documentation for the V4L2 memory tracking infrastructure in the driver API documentation. This documentation covers: - Overview of the hierarchical memory tracking system - Basic usage examples showing root node creation and memory tracking - Hierarchical tracking with parent-child node relationships - debugfs interface for runtime memory inspection - Notification callback registration and usage warnings - Visual examples of tree structure and debugfs output The documentation provides driver developers with practical examples of how to integrate memory tracking into their V4L2 drivers, including proper setup during probe/remove, buffer allocation tracking, and per-context memory monitoring. Add the new v4l2-memtrack documentation to the v4l2-core index to make it accessible in the generated documentation. Signed-off-by: Ming Qian --- Documentation/driver-api/media/v4l2-core.rst | 1 + .../driver-api/media/v4l2-memtrack.rst | 140 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 Documentation/driver-api/media/v4l2-memtrack.rst diff --git a/Documentation/driver-api/media/v4l2-core.rst b/Documentation/d= river-api/media/v4l2-core.rst index a5f5102c64cc..09765d028375 100644 --- a/Documentation/driver-api/media/v4l2-core.rst +++ b/Documentation/driver-api/media/v4l2-core.rst @@ -28,3 +28,4 @@ Video4Linux devices v4l2-tveeprom v4l2-jpeg v4l2-isp + v4l2-memtrack diff --git a/Documentation/driver-api/media/v4l2-memtrack.rst b/Documentati= on/driver-api/media/v4l2-memtrack.rst new file mode 100644 index 000000000000..bca6954cfa0b --- /dev/null +++ b/Documentation/driver-api/media/v4l2-memtrack.rst @@ -0,0 +1,140 @@ +.. SPDX-License-Identifier: GPL-2.0 + +V4L2 Memory Usage Tracker +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +Overview +-------- + +The V4L2 memory tracking module provides hierarchical memory allocation +tracking for V4L2 devices. It is useful for debugging memory leaks and +monitoring buffer usage in video drivers. + +Features: + +- Tree-structured memory usage monitoring +- Per-device and per-context tracking +- debugfs interface for runtime inspection +- Optional notification callbacks for memory changes +- V4L2 control integration + +Usage Example +------------- + +Basic usage in a V4L2 driver: + +.. code-block:: c + + #include + + struct my_device { + struct v4l2_memtrack_node *memtrack; + /* ... */ + }; + + static int my_probe(struct platform_device *pdev) + { + struct my_device *dev; + + dev->memtrack =3D v4l2_memtrack_create_root("my-device"); + if (!dev->memtrack) + return -ENOMEM; + + return 0; + } + + static void my_remove(struct platform_device *pdev) + { + v4l2_memtrack_destroy_node(dev->memtrack); + } + + static int my_alloc_buffer(struct my_device *dev, size_t size) + { + void *buf =3D dma_alloc_coherent(dev, size, &dma_addr, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + v4l2_memtrack_add(dev->memtrack, size); + return 0; + } + + static void my_free_buffer(struct my_device *dev, size_t size) + { + dma_free_coherent(dev, size, buf, dma_addr); + v4l2_memtrack_sub(dev->memtrack, size); + } + +Hierarchical Tracking +--------------------- + +For more detailed tracking, create child nodes: + +.. code-block:: c + + struct my_context { + struct v4l2_memtrack_node *memtrack; + }; + + static int my_open(struct file *file) + { + struct my_context *ctx; + + ctx->memtrack =3D v4l2_memtrack_create_node(dev->memtrack, "contex= t"); + return 0; + } + + static int my_close(struct file *file) + { + v4l2_memtrack_destroy_node(ctx->memtrack); + return 0; + } + +This creates a tree structure:: + + my-device (root) + =E2=94=9C=E2=94=80=E2=94=80 context (pid=3D1234) + =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 buffer: 4096 bytes + =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 buffer: 8192 bytes + =E2=94=94=E2=94=80=E2=94=80 context (pid=3D5678) + =E2=94=94=E2=94=80=E2=94=80 buffer: 4096 bytes + +debugfs Interface +----------------- + +Memory usage is exposed via debugfs at:: + + /sys/kernel/debug/v4l2-memtrack/ + +Example output:: + + Total memory usage: 16384 bytes + my-device (tgid=3D1000, pid=3D1000) usage: 16384 + context (tgid=3D1234, pid=3D1234) usage: 12288 (count=3D2) + context (tgid=3D5678, pid=3D5678) usage: 4096 (count=3D1) + +Notification Callbacks +---------------------- + +Register callbacks to be notified of memory changes: + +.. code-block:: c + + static void my_notify(struct v4l2_memtrack_node *node, + size_t total, void *priv) + { + pr_info("Memory usage changed: %zu bytes\n", total); + } + + v4l2_memtrack_register_notify(dev->memtrack, my_notify, dev); + +.. warning:: + + Callbacks are executed without holding internal locks, so most kernel + functions may be called safely. However, the callback MUST NOT call + v4l2_memtrack_unregister_notify() or v4l2_memtrack_destroy_node() on + the same node, as this will cause a deadlock. + +API Reference +------------- + +.. kernel-doc:: include/media/v4l2-memtrack.h --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11011040.outbound.protection.outlook.com [52.101.65.40]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B11993C13FC; Tue, 31 Mar 2026 07:25:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.65.40 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941931; cv=fail; b=WlSD9sYlAcByIl2xulGU46q+mCrOyJ9XepvWgsXdG9s3jKJFjzLh2I7INK3WFkAmselwzCZTRUNGvJsIfQ9uIN+nIMvROy3ct5I/qxr21Z+Qpz9yxLLqExJ3NLgjQZs5YC/xOo8RYb4GvOQBNhnFf8qySOJUx5Shu4MRjewcGJg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941931; c=relaxed/simple; bh=FeROEfrqUD8BdR1prtuUwKT9ymsdVtvm272MkyXP5q8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ulGy+TSrIUt+vdawomFNC1PFvrqUJA7cDbhqaaaNOMxZG52TzoRiPK/hVGQV+xtn8apaqOg8TiDGXeSy27RFVJlEUmXrjQ8rGiaNjjZGzL8aiPT3D1uSWSJY6SFo3QE681ABICafKBkN9cWx6qm7JanK0l9GIf1bsY5AJ3NmKVk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=Nq5wWUcS; arc=fail smtp.client-ip=52.101.65.40 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="Nq5wWUcS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W0siN5ovUzzpQIoNme3H/2rJYjfddV9W4DbyP9s/b+PFtdUVYR9qYoa4tfUkAuSwsHnDOcb149SsX/5OPgBTRkf9Qp7BoCOSNACMzVWSjEZORwucjDW16SBdlIVSeYPe1eZqhlfaqYH5CCEJI9tITs0z69bYAmhBa4SYGBljVp39a/w73hLbYiW0ksrNk/1RdtS7tG96wWm6IP6fGQgoyo8cDgb5diC+htyiEGdm3PiHbFRPX7Na2ywIhAsOduEomOZguADMjjFKV8dSGUmBKw5oGBCg7e9NutvCrUx3coG4Bv+Auw0Y18UjAa3G+MM2hF5WiK1Rb41MjpWNbBkRyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JPie6igWEVMiEee6bNPFfSXSnWs21rbUyCZln8rkxD8=; b=hy3YDukOFxQjgQm/DqShC9xbUiin6NeJ/5u5MiZ8JU2trCV1pmQaSHuR/NoQLvXyQV2err+qsi45J7QSAcwZQkt9r0wN4g6MJX0TGbTlAVCZta9DooxaR0EUgAauW8LaOj88BNMbBR/uKSPc7lfGhJJJ2Er9AZ6C08tbzhSpUQW7DXcMrcSqk2RdhD7lFWbvJUmWwZwvLdEDnTYbe+A+8DCffJnwVafavWDVWovFq5gQqNZCDhttuhqq7HL8KV9XqwuwpoxL+qTFJ2kTYToG1yKRQTcwk7axGNoI4N7w4rgxuB6/jFBH/DSCq7jynRwVXomcTsDNsFJbhzYA+FoxqQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JPie6igWEVMiEee6bNPFfSXSnWs21rbUyCZln8rkxD8=; b=Nq5wWUcS7qjHr/NEW2y2FnbYHlJyMf3rrgXy7hb2Bzt/1b83f7zKLw8IpVfSRZC1q7wUBv6kJJEGQersUbsJPPfeBWd07lqt6lktV/Do6v3orPMaKYvqtAKCDLuA4vtbiTyVzrceYoG7dsRn/bKk0m9JG6yESHvKmI4+Kc6A1YDnLL6LGsjUyLkGhq1V8UrWnx5dVNpGu+opc9Ng0TghWTHABVzg6u5PZxi5x0xuZQkswj9BVPcy6QoVDD2WrHJLkDAH526iY1rXzANjr9t2ilCatj/Y8m3jtZwk9TueP0vSmh22GJpRqKKgr4K9UOOQiflrOsd1dSRhdbpFOE5f2g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by AM9PR04MB8131.eurprd04.prod.outlook.com (2603:10a6:20b:3ed::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Tue, 31 Mar 2026 07:25:25 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:25 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 5/7] MAINTAINERS: Add entry for V4L2 memory usage tracker Date: Tue, 31 Mar 2026 15:23:15 +0800 Message-ID: <20260331072347.253-6-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|AM9PR04MB8131:EE_ X-MS-Office365-Filtering-Correlation-Id: 24d4c911-c2ae-4df5-2b3a-08de8ef6ace8 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|19092799006|376014|7416014|52116014|38350700014|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: DYKrT5bA677ncq1ny1T8U/t8IgGxNbg7suLuNyEEpwq10S+5Y2FY70mM/fjmsdBcPBX4muM2Nxz1RhDakxfHhB/RnbRP10xuN9qkdqmznrKFKvu/erGJ56jYJxiTSemXfLBFIz+qJnPAUe2ZbPUZOqMiqHVehBsM8QWVhxpQcKde53/pFtUMn1vgPUUq+iuRfYljV5YpAm1cIyeDIbPDQQ6KfzyYQQlMPO46mDV7EPuVEgeyUc1nOmPbueaP4NeVzRjFDLYaYfTa7t22upmd5FSdwayvVyDLTweODOB6Jg+f/H582ZktFr5XHBkMmaB7FSCAzl9rwM9Sc+v4cCOiX5I1wLuXNQPgHN7UOXi2I0KxkOu++fPxJPYnaQ4BeoBZBH7+YTA0VdjUM8zt4hsliaO6EtIn4J5Nsf4pfhy+aLO3z7GQI5wIA5lBU3NKr3Fzbk0D8wzniPB2ksPkLZXpMKAU6zyKeQlOcPepLkPS0YhGN8GtXljv6W99FnT4+9qBvKcf87K7Ze+MIdmFqFJ2uTMGBfiaNJm031w73diq0gGHyUJ9SN+cQuzOm+IE6Sz9q58g6cCG7M3VT+8mtqeLhiTAmqYeEp6w8NE8zQXPCJ98v3CBcltGjFQzgLvyvrYrxVrJodEP4y8YtgjqECQbgyDjD++uat/C8RzrAXWqmvHQXOWs8uR8LcLeusTn2BD1KEjVpkdVgZ8O5RfmEGgNo30WTVtIGQy/Wo3Thk4QkwJ7z38kN/IG36Z91LOMAXuvSCrHz8L3CW6VusblqC9zqV65CJQK18keunjY8DVCacY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(19092799006)(376014)(7416014)(52116014)(38350700014)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?w0WrH0WjnoMYBMn8gMa4Im0vnhpCb/FG9HIyj+V88Ddut62wQ4xxHBvp1JLo?= =?us-ascii?Q?SmHqWuqqLGqWDiOMw4doMSJvh1CR+YKbOiviCemRyHgG6LzYwBImAuM2lGu9?= =?us-ascii?Q?h6Ix8IRSqQiHR6UqBkIoP+09EX3xEskqcrmEJSrGkySc0WRt0j6iDEtbbRoJ?= =?us-ascii?Q?iS4mSnR7zPLspqqXzKUcgzPi9TBnYpaX8XFu9cjJdEI4zhdw6bQOzH8QyJP4?= =?us-ascii?Q?M2gBQiHm0cWjbBrWXCiRp1JuLOY3WTZUIeVbULckOfRVvFJ84D14coIN92vN?= =?us-ascii?Q?U00HjOrun26sVlynIm5lcC0eSqztZVu5h3uKS1UhRV7+bLJcViz6ujyZpqgm?= =?us-ascii?Q?LIOQUm9IUjxhs8XZoOTgZ2gc2UtT+WafRWSyqcGPwESXHs+m/I+KEMHM4Nug?= =?us-ascii?Q?Rgtje+REvTjhIrZi2xiExfvzrgu0rLrX+FWL6ZFHpsYHzT+T65JtnHrIknQX?= =?us-ascii?Q?/BNjA2ksxL58+gHaSd4CLjnKlK99ixLNuvZPnpcXZMMSgmS69unSkXiI3o9U?= =?us-ascii?Q?oKFFB6Dsan6UIll+EZ75wI+Z6VyiXl83ZshatvjXIb2mqVND5I7VNMeWllKt?= =?us-ascii?Q?vbs/aVYng/A3MVJ65o6nPAUqo6CnBAsI2dq3wVVjXp0HyeiCWrhNHbT36Old?= =?us-ascii?Q?XWeRyStgGHMGPKu2JSrD3tbr8Lyo1EDUjogjEPbOZCbfdxZALwMpwGw9MfuW?= =?us-ascii?Q?2cmHCFKYHxcfXOc/M0VDwj6sER7wakMTmAA1mnlOhvZiO8CZ2eUI/RHhzYKV?= =?us-ascii?Q?3WLsGk0Nv0xLx6DBUWvN7bFFg1A8xP1K0NkbKLK5oFUw6WcUnOQl5Jy8/os9?= =?us-ascii?Q?rAASvdLGQtbjPVh9gO0Ob3kwgvNpYdAv0tikgve70MDVZGz4ZTbe86Rd2Xdt?= =?us-ascii?Q?uRhEWKUUPYNlgDh6XJIccUdkspm7LmBVZwkPuMTHd3JSNoapVqJcFapboDpI?= =?us-ascii?Q?8KbWsWe/QQaupfdnHS55B4JoHRsScY+bHp0iiAtDIy+Bcdk2HrrKQHjDp2cM?= =?us-ascii?Q?L8JF9E0AwlCsdtFZq5bhC24UE9i4Y9hPXmI9vqCetk0inyFeU3m6YmXrEI2j?= =?us-ascii?Q?AOCEi9r3oB3e9WrLYxLqakfq6NoC9ZqMJlhaGyXbx5x14ZGRr9HL3CvBbS++?= =?us-ascii?Q?zCryzlrl8KrZjvM+e0xq8iA0hOEkMXAiTh5pTr9nPKt04R+wzQ3kCA0wAu2H?= =?us-ascii?Q?E6P/i0G8Y0agTk7KQCyvViIXuEFAIvkzEJoMmLTmjrxNTKgXJUFpb2Aw6fHW?= =?us-ascii?Q?LPmU7AKROIWylvWVcxkX0kEblQtCsmqFPASj1Kk8E3bwtIWDtFNUbM49It9M?= =?us-ascii?Q?A1DD+nCZiOGxiGHZh2g9HM0kv/ThzQ81hoS/QntyPXbrmMWnt+muzHPFlwvF?= =?us-ascii?Q?CwBIwcacgHFPXULZGXzTxdlhtwhMt3C0JzX94H7K3YkH+WYmCet2fiJ9Ms8Z?= =?us-ascii?Q?WJiBJUrlRK6lenAdQ1aUfYzTqYhKCkV/xD8HOuC6pgFkqmUAHOtBG0j6lAfu?= =?us-ascii?Q?jBsdk7F1wjEHwb6RlZvTvCHNJJEC+75Q8/UBJys6cxV22dXr4d/BCIl21LQq?= =?us-ascii?Q?sx+DFVBT9l4zq6/FTw9NS9vUg1sav78nE7QhA2sovg+4dvw3xJ+ILgDNzXZZ?= =?us-ascii?Q?5K6d9+pMpV0jdn67Z8S4zNYCNJ8dpf2iWIuCFA6jcBcCypZF9CvL9Z31Fokc?= =?us-ascii?Q?CV8BJMj2PyHQcLsMFhfJO3+LZRML3CyUB6UbJPGwZ/mUWsbJwzs5wMNl3HIz?= =?us-ascii?Q?2kmg99mjew=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 24d4c911-c2ae-4df5-2b3a-08de8ef6ace8 X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:25.0440 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: nxgKkjbAM40gN/Xc8NiwJJMpIDea/bR455VXakV/7pRpVViLKdd4whYZZYuLzuHGwN2+TzZqFouBRrzADfC4vQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8131 Content-Type: text/plain; charset="utf-8" From: Ming Qian Add a MAINTAINERS entry for the V4L2 memory tracking infrastructure, covering the driver API documentation, core implementation, and header files. Signed-off-by: Ming Qian --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 32b1dfee8614..6de2f259415f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27667,6 +27667,14 @@ F: drivers/media/v4l2-core/v4l2-isp.c F: include/media/v4l2-isp.h F: include/uapi/linux/media/v4l2-isp.h =20 +V4L2 MEMORY USAGE TRACKER +M: Ming Qian +L: linux-media@vger.kernel.org +S: Maintained +F: Documentation/driver-api/media/v4l2-memtrack.rst +F: drivers/media/common/v4l2-memtrack/v4l2-memtrack.c +F: include/media/v4l2-memtrack.h + VF610 NAND DRIVER M: Stefan Agner L: linux-mtd@lists.infradead.org --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11011034.outbound.protection.outlook.com [52.101.65.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E0763C9EE9; Tue, 31 Mar 2026 07:25:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.65.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941937; cv=fail; b=ppbbzb5Ftb6fvFrEuAGkivktytgl8+mqkhI09Xllu7OSSXUz1CJ5E2NKOsa5MevogLtW2/nvhIVp3YSptR/g8MlZPL/5qYlmqwaA+hpm2/Pdr3RPyutOCyuYl6moIeTLTGekSFe19IqvpgcVB6SbwLcRAqKmhdZChcXS/ZK0FBk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941937; c=relaxed/simple; bh=hyjHgFYz4g4Tts+FO9A10B/8++UcK4bAnQYXrS6T0V0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=djNyngIVHcEz/pXW3kpwn8+NSQjn01JpXn/apjPm86KO3gaKUMjiWCpx1mswXDm4i3fHlN6d7bN8EgIPz9cKEZmguMfCIALnTc2kbfMGaJek4EAnQbyKiJuXEulN3JqMlzx/XKc5gr51Z53dn2m2xG+5GBRI7Q2gO9hK3c/LJHg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=X314vo+M; arc=fail smtp.client-ip=52.101.65.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="X314vo+M" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IRf1dlwIpGKupFo+yp4MO3JSiAYnDR7YSHCxWJ1IEzLG0epC9p9DVG2/cqwHLfb1MY5VsTivd1FJffeCS4aweNDzRFsDa4+I8BOF8p+KnBzX+kwUGa4+6kRq2D0Re/o0RsponUS8aj4Fia1D1pJkv+cHmlWzFxCDF8kq10Q8UoRSFiAiEuIW9fc9zW/pZOEx+QqV0EWt9Pa6xOOFcS9sTgljmwvPbZe2v51V/zuBpbv6jrBWh8utAVbbNCmxibZZsNbOlL3z+dG3pWvHmS3SlXYQ45C/qVuASLirE4HQUI0ag9aX3Qtzx0qCMsGMBy7fKYHtn9DuJZE7Q9byvCnnng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wSmMA6CxOe35pS1xTxqWPZQEA03CZ+m6U7Fnq0IYiU0=; b=kqszYMT76AgomhflKLa07s4XnT/ADETWd+QB1TsqlrbJchleom2pQ+RanDPgmcEvcn2E/5M2N+AKQbq+M7aZW04GU3ecNF5/IWqZ30yTF+bgtpuCnm+aKTyrDFOx5UJwAlq/tGlw1Nth9M9wTUQcnYahP1h37P+w6sIZ+NewO+yvD/kCy4PSJFFSio9f9cFii0JVdX3qpCu72IQQCfqV7pYQBTOXCwUPL7mOGOM9axafFxjjsh32oQlgsrRyhmvI0STGWm1aEIOifiuJfgUB9jfouVX8Fmtv19vlWoKgcVM1+fxl9BMQtzQg5I6Fe+E5qS+v0c/VZvXUv+kmPK3rGw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wSmMA6CxOe35pS1xTxqWPZQEA03CZ+m6U7Fnq0IYiU0=; b=X314vo+MVKR9NGO1Qx7sU2ApIfjB45fs4j2XnHWjyRF3CXdUpLcfBOe0DJEUccAjd17zJwMtGhH1LXWmvlx5tWla26JF9EEyyr4YuBA2TlgwP+C9xFvWM41lC+owyWB1JIj+krLZLLzWI4iRNS8D7zNtc7YMCALMlfAyX9pUONgaqnMpq2WOfQkNktGfnAWSJxx83Z0/L1SJgOU756ULcuBgc7VIFxIm5vLArjaRAdPJ+frWr0TfE6vKP+q08feR6t8LY9IotsIEUg0WxCiYdUQL/OZXFsx6THbtEaiqTg7ebSeu9LIhmTHvr+GL2CWL6rr/xEkrm33yLgHl0rhDzg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by AM9PR04MB8131.eurprd04.prod.outlook.com (2603:10a6:20b:3ed::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Tue, 31 Mar 2026 07:25:31 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:31 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 6/7] media: videobuf2: Add memory tracking support Date: Tue, 31 Mar 2026 15:23:16 +0800 Message-ID: <20260331072347.253-7-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|AM9PR04MB8131:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c809752-f823-4705-7e6b-08de8ef6b0b8 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|19092799006|376014|7416014|52116014|38350700014|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: V9qGS+0TA93l3Ft8HBMCtP0ycDNob1fKT7C/zpwDHXcKCxhxpd5r9/Y3tJa9sX80i0jod6sFTpfGh3a9yWBm376y59cAM7rWFfJukGAZKrOw7NiCnDtvGphmC8D2oiFgyT5B/zHSR1F9Sg54If7GRNSkxhSj3t+0h/m6nD6c3sQ/wI1M3uPdQDhQlH8VGeP7LdJ0i8+AcHhwm0PTHKQoF7UxdORvRsDJUf6mZcqbBrlBcBgye/eSC0d+EM7Kxhk5BTSTDveQEVQmqibxvg+pBx98mB7NA6cfWBYrPt4TLVh2V3ALAJ1Dtw+6EoD9vVRwe7i2GQplXTbu8ZWwcwDOb4rBvbqQBh/yyPkMdIzoNIKCE13P4QaTjJgGmGHxcHStwTuCWWNCLUKA195z9QOPLCchfpF7/oBp9+IvZ/9aafRYqUBpYo9pOVo2QohaX/ZWNtmWZIsPIQWi2YBrwBvtbwwkqzhYhjMPrzP5v7hHM4SDgX2BezexUNNJlt7Ez3fEE/s6YzGyJcHPFmqSMKXPl9hM2QtomfRmyvM/0YBYAntQOlIaCAWJY4opKi98Za3MTvkRaoTAyqOU6FaZXrWUq/Y0X4kt0OcKp2NiAzXwLh1gEu7vbsrtsZHWunN+/HGp4GfLeCoiH0JbQEdHvHa8eJdZfBp0BE5TP1KOinHw2mSDNrHVdXHnoveibqr4Mh+dKgkt9kiov86pmABgFe+rG+neiPWL2UATKHv9qACV0+iONHDWKtHmmTnZIrICzu2RbvnYvjqzoiPjkqF+ZGj0zPkOxehVhjo7e2/x6/3Dn+w= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(19092799006)(376014)(7416014)(52116014)(38350700014)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?wRZDL5kH+2sWA2IgWHuOoMQTy7vXmlJrrC4tdVA/J5rYgKVroJ1rtyFBCifN?= =?us-ascii?Q?57Dko+Zc9cJRT7deHjRjom/CNrGbR6yhJknWR5QBIIXgtQjZL+yweQoxPXdK?= =?us-ascii?Q?ocMGhttrJ1r00Ec+AM7MQGDcX6qnGo+zjf9FcAQ9Wx24pPuJsbyi0eOCyV2K?= =?us-ascii?Q?yEeiBd6UG+/Y+v+NncFr/ULd0XdTZhL2qVlGRSPdq/91T2n9PMNzeup61CD5?= =?us-ascii?Q?7gBwDX1DVkHUcSW1pkRC2l7beSs8eBCGF4VXtFc6LkLJgapkWoAl6YfKuZep?= =?us-ascii?Q?vqFc1wkXh8OQYHNtoFN8u5NtrunfPtNChXXjK1MEOV4+Hd2KRjGNMRVlOFC5?= =?us-ascii?Q?qROrWrxQsvj2jMRyIjVn9WECsXsOe7e2f85BkZ4FjkCBTliOUnR++CX4w9c8?= =?us-ascii?Q?+ag/YGm1ckWMw8KJXZQlhXyCB+sfoNcPrRRVM0l0cLBY1p/cX+r/vDY0HPlW?= =?us-ascii?Q?EUAWngxmwfZA/KI+gAFH9DNIU9EHIHRKmlnR2lsJUxDFcMe8gSuDjmF2pvW6?= =?us-ascii?Q?Y1wbV0ySoP7yyaY3NDgVtYLWo9jDozW9GplnRnu5XQchHQwB2mZuO4uDWkby?= =?us-ascii?Q?ywejoscCOEQ0lUt5Jn5YXVjqJ3ctb/zpW0fOrOPtaLTq4KhfCF0BUmtor2zm?= =?us-ascii?Q?0IykzYKSZaoqLE/4/hZh93CBMrnXwo1q2tTgYeoTLiwPT0aYt8bEG5+58QSk?= =?us-ascii?Q?ODPYBrzSk9w6XnhQgL4WUX6lcOJYRmAmHkMi4Udso1w61tbWKP8s1WA+Uc1Y?= =?us-ascii?Q?jJiWvP596FHdIIUo2H+w++mtEiafq7k1nhzkGhVD4kBbSyezCn2vGNFa57dE?= =?us-ascii?Q?PulqNz4GrolLjgz313ditflvl7fn6+WDgRPBDV98qErGVci7+/1DfxKkHvTz?= =?us-ascii?Q?RTUDRW4Hizz/sVhzWjxm+gPr4G6xaROibstLDiFjVuaT01HbmdQTfRFJhZWT?= =?us-ascii?Q?iuC+V1shWCCLA+5h+AWfHL0Ekvt0v8uIY7u7GMEgxPLV4g9WqbAI2VTpJZ/k?= =?us-ascii?Q?AWs89b0klFNxxZmS39RxqKm2L/n8zKxEXGdxB8q/3GXYFuLWYSnBbbaWDdO1?= =?us-ascii?Q?Oma58PjtUHCktM/VHPDMOQIRYCDQivxQzaQIks84/4zhKJmwNvbX1XXFlmwh?= =?us-ascii?Q?a6VeZM/8cc8Wa41q8DayrxlfwlD4l56mPAc+WooGftGZuiMUbTinI8FBEYn2?= =?us-ascii?Q?t0TkZ30eJz031kYUT9fnDCxJKWwKPdo/6Gq2BJ0xpjBMTCUdm+3UNromsxJS?= =?us-ascii?Q?oh/KdVaLc45zug8JQ6l+rFMiq0IoDmv+K83JMmR3gnHTEwZYw/+f/UbWCb5n?= =?us-ascii?Q?/mSWOzoKQe0xrrWTpjSqTxOP4ygl0ecfngrFZ/rweDQk0nUozEi+sTULmRWN?= =?us-ascii?Q?F4L9rygu0f4EeE6TBVfULs7ywRcjPTEY7LjY/KBV3yFWR3+6Za2h4cOTmh64?= =?us-ascii?Q?sToLSv237arrVLf8YyRA2l8JmxsRM7e1z6elcm1L/HdhBGZTE/1+isMXRAo/?= =?us-ascii?Q?i9Vs38ocULeQfm0GQh+jSKDtI+Fikh3wievTc64xjHA2OnuS7NdNx13jwGpl?= =?us-ascii?Q?dP0A000u47fvINTUOaioZiDYV2aFUJtC5p3c8qum4+TCpqzSQdhmU1SWR9Q9?= =?us-ascii?Q?eRMwl14balTaFV4Ebnb23uik4+VcR6CSn2Fk08Q/xLuN+spM2ytnc/o0t4oY?= =?us-ascii?Q?/vv+YFRE2nVhnzhiK4Lk+VkPVB+g5ziypN1UlH74bxvhEAIxSd8nc/B45w/7?= =?us-ascii?Q?xj2ZG46uyw=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2c809752-f823-4705-7e6b-08de8ef6b0b8 X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:31.3449 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1knV13YRa0dIU8CboH1zoqUEvLveLgIkezwfaBHpE5LNp3ANugNGIC8DzDQLG+xhRxrGhtNh8oMyKs1AVBE8qQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8131 Content-Type: text/plain; charset="utf-8" From: Ming Qian Add optional memtrack field to vb2_queue for tracking MMAP buffer memory usage. When a driver sets q->memtrack, the core automatically tracks allocations via v4l2_memtrack_add/sub calls. Only MMAP type buffers are tracked since DMABUF memory is allocated externally by userspace. Signed-off-by: Ming Qian --- drivers/media/common/videobuf2/videobuf2-core.c | 13 +++++++++++++ include/media/videobuf2-core.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/medi= a/common/videobuf2/videobuf2-core.c index adf668b213c2..e42fdf829b22 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -28,6 +28,7 @@ =20 #include #include +#include =20 #include =20 @@ -251,12 +252,19 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb) =20 /* Associate allocator private data with this plane */ vb->planes[plane].mem_priv =3D mem_priv; + + if (q->memtrack) + v4l2_memtrack_add(q->memtrack, size, NULL); } =20 return 0; free: /* Free already allocated memory if one of the allocations failed */ for (; plane > 0; --plane) { + unsigned long size =3D PAGE_ALIGN(vb->planes[plane - 1].length); + + if (q->memtrack) + v4l2_memtrack_sub(q->memtrack, size, NULL); call_void_memop(vb, put, vb->planes[plane - 1].mem_priv); vb->planes[plane - 1].mem_priv =3D NULL; } @@ -269,9 +277,14 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb) */ static void __vb2_buf_mem_free(struct vb2_buffer *vb) { + struct vb2_queue *q =3D vb->vb2_queue; unsigned int plane; =20 for (plane =3D 0; plane < vb->num_planes; ++plane) { + unsigned long size =3D PAGE_ALIGN(vb->planes[plane].length); + + if (q->memtrack) + v4l2_memtrack_sub(q->memtrack, size, NULL); call_void_memop(vb, put, vb->planes[plane].mem_priv); vb->planes[plane].mem_priv =3D NULL; dprintk(vb->vb2_queue, 3, "freed plane %d of buffer %d\n", diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index 4424d481d7f7..7cb6ff2fc892 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -47,6 +47,7 @@ enum vb2_memory { struct vb2_fileio_data; struct vb2_threadio_data; struct vb2_buffer; +struct v4l2_memtrack_node; =20 /** * struct vb2_mem_ops - memory handling/memory allocator operations. @@ -558,6 +559,7 @@ struct vb2_buf_ops { * driver implements the V4L2_CID_MIN_BUFFERS_FOR_CAPTURE/OUTPUT * control. * @alloc_devs: &struct device memory type/allocator-specific per-plane de= vice + * @memtrack: optional memory tracking node for debugging and monitoring. */ /* * Private elements (won't appear at the uAPI book): @@ -632,6 +634,8 @@ struct vb2_queue { =20 struct device *alloc_devs[VB2_MAX_PLANES]; =20 + struct v4l2_memtrack_node *memtrack; + /* private: internal use only */ struct mutex mmap_lock; unsigned int memory; --=20 2.53.0 From nobody Wed Apr 1 12:38:01 2026 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010050.outbound.protection.outlook.com [52.101.69.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B06F3CC9F6; Tue, 31 Mar 2026 07:25:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.50 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941943; cv=fail; b=IQA4vKuayiHS5OlVuNQm6SGuzuZ1QG59TIJg+pXAbvRcsLQQZ6efVgfKj7wJKqWmTTeMd0g5NRKEFJEq1MdKoRSME8CwfJrFt4aWETGT51WeZPqC6DGeYuaxWfGa+8mLyqAcob2S/d1zgkM09OPO+SKwRNyIPMFnQCputC5s0Nk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774941943; c=relaxed/simple; bh=z2BYag+HfV6vLv5PPbvoGhSMBBp92Zi1l02zftvAsLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=kq6nl7NU2wXKpv9vier9BrZy0fVNW4gHWKpFBV+ZSjZpqdLcyLXj4cEIIwKySzW0GUPim6+huuF5TMFvJ0EQRY0OexuVTakrjEj9l1Cd4Sy0WKxStC8dussZKkqJ9X+CQeVKkrn3L0sCpekiPoIKdwuHxQfYhFd6oVaFBennmW4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=GnxLnmcT; arc=fail smtp.client-ip=52.101.69.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="GnxLnmcT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U6x2rB84RciYIk/fTIgzoMtnxHQ2ypdF3WKMzULYP0yia/qi/yV8PXIJ7O9YdNfffiFbS84eGAegegwNgtmxIXcXEluqCZ+uU0jhFOu9BSseRHqxVx1xLR901GxbB8u/GEYZPVHllkoRH+9Ay3WfKj4ma28z1gatVscO2UUV16O504Y8pp1N8ikQ1d1PpShP+PAYXjLXdqYOtk+PQh0sNdpRWF0P/lAjAM0zkVJDVCvaBWcpKndvkZGjdaF3uSqWU9VauUVC8tmw69EV/6JaDOQQtwDC4n9tg20Gw0AnGb8Vzlnsg2371fDX340CYxzyKIxCWYPNfOZvdluCQEr1JQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=84LqcDjhmhSzOTlkbBUOdKZ9yjdyXAbdIfXFeK2c20c=; b=xKUqazXJ4v8HODHEbG9hd8dV1vzBw9vMmtUrmqlx5rV0SlYYnDfMvyNRQa2CgtVGYE5AuAbE2fKJJlcu7pRjQDqEfPigZEU7d87CvEZY11XbvJAE1mGdug++Y1PVD8B8gqI2rd6903gW8pwIfQPygN8VumUNWWWi1m1dtUtczUXeuTZWZL6KR7lH975jBdCOufM+zHGxBNJ/BQf5BUsDliVyGOunB7lsIecrAcNK1+vIWJjFVfz7WSdy5X1kqQ3KPU8JT9Ga8fF+pvZQmCMjMT3HPJjumDQjplq3Nsx4Md5gCo28EhgMiye5BOQ0ZvVV/88UwIsVHBqs3pE0DpXKUQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=84LqcDjhmhSzOTlkbBUOdKZ9yjdyXAbdIfXFeK2c20c=; b=GnxLnmcT4MM2DPA40cLRwBMyq3HWLFE3RTgZqTF31SBUgCDdUzPnbUSltFcOB5+9aa+OmPiqr1Sn1kzI24HWP1L9j+WcXC4Jr4sT5cRaEwxBTpvI41EyXlySyPb3COvJ7pqa6BntCnAHtxcy6uEIEqgRn3C1M2wK7npJPJTGTYrOpXWjQB73UwU99htnqxY1dRO/o1ersmXZndYo9bJN+ZJa7ILXyYr6Vp3EbT2SV42VSqDNZVm1et01DZhK4zVJf6ail+PR+HGt4Q99Yzfw9hYJoFkqyxUAUYWDSUk2HKZBCsb7B+3xZnjhcWWTPp8owX/koMUcGYscpk+N1tAOFQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) by AM9PR04MB8131.eurprd04.prod.outlook.com (2603:10a6:20b:3ed::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Tue, 31 Mar 2026 07:25:37 +0000 Received: from AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc]) by AM6PR04MB5110.eurprd04.prod.outlook.com ([fe80::2866:93b6:c814:89fc%5]) with mapi id 15.20.9632.017; Tue, 31 Mar 2026 07:25:37 +0000 From: ming.qian@oss.nxp.com To: linux-media@vger.kernel.org Cc: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, nicolas@ndufresne.ca, sebastian.fricke@collabora.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Frank.li@nxp.com, xiahong.bao@nxp.com, eagle.zhou@nxp.com, imx@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 7/7] media: amphion: Add V4L2 memory tracking support Date: Tue, 31 Mar 2026 15:23:17 +0800 Message-ID: <20260331072347.253-8-ming.qian@oss.nxp.com> X-Mailer: git-send-email 2.48.1.windows.1 In-Reply-To: <20260331072347.253-1-ming.qian@oss.nxp.com> References: <20260331072347.253-1-ming.qian@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA0P287CA0014.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:d9::16) To AM6PR04MB5110.eurprd04.prod.outlook.com (2603:10a6:20b:8::21) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB5110:EE_|AM9PR04MB8131:EE_ X-MS-Office365-Filtering-Correlation-Id: 38321f11-3341-4234-257a-08de8ef6b416 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|19092799006|376014|7416014|52116014|38350700014|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: Al79VKFXgJzsHqISEB3sDRdKxiI5xfd6yBqr8v5XNjfJY8n+QleZhuF8EmSspzmEOviCFXnA5mamuhDRS+ATIHgfmx3ooH4Dix2MerKegcSJDq2SFbjXxLr+cIbFvYMIYujpWPUehNDGE5O4rV8A+4VsVC+r1j7q8g32q5moAa2GgBrOSBNJSUyD01+WH7iq17d1xQs3iL7Gk3fBASCKP/xMj0Vqx1wKNa424IExzLYmEHWlKSaUKef5xrgtOm3kkd+6fqCr/x5FzTz6nHjGzOk6QA7eIrH9YwF9MECwkTU5518bFRLRhShKlUwD9reDhGI5n5G3hzFJPrDYG6DiPhkUiZ0OpmH5tdExbOy38QN95bM+TtgNu2AY5gumpN1IfDodFqpdTdKK9GSOiZFCngBGS+bWEPnIjM+amBJXRSQsymWSSYNEGi7LEUNIp7SDDfX4CMgSnpt9170STemD98JHPG3TuJ5qqy9A2/emHlQ5zD9VOw6NeZyLHjQiXYvD6SroM5k4SA/3oampquvk65BjUJkVHgoI10VV20/9ngOFfpJdhIp9eSrQY8Ql7Xi4kZOf6lgbdHzb7R/EQKRz8fUdU0LejqOmhRMuXWdaaHVBGkV4YJ8e2MDnnJ9K2FnCM0aFyMYxsIQspMbtzEqc/mH7chVDrtASks/edXXL6kY3a6HWqco9yoPhHY/j1oZU3NTNhmmP6dJt2kiq7xll536C2cNkx/G0N3aYgXTdhteU1VYbcVCXPtmVZ+LmePvTeCvOSRiTz4VW4GI81xl5+K8w4j4ARH3fYeafWbmcWpU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB5110.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(19092799006)(376014)(7416014)(52116014)(38350700014)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?hbrS0gYgq/44U5YP1uOe+xr6DDnsT6fhQLMcbY0f2M6qSl2pub1446b+g29P?= =?us-ascii?Q?Ya6PVLSe5igM0kNnco6t1e8K27mvsel+pHkz41bb75CMXJylgsZzDuWXqn3x?= =?us-ascii?Q?HvWeZcTN5S7I5R2JnRIv5P7xCX5lyD3hOb5M3cqBNEItBjsxFMTIFhcGWUWO?= =?us-ascii?Q?+ljrufhI+mPVHZULhREtWgRFiumHVPyufrw7BegzQQ4fhkyNNr+fgKQJWi3X?= =?us-ascii?Q?DJve/BZ11egvS/3axZFGc09D6JFQLB9fkeiu2D+2bnPGsIxS4nPZacIJjFZV?= =?us-ascii?Q?qbURzvO3VPMytUsovqBbCzq/R9SDKTfiLyl9D7/j+uqXp+PdUlWVY2vTjNKl?= =?us-ascii?Q?gcx8P/tFgs0HJkmnBBeqY8XS606bw6e62ADo+dmzaSN3qtsz96Rn5uPcjG+0?= =?us-ascii?Q?6UZorwaDXQQ0+RgQ+IvQilMZlkouqvFfbH3BJ8rgZBwiFvO2eFM1wqwIFjy/?= =?us-ascii?Q?MXPdcykBW3DolNAd6MpW5vAelpHB8Vzz8Lbm2dkf5+vtcY9dEqrDamQdCMt5?= =?us-ascii?Q?vE2e2D75cpfTooeBw2k+KZcAXUvN6DG52BHwZN1dSqipOdCu6LPsrbHPRHcz?= =?us-ascii?Q?q6NK/nC2C8puNfyDX18cfIkPDEcv7B5VDyaZgj/bFxTseDT/cGx2PX51XArq?= =?us-ascii?Q?IM3m43YnRQV/pWMEApFLd7sJQrNQsKRfc0h6Zg2OmqgRfeYoP4vrQqY1Wo5o?= =?us-ascii?Q?z+/rHzcHnEYN4UHv+om3t8KOj3UQ14d3WvtQsLFsyBqVmGoFWfob5nBoQDEF?= =?us-ascii?Q?fCfV925O+JPD3k+MOCY7NFOfsJPGjYEelS3XggD3PGAoIddGvxjHbr0ws77R?= =?us-ascii?Q?7RYwZZSy73ZtWj1Pj/6Iz/LYQbRiCrpDProOmq+NQcuMAufp5aIXxAaUUmoJ?= =?us-ascii?Q?BoYncm8JKzpRUxkVxewFgKm7pKprFAj19n/Q8LyoMXeZ70JfNER4odCQAZD6?= =?us-ascii?Q?5Y45GurrdqPN8V8FJWQM3TGRTwKj9gLWJujBq/qtVqgwHrYeCj3PTC1rYnVY?= =?us-ascii?Q?lQYHQgbOHtM//zc+zOikFh6zlwtctb7XspAJvlInEaqkWL/ICQlCGfhT4SIE?= =?us-ascii?Q?YED07mGCCY7sBqflihFpa2MRqN4aahgZ3QZ1xcXXZfToB2B8O3rQNaqOdLKk?= =?us-ascii?Q?+grAtZdUqSUqpHFYJGZGXj3u1/n+qOZXiBqmILyy8n4DB/MGAYhTHiwcICF6?= =?us-ascii?Q?TC+kP1WPexFPd84rD/uO0q4znVWaqX8pRvLuJFavLB78pkbH6lUyimR7kWOZ?= =?us-ascii?Q?/47g0uIlGft7RA6sCHdN/8QIkJKTvt9Q/wiE8VRJmqD8EodfxPdiswnL1DsP?= =?us-ascii?Q?Hyd/JBDxx9PvhjsmiiuMmS07SQSm58GR9nJLyAVtnL7rsjpufmBgFLYEhQXj?= =?us-ascii?Q?sw7ndyywTNEtOCLjnQPgx+t5hoo1eVjNksWCWP7DBoD4FVgqGxnYvWtwDBtS?= =?us-ascii?Q?OKZgpnqU2B1qHzA2jNIiOg+mrB9Ky3oPd2QUxs7pO+ZAobgThiAbE/vRkPan?= =?us-ascii?Q?gc6bNzPHWChS9CAZh6km31dPXcBq0r8qjtGnKvvmjWnXkHK3XB87vIU9KVrW?= =?us-ascii?Q?+sT8GfEANa2LOVkHXbEFYNfAg4tAJCNYN/3Rgdz8GM1GT8+4jyfJCGO/Pa5x?= =?us-ascii?Q?KH7n+flvdKVlzSqpHgs/itM8ebYS60knF1aEPJSwvdNcokv/oMf53l3nfD2J?= =?us-ascii?Q?AJif2HOLZZaAezpzRtl21KUKO1DT3W70IeN0A8iI8+r5WJ7W+mDAxDY1/Wae?= =?us-ascii?Q?utrRzADAxQ=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38321f11-3341-4234-257a-08de8ef6b416 X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB5110.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Mar 2026 07:25:37.1037 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: L7AmC+rCcUXRhvG+RoOoxzDl7PpX1RmbW2WjeUDwQ09+78yvKjAyCyf02YZnRaAVV7jxiIeyeQA2BzVHsK4J0A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8131 Content-Type: text/plain; charset="utf-8" From: Ming Qian Integrate V4L2 memtrack framework to track DMA buffer allocations in the Amphion VPU driver. Memory usage is organized hierarchically (device -> instance -> queue) and exposed via V4L2_CID_MEMORY_USAGE control and debugfs. Tracked buffers include firmware boot region, RPC, stream ring buffers, and codec-specific frame buffers (MBI, DCP, enc/ref frames). Signed-off-by: Ming Qian --- drivers/media/platform/amphion/Kconfig | 1 + drivers/media/platform/amphion/vdec.c | 9 ++++++ drivers/media/platform/amphion/venc.c | 9 ++++++ drivers/media/platform/amphion/vpu.h | 7 +++++ drivers/media/platform/amphion/vpu_core.c | 6 ++++ drivers/media/platform/amphion/vpu_dbg.c | 5 ++++ drivers/media/platform/amphion/vpu_drv.c | 2 ++ drivers/media/platform/amphion/vpu_v4l2.c | 35 ++++++++++++++++++++++- 8 files changed, 73 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/amphion/Kconfig b/drivers/media/platfor= m/amphion/Kconfig index 4a363e07ccc9..2835c25415c5 100644 --- a/drivers/media/platform/amphion/Kconfig +++ b/drivers/media/platform/amphion/Kconfig @@ -12,6 +12,7 @@ config VIDEO_AMPHION_VPU select V4L2_MEM2MEM_DEV select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_VMALLOC + select V4L2_MEMTRACK help Amphion VPU Codec IP contains two parts: Windsor and Malone. Windsor is encoder that supports H.264, and Malone is decoder diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform= /amphion/vdec.c index a9f0521f2e1a..2b863fadb67f 100644 --- a/drivers/media/platform/amphion/vdec.c +++ b/drivers/media/platform/amphion/vdec.c @@ -279,6 +279,9 @@ static int vdec_ctrl_init(struct vpu_inst *inst) if (ctrl) ctrl->flags |=3D V4L2_CTRL_FLAG_VOLATILE; =20 + v4l2_ctrl_new_std(&inst->ctrl_handler, NULL, + V4L2_CID_MEMORY_USAGE, 0, S64_MAX, 1, 0); + if (inst->ctrl_handler.error) { ret =3D inst->ctrl_handler.error; v4l2_ctrl_handler_free(&inst->ctrl_handler); @@ -1069,6 +1072,8 @@ static int vdec_alloc_fs_buffer(struct vpu_inst *inst= , struct vdec_fs_info *fs) =20 vpu_free_dma(buffer); buffer->length =3D fs->size; + buffer->memtrack =3D inst->memtrack; + buffer->label =3D fs->type =3D=3D MEM_RES_MBI ? "mbi" : "dcp"; return vpu_alloc_dma(inst->core, buffer); } =20 @@ -1683,6 +1688,8 @@ static int vdec_start(struct vpu_inst *inst) vpu_trace(inst->dev, "[%d]\n", inst->id); if (!vdec->udata.virt) { vdec->udata.length =3D 0x1000; + vdec->udata.memtrack =3D inst->memtrack; + vdec->udata.label =3D "udata"; ret =3D vpu_alloc_dma(inst->core, &vdec->udata); if (ret) { dev_err(inst->dev, "[%d] alloc udata fail\n", inst->id); @@ -1694,6 +1701,8 @@ static int vdec_start(struct vpu_inst *inst) stream_buffer_size =3D vpu_iface_get_stream_buffer_size(inst->core); if (stream_buffer_size > 0) { inst->stream_buffer.length =3D stream_buffer_size; + inst->stream_buffer.memtrack =3D inst->memtrack; + inst->stream_buffer.label =3D "bitstream-ring-buffer"; ret =3D vpu_alloc_dma(inst->core, &inst->stream_buffer); if (ret) { dev_err(inst->dev, "[%d] alloc stream buffer fail\n", inst->id); diff --git a/drivers/media/platform/amphion/venc.c b/drivers/media/platform= /amphion/venc.c index 0b3d58b9f2f7..193ee488eba4 100644 --- a/drivers/media/platform/amphion/venc.c +++ b/drivers/media/platform/amphion/venc.c @@ -678,6 +678,9 @@ static int venc_ctrl_init(struct vpu_inst *inst) v4l2_ctrl_new_std(&inst->ctrl_handler, NULL, V4L2_CID_MPEG_VIDEO_AVERAGE_QP, 0, 51, 1, 0); =20 + v4l2_ctrl_new_std(&inst->ctrl_handler, NULL, + V4L2_CID_MEMORY_USAGE, 0, S64_MAX, 1, 0); + if (inst->ctrl_handler.error) { ret =3D inst->ctrl_handler.error; v4l2_ctrl_handler_free(&inst->ctrl_handler); @@ -929,6 +932,8 @@ static int venc_start_session(struct vpu_inst *inst, u3= 2 type) stream_buffer_size =3D vpu_iface_get_stream_buffer_size(inst->core); if (stream_buffer_size > 0) { inst->stream_buffer.length =3D max_t(u32, stream_buffer_size, venc->cpb_= size * 3); + inst->stream_buffer.memtrack =3D inst->memtrack; + inst->stream_buffer.label =3D "bitstream-ring-buffer"; ret =3D vpu_alloc_dma(inst->core, &inst->stream_buffer); if (ret) goto error; @@ -1027,6 +1032,8 @@ static void venc_request_mem_resource(struct vpu_inst= *inst, =20 for (i =3D 0; i < enc_frame_num; i++) { venc->enc[i].length =3D enc_frame_size; + venc->enc[i].memtrack =3D inst->memtrack; + venc->enc[i].label =3D "enc-frame"; ret =3D vpu_alloc_dma(inst->core, &venc->enc[i]); if (ret) { venc_cleanup_mem_resource(inst); @@ -1035,6 +1042,8 @@ static void venc_request_mem_resource(struct vpu_inst= *inst, } for (i =3D 0; i < ref_frame_num; i++) { venc->ref[i].length =3D ref_frame_size; + venc->ref[i].memtrack =3D inst->memtrack; + venc->ref[i].label =3D "ref-frame"; ret =3D vpu_alloc_dma(inst->core, &venc->ref[i]); if (ret) { venc_cleanup_mem_resource(inst); diff --git a/drivers/media/platform/amphion/vpu.h b/drivers/media/platform/= amphion/vpu.h index bfd171a3ded4..08913cc54cb1 100644 --- a/drivers/media/platform/amphion/vpu.h +++ b/drivers/media/platform/amphion/vpu.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ #define VPU_TIMEOUT msecs_to_jiffies(1000) #define VPU_INST_NULL_ID (-1L) #define VPU_MSG_BUFFER_SIZE (8192) +#define VPU_NOTIFY_DELAY_MS (200) =20 enum imx_plat_type { IMX8QXP =3D 0, @@ -47,6 +49,8 @@ struct vpu_buffer { u32 length; u32 bytesused; struct device *dev; + struct v4l2_memtrack_node *memtrack; + const char *label; }; =20 struct vpu_func { @@ -81,6 +85,7 @@ struct vpu_dev { atomic_t ref_dec; =20 struct dentry *debugfs; + struct v4l2_memtrack_node *memtrack; }; =20 struct vpu_format { @@ -279,6 +284,8 @@ struct vpu_inst { pid_t tgid; struct dentry *debugfs; =20 + struct v4l2_memtrack_node *memtrack; + void *priv; }; =20 diff --git a/drivers/media/platform/amphion/vpu_core.c b/drivers/media/plat= form/amphion/vpu_core.c index 85cc4a14f8ed..16c2efc86feb 100644 --- a/drivers/media/platform/amphion/vpu_core.c +++ b/drivers/media/platform/amphion/vpu_core.c @@ -150,6 +150,8 @@ static int __vpu_alloc_dma(struct device *dev, struct v= pu_buffer *buf) if (!buf->virt) return -ENOMEM; =20 + if (buf->memtrack) + v4l2_memtrack_add(buf->memtrack, buf->length, buf->label); buf->dev =3D dev; =20 return 0; @@ -160,6 +162,8 @@ void vpu_free_dma(struct vpu_buffer *buf) if (!buf->virt || !buf->dev) return; =20 + if (buf->memtrack) + v4l2_memtrack_sub(buf->memtrack, buf->length, buf->label); dma_free_coherent(buf->dev, buf->length, buf->virt, buf->phys); buf->virt =3D NULL; buf->phys =3D 0; @@ -550,6 +554,7 @@ static int vpu_core_parse_dt(struct vpu_core *core, str= uct device_node *np) =20 core->fw.phys =3D res.start; core->fw.length =3D resource_size(&res); + v4l2_memtrack_add(core->vpu->memtrack, core->fw.length, "fw"); =20 ret =3D of_reserved_mem_region_to_resource(np, 1, &res); if (ret) { @@ -559,6 +564,7 @@ static int vpu_core_parse_dt(struct vpu_core *core, str= uct device_node *np) =20 core->rpc.phys =3D res.start; core->rpc.length =3D resource_size(&res); + v4l2_memtrack_add(core->vpu->memtrack, core->rpc.length, "rpc"); =20 if (core->rpc.length < core->res->rpc_size + core->res->fwlog_size) { dev_err(core->dev, "the rpc-region <%pad, 0x%x> is not enough\n", diff --git a/drivers/media/platform/amphion/vpu_dbg.c b/drivers/media/platf= orm/amphion/vpu_dbg.c index 497ae4e8a229..a82e21cc8a67 100644 --- a/drivers/media/platform/amphion/vpu_dbg.c +++ b/drivers/media/platform/amphion/vpu_dbg.c @@ -212,6 +212,11 @@ static int vpu_dbg_instance(struct seq_file *s, void *= data) if (seq_write(s, str, num)) return 0; =20 + num =3D scnprintf(str, sizeof(str), "memory usage =3D %ld\n", + v4l2_memtrack_read(inst->memtrack)); + if (seq_write(s, str, num)) + return 0; + num =3D scnprintf(str, sizeof(str), "flow :\n"); if (seq_write(s, str, num)) return 0; diff --git a/drivers/media/platform/amphion/vpu_drv.c b/drivers/media/platf= orm/amphion/vpu_drv.c index 2cca61f41bea..73e01c55da82 100644 --- a/drivers/media/platform/amphion/vpu_drv.c +++ b/drivers/media/platform/amphion/vpu_drv.c @@ -138,6 +138,7 @@ static int vpu_probe(struct platform_device *pdev) if (ret) goto err_vpu_media; vpu->debugfs =3D debugfs_create_dir("amphion_vpu", NULL); + vpu->memtrack =3D v4l2_memtrack_create_root("amphion-vpu"); =20 of_platform_populate(dev->of_node, NULL, NULL, dev); =20 @@ -162,6 +163,7 @@ static void vpu_remove(struct platform_device *pdev) struct vpu_dev *vpu =3D platform_get_drvdata(pdev); struct device *dev =3D &pdev->dev; =20 + v4l2_memtrack_destroy_node(vpu->memtrack); debugfs_remove_recursive(vpu->debugfs); vpu->debugfs =3D NULL; =20 diff --git a/drivers/media/platform/amphion/vpu_v4l2.c b/drivers/media/plat= form/amphion/vpu_v4l2.c index 7cccc994fc50..431f5f64e683 100644 --- a/drivers/media/platform/amphion/vpu_v4l2.c +++ b/drivers/media/platform/amphion/vpu_v4l2.c @@ -651,6 +651,14 @@ static const struct vb2_ops vpu_vb2_ops =3D { .buf_queue =3D vpu_vb2_buf_queue, }; =20 +static void vpu_memtrack_ctrl_notify(struct v4l2_memtrack_node *node, size= _t total, void *priv) +{ + struct v4l2_ctrl *ctrl =3D priv; + + if (ctrl) + v4l2_ctrl_s_ctrl_int64(ctrl, total); +} + static int vpu_m2m_queue_init(void *priv, struct vb2_queue *src_vq, struct= vb2_queue *dst_vq) { struct vpu_inst *inst =3D priv; @@ -668,9 +676,13 @@ static int vpu_m2m_queue_init(void *priv, struct vb2_q= ueue *src_vq, struct vb2_q src_vq->buf_struct_size =3D sizeof(struct vpu_vb2_buffer); src_vq->dev =3D inst->vpu->dev; src_vq->lock =3D &inst->lock; + if (inst->memtrack) + src_vq->memtrack =3D v4l2_memtrack_create_node(inst->memtrack, "output"); ret =3D vb2_queue_init(src_vq); - if (ret) + if (ret) { + v4l2_memtrack_destroy_node(src_vq->memtrack); return ret; + } =20 dst_vq->type =3D V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; inst->cap_format.type =3D dst_vq->type; @@ -684,8 +696,12 @@ static int vpu_m2m_queue_init(void *priv, struct vb2_q= ueue *src_vq, struct vb2_q dst_vq->buf_struct_size =3D sizeof(struct vpu_vb2_buffer); dst_vq->dev =3D inst->vpu->dev; dst_vq->lock =3D &inst->lock; + if (inst->memtrack) + dst_vq->memtrack =3D v4l2_memtrack_create_node(inst->memtrack, "capture"= ); ret =3D vb2_queue_init(dst_vq); if (ret) { + v4l2_memtrack_destroy_node(src_vq->memtrack); + v4l2_memtrack_destroy_node(dst_vq->memtrack); vb2_queue_release(src_vq); return ret; } @@ -706,6 +722,12 @@ static int vpu_v4l2_release(struct vpu_inst *inst) vpu_release_core(inst->core); put_device(inst->dev); =20 + if (inst->memtrack) { + v4l2_memtrack_unregister_notify(inst->memtrack); + v4l2_memtrack_destroy_node(inst->memtrack); + inst->memtrack =3D NULL; + } + v4l2_ctrl_handler_free(&inst->ctrl_handler); mutex_destroy(&inst->lock); =20 @@ -745,6 +767,8 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *i= nst) inst->min_buffer_out =3D 2; v4l2_fh_init(&inst->fh, func->vfd); v4l2_fh_add(&inst->fh, file); + if (vpu->memtrack) + inst->memtrack =3D v4l2_memtrack_create_node(vpu->memtrack, "instance"); =20 ret =3D call_vop(inst, ctrl_init); if (ret) @@ -757,6 +781,14 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *= inst) goto error; } =20 + if (inst->memtrack) { + v4l2_memtrack_set_notify_delay(inst->memtrack, VPU_NOTIFY_DELAY_MS); + v4l2_memtrack_register_notify(inst->memtrack, + vpu_memtrack_ctrl_notify, + v4l2_ctrl_find(&inst->ctrl_handler, + V4L2_CID_MEMORY_USAGE)); + } + inst->fh.ctrl_handler =3D &inst->ctrl_handler; inst->state =3D VPU_CODEC_STATE_DEINIT; inst->workqueue =3D alloc_ordered_workqueue("vpu_inst", WQ_MEM_RECLAIM); @@ -775,6 +807,7 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *i= nst) =20 return 0; error: + v4l2_memtrack_destroy_node(inst->memtrack); v4l2_fh_del(&inst->fh, file); v4l2_fh_exit(&inst->fh); vpu_inst_put(inst); --=20 2.53.0