From nobody Mon Feb 9 03:33:45 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 7FFB0350A0E for ; Fri, 30 Jan 2026 23:00:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769814026; cv=none; b=eZ4IZVWwMZlHXUQjhnBGPOZ/3g67ZEq4XxkT+PmmLaFZryAGX8psXIBAKxDthL/dMntUwaFG3BCacjzxrl+9oHTr/rFRbOzxH0kY8px//HLtavJLeKrTnAunxGk6JPubbnFLDN+BNAuJQbUYyY3PLKmNuspQljJOdoxCVkLS8no= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769814026; c=relaxed/simple; bh=7IQzayO5L/U28ibpezLBMSzU5XVotlajkYPYqQBbwxg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=Whqw2kCbh5OLI/AqL4JkzEKQeUVIEMqvQkpm9K07DKTWhgyNsXHCpsQPe4TCaqK8Yrp7lTUodQLexgmbyGucSNsvn8eteFhSSjWVYsqWxSckYvNbGuzj/xpfIEaur5/SN8dMFTllG9BGUpMX/p4zXRNWvJIGLnlvxlu+dDElHFc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=G6e0EsOD; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=kEMZLIGH; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="G6e0EsOD"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="kEMZLIGH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1769814023; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xpVWSYOjmpUvjd6bPS5vI/Dt/+7lbqD30OTCkZ3YauU=; b=G6e0EsOD1RqBcrPJX4O26zLs7Y7YMZtlKAImYoIM3HQM68EDlzDbLWGx0/y5/Jk51dg7nj sR7AqSsh94UL6KK7bk0I4J5qwocl7oYHgopePBgVZfCQqmyJlGfvnpckBiyLzhIn+4+Dqu cjlJyL+Rq1ebSGZJu9XByaENovr/DZ8= Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-150-yITZ4_bXPZmh_2vpFlkDLA-1; Fri, 30 Jan 2026 18:00:21 -0500 X-MC-Unique: yITZ4_bXPZmh_2vpFlkDLA-1 X-Mimecast-MFC-AGG-ID: yITZ4_bXPZmh_2vpFlkDLA_1769814021 Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-50142190becso70090821cf.3 for ; Fri, 30 Jan 2026 15:00:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1769814021; x=1770418821; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=xpVWSYOjmpUvjd6bPS5vI/Dt/+7lbqD30OTCkZ3YauU=; b=kEMZLIGH09Z3pPkZPQ1yePCrJEjoBO2bzglyxZB0EzA5yag0VmBZnI7OVklCp7Gn5J wad7RK9tCXBk1JxURhhfDTgPZjsDkoNKPvsCKJjMzR4Do4/izQW+eIXXyzFQwlKvuJIF //977AlpdqVCvX5vQeNafAZ3LjOGRspsk3Wf29ABy9pPmowSWPsqmBv8tDo8CkVFhVKg iw4flRqLXanG0UwfcTX027cDm3Ft0ayN1jOhtMBoCpP2WqDOwUCtqA+AUqumPnYsbbnx O32f6presKhOU3+EQJ/6Jr312hJbtJhSIh1LUH+VlCLkySBvIX5kaaOpOKJuumj9kENB v15A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769814021; x=1770418821; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=xpVWSYOjmpUvjd6bPS5vI/Dt/+7lbqD30OTCkZ3YauU=; b=Zp2eYYr5sVH08XSV3qb2f6WkmxI/CXwGYKE9lBAWS36gKS0brwQwCJFD9PUSQ7686j Q6dVYd4BqnKO/Z/otMF/1qlkPIyy8+GnnPczqI55GKJpguRXMi+7vS4FAz9ipH5B24iN JZi5B2e4OcDtm8+tUwbsQiR97LinHK6OgrYkoYJqlEEvlm2vdaYydLtJSgarDN/jTbGW GPZ2ne/e7Xf5WfLmUWO4GVyZX/x9rQtxDxyZUkccPzSfijDwuhIoH/GIoQJ5NpWVw8Ju QROuwmD08iNCS4fpel8dOFqh0V4zW2xuk59Bal4MbQeR5ywSgb5w1pM/jdtTzqV6hjMq 0Kxw== X-Forwarded-Encrypted: i=1; AJvYcCUpXxpYDhATI6shw+e0/+fjE55WVqLPLtbAB0ktRiMv/DSZx7g6qEVgONa85FcwmkopFFU5HY1j573xER4=@vger.kernel.org X-Gm-Message-State: AOJu0YzJcx8wZ/Qa3TP58ZabpsjMWC4bSiW5hc1kLbIL5sDiQoGI0/qY TkMzaXIYTxydKEgSYC4t7+49IsgJU02gKaB9/3u68OcfEXvAh7ljGqYwzyuVLAPEzpBKryXfrzT p9rEPeNrsJpJVuEJlWOCSvO5m1jdZBukr12o6f9kkPi8jh15HYXa9Jsk6csFfs1EwdQ== X-Gm-Gg: AZuq6aKa+z7K9Wi7ZcGYhRrZrdVcMXyxtgZ4ivuYbkhcUCspfwg3Qg2KwOiDGiwBiCb TBpnLpr3cox3BqzHj6ZKhT/9bO6gSCiYtLqvApHBQzF15rlD/EKjzWx1bT4+xwP2o9eQiNB+xTJ tTeUaaQwn9Z32XrdMmbzUzrRef9LsPL/iKFu9ZmrbQEI9lRCmJcUNeIQ8e1q2En2TVqSjcLxm8a jLA/Tv/E2k7DJbebEiO/LlGPzlEVxboNHm5u0ypeaDka9aql5GYbvmmj/97xBwmsnRtrmAlxcAl 2VLXk9mS9DW8aorzUaEIY8gw0bHAEEhhfhNii2qofwdXxiisn0A9dEQGzGI3xHplQYskW4IPvh3 VtzWwM3/u65Rgl6fRjHVwnddyfCm+zSk7dxHRs2o99sVBekf27bw= X-Received: by 2002:ac8:5ac7:0:b0:4f1:ca4f:d480 with SMTP id d75a77b69052e-505d2263fddmr58996201cf.45.1769814020766; Fri, 30 Jan 2026 15:00:20 -0800 (PST) X-Received: by 2002:ac8:5ac7:0:b0:4f1:ca4f:d480 with SMTP id d75a77b69052e-505d2263fddmr58995451cf.45.1769814020240; Fri, 30 Jan 2026 15:00:20 -0800 (PST) Received: from localhost (pool-100-17-18-12.bstnma.fios.verizon.net. [100.17.18.12]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-894d375e1c8sm70249956d6.48.2026.01.30.15.00.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Jan 2026 15:00:19 -0800 (PST) From: Eric Chanudet Date: Fri, 30 Jan 2026 17:55:30 -0500 Subject: [PATCH] dma-buf: heaps: cma: register a dmem region for each cma heap Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-dmabuf-heap-cma-dmem-v1-1-3647ea993e99@redhat.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/x3MMQqAMAxA0atIZgNtEBGvIg7RpjZDq7Qognh3i +Mb/n+gSFYpMDYPZLm06J4qbNvAGjhtguqqgQz1xtKALvJyegzCB66RqyWi7ywZJuc7HqCmRxa v97+d5vf9AHWa3QpmAAAA X-Change-ID: 20260128-dmabuf-heap-cma-dmem-f4120a2df4a8 To: Sumit Semwal , Benjamin Gaignard , Brian Starkey , John Stultz , "T.J. Mercier" , =?utf-8?q?Christian_K=C3=B6nig?= Cc: linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, linux-kernel@vger.kernel.org, Maxime Ripard , Albert Esteve , Eric Chanudet X-Mailer: b4 0.14.2 The cma dma-buf heaps let userspace allocate buffers in CMA regions without enforcing limits. Register a dmem region per cma heap and charge against it when allocating a buffer in a cma heap. For the default cma region, two heaps may be created for the same cma range: commit 854acbe75ff4 ("dma-buf: heaps: Give default CMA heap a fixed name") Introduced /dev/dma_heap/default_cma_region commit 4f5f8baf7341 ("dma-buf: heaps: cma: Create CMA heap for each CMA reserved region") Created a CMA heap for each CMA region, which might create a duplicate heap to the default one, e.g: /dev/dma_heap/default_cma_region /dev/dma_heap/reserved Removing the legacy heap would break user API. So handle the special case by using one dmem between the two heaps to account charges correctly. Signed-off-by: Eric Chanudet --- In continuation with introducing cgroup for the system heap[1], this behavior is enabled based on dma_heap.mem_accounting, disabled by default. dmem is chosen for CMA heaps as it allows limits to be set for each region backing each heap. There is one caveat for the default cma range that may accessible through two different cma heaps, which is treated as a special case. [1] https://lore.kernel.org/all/20260116-dmabuf-heap-system-memcg-v3-0-ecc6= b62cc446@redhat.com/ --- drivers/dma-buf/heaps/cma_heap.c | 51 ++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/drivers/dma-buf/heaps/cma_heap.c b/drivers/dma-buf/heaps/cma_h= eap.c index 49cc45fb42dd7200c3c14384bcfdbe85323454b1..608af8ad6bce7fe0321da6d8f1b= 65a69f5d8d950 100644 --- a/drivers/dma-buf/heaps/cma_heap.c +++ b/drivers/dma-buf/heaps/cma_heap.c @@ -27,6 +27,7 @@ #include #include #include +#include =20 #define DEFAULT_CMA_NAME "default_cma_region" =20 @@ -46,7 +47,9 @@ int __init dma_heap_cma_register_heap(struct cma *cma) struct cma_heap { struct dma_heap *heap; struct cma *cma; + struct dmem_cgroup_region *cg; }; +static struct dmem_cgroup_region *default_cma_cg; =20 struct cma_heap_buffer { struct cma_heap *heap; @@ -58,6 +61,7 @@ struct cma_heap_buffer { pgoff_t pagecount; int vmap_cnt; void *vaddr; + struct dmem_cgroup_pool_state *pool; }; =20 struct dma_heap_attachment { @@ -276,6 +280,7 @@ static void cma_heap_dma_buf_release(struct dma_buf *dm= abuf) kfree(buffer->pages); /* release memory */ cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount); + dmem_cgroup_uncharge(buffer->pool, buffer->len); kfree(buffer); } =20 @@ -319,9 +324,16 @@ static struct dma_buf *cma_heap_allocate(struct dma_he= ap *heap, if (align > CONFIG_CMA_ALIGNMENT) align =3D CONFIG_CMA_ALIGNMENT; =20 + if (mem_accounting) { + ret =3D dmem_cgroup_try_charge(cma_heap->cg, size, + &buffer->pool, NULL); + if (ret) + goto free_buffer; + } + cma_pages =3D cma_alloc(cma_heap->cma, pagecount, align, false); if (!cma_pages) - goto free_buffer; + goto uncharge_cgroup; =20 /* Clear the cma pages */ if (PageHighMem(cma_pages)) { @@ -376,6 +388,8 @@ static struct dma_buf *cma_heap_allocate(struct dma_hea= p *heap, kfree(buffer->pages); free_cma: cma_release(cma_heap->cma, cma_pages, pagecount); +uncharge_cgroup: + dmem_cgroup_uncharge(buffer->pool, size); free_buffer: kfree(buffer); =20 @@ -390,25 +404,52 @@ static int __init __add_cma_heap(struct cma *cma, con= st char *name) { struct dma_heap_export_info exp_info; struct cma_heap *cma_heap; + struct dmem_cgroup_region *region; + int ret; =20 cma_heap =3D kzalloc(sizeof(*cma_heap), GFP_KERNEL); if (!cma_heap) return -ENOMEM; cma_heap->cma =3D cma; =20 + /* + * If two heaps are created for the default cma region, use the same + * dmem for them. They both use the same memory pool. + */ + if (dev_get_cma_area(NULL) =3D=3D cma && default_cma_cg) + region =3D default_cma_cg; + else { + region =3D dmem_cgroup_register_region(cma_get_size(cma), "cma/%s", name= ); + if (IS_ERR(region)) { + ret =3D PTR_ERR(region); + goto free_cma_heap; + } + } + cma_heap->cg =3D region; + exp_info.name =3D name; exp_info.ops =3D &cma_heap_ops; exp_info.priv =3D cma_heap; =20 cma_heap->heap =3D dma_heap_add(&exp_info); if (IS_ERR(cma_heap->heap)) { - int ret =3D PTR_ERR(cma_heap->heap); - - kfree(cma_heap); - return ret; + ret =3D PTR_ERR(cma_heap->heap); + goto cg_unregister; } =20 + if (dev_get_cma_area(NULL) =3D=3D cma && !default_cma_cg) + default_cma_cg =3D region; + return 0; + +cg_unregister: + /* default_cma_cg =3D=3D cma_heap->cg only for the duplicate heap. */ + if (default_cma_cg !=3D cma_heap->cg) + dmem_cgroup_unregister_region(cma_heap->cg); +free_cma_heap: + kfree(cma_heap); + + return ret; } =20 static int __init add_cma_heaps(void) --- base-commit: 3d65e4c276b32c03450261d114e495fda03c8e97 change-id: 20260128-dmabuf-heap-cma-dmem-f4120a2df4a8 Best regards, --=20 Eric Chanudet