From nobody Thu Apr 2 18:53:27 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9FB7234028F for ; Fri, 27 Mar 2026 03:00:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774580402; cv=none; b=ICg7mQ1A8qMFDsFCxkDUONx5rRQiCJYLzvTfe2mp6CNGGe+97vLMBdhu0/JnajhIN3CWaidQ+JuP6SBzFC2HpKhTVWY4KJC9oJYqFCygqjmYPtqCeuEWOL3G9k2bciWE5tmip5qkX9STAA3cGdY28oPn6Dts7/qh88MVWYwwmAU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774580402; c=relaxed/simple; bh=hKwae93xmtHYAdjpVNsr+gAY5z09ypQ9lhd/Gtk52cA=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=WrU7D0ZENWfIkhcCEG8le1K9Y99kvA3aZEn2RDUCAEq/BfxpVTaXsVWyUH5euxhGs+riBqCzItTbuvH8ZDqNY2X7aY1xxra3FXvKwrIhqKgfzMrYkS0emDknNRYoSpoCCGpgI0HGo0tnpKQiODBziYdlalaTaFQhxTQqwbA5J6o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=rcX3uQpZ; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rcX3uQpZ" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2a8fba3f769so6917255ad.2 for ; Thu, 26 Mar 2026 20:00:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774580401; x=1775185201; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=+AE2oYD/S8jc9LBiWpGPXEFCYuSoSUhxv8UwWq86+mY=; b=rcX3uQpZJqRcRhVX63HBhEr/SikcY1kb29Lcm1S3LBTCgONVANSzO/vdJml9J9DQQJ mLOMiESny304tPuNyHnoATbeOFfgu6ttwgcMO1C+B+DJ/VEcYBejuaDyzKZzs4BFr3cZ b0jkIAmmG/ILbJMze/kKiB5lWR+/ti81fARnoPqjioZjQH3+u+YYB7Ja1kbe6hhFp2Zq gQ7dLw0wr2MA1u++EHgdAxhBCac/ciNSghG6pef32q8Z9vMVCMk9gmbYm+4nZEwHFtAA CvX40ynGeHKSqhOKvYr3XjifMF49Qa8AW60JAciTirZxwK26aXIHa2An0dvLWj8E9rUZ lbag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774580401; x=1775185201; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=+AE2oYD/S8jc9LBiWpGPXEFCYuSoSUhxv8UwWq86+mY=; b=Lzi+wyaMM5BSobQTLdb3osStpywq94aFX5o9neqYlfKO+nLA+cs3weEGfJEEWTE26E Z8j4t7QVMOoP6qAS4rYW6Hp/Q3GCp3mV4XoVxH8ACUC+fq0TsNbRBFLEkhYq8R/+z3iM AIT9BK0KJe96Vj9bjiRI2kiskcTdTxYzTdPhrMRhqzkgj7i20Exaf6sC3su8OekdOYMf ycuTjEdC8QJdrNeolsahKFhaGv7QXjXFgCfT77dvRt9vFEvazqQGuEZNUwF7/D3r0PLi o9b9Z+VFE4sWUQY6rPefJ/iXPVCK7GCgwS0GCqv7kx9VPNenxuedirfzvsYgghSwvQ4e zV5Q== X-Forwarded-Encrypted: i=1; AJvYcCXxbI2WS/Jzs9MD7/s1RiExn5iCFh1rfIEPutma8KjPYdTTpZyftOxcU/7jH4Z6pYj3VtyA1IC4ThtMXNM=@vger.kernel.org X-Gm-Message-State: AOJu0Yyhu0iExjFlsy8HQcdZxrKZPUrdbkVfZQxAGCc+FZE0rigZxOvv aE4x0m3OR/IqXNOUYlKATMaDXmXYhIuum5fatc3W1hiHKE4KV6jDQf70 X-Gm-Gg: ATEYQzyEQ4mP6jiuMz7bvAbSHSzoORSpd72xSoGtIc4nJNETk05o3AB7YfewWDo5Yjc I1O3ldQAgTXlnUwVV2DInZP+1rgGRUIef4Tv4Oc6aTfUKlj29b+ZKqCosF9HX8s277SoFhDUqxC 5uu/pf0VoZ/z+ROkLb15LqJRT+YauISJwMAv2fZIl8PPX6IIO1BVUQ8g8U2RbSf3BZFkzCApCwY 2rdpRkFB2ndo2QDcg0qlE7bryyFFnSSCsUdFd7sCelEAzpePrZslzZDgLyLEj99NOqO28E3fa5R V4xxPrr/dvNP076DjlV9rHGey4hpldREm5rwNKvZHoiOzVZH3gVyN6knvnCAGYJ0qZNlaCKQodp l4/uBpQMyIWb42Z5vLnVPXJfOLRuuwPgUw6ia1HUGmanFM/2U3aN6CtSuhDiRrplO77LjlcyhmX WRN1J2q2kdtpXfmZU0I9FmQEYyEOtmpuEmASLS5BqMjttTs8I80/BSVxRLH6qz5xJOXQ== X-Received: by 2002:a17:903:98f:b0:2b0:b075:f2fb with SMTP id d9443c01a7336-2b0cdcb87e7mr10769425ad.35.1774580400926; Thu, 26 Mar 2026 20:00:00 -0700 (PDT) Received: from ryzen ([2601:644:8000:5b5d::8bd]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc8bb5fasm44174115ad.59.2026.03.26.19.59.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 20:00:00 -0700 (PDT) From: Rosen Penev To: dmaengine@vger.kernel.org Cc: Andy Shevchenko , Vinod Koul , Frank Li , Kees Cook , "Gustavo A. R. Silva" , linux-kernel@vger.kernel.org (open list:INTEL MID (Mobile Internet Device) PLATFORM), linux-hardening@vger.kernel.org (open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by(_le|_be)?\b) Subject: [PATCH] dmaengine: hsu: use kzalloc_flex Date: Thu, 26 Mar 2026 19:59:43 -0700 Message-ID: <20260327025943.8178-1-rosenp@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Simplifies allocations by using a flexible array member in this struct. Remove hsu_dma_alloc_desc. It now offers no readability advantages in this single usage. Add __counted_by to get extra runtime analysis. Apply the exact same treatment to struct hsu_dma and devm_kzalloc. Signed-off-by: Rosen Penev --- drivers/dma/hsu/hsu.c | 37 ++++++++----------------------------- drivers/dma/hsu/hsu.h | 4 ++-- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c index f62d60d7bc6b..150c6567eede 100644 --- a/drivers/dma/hsu/hsu.c +++ b/drivers/dma/hsu/hsu.c @@ -241,28 +241,10 @@ int hsu_dma_do_irq(struct hsu_dma_chip *chip, unsigne= d short nr, u32 status) } EXPORT_SYMBOL_GPL(hsu_dma_do_irq); =20 -static struct hsu_dma_desc *hsu_dma_alloc_desc(unsigned int nents) -{ - struct hsu_dma_desc *desc; - - desc =3D kzalloc_obj(*desc, GFP_NOWAIT); - if (!desc) - return NULL; - - desc->sg =3D kzalloc_objs(*desc->sg, nents, GFP_NOWAIT); - if (!desc->sg) { - kfree(desc); - return NULL; - } - - return desc; -} - static void hsu_dma_desc_free(struct virt_dma_desc *vdesc) { struct hsu_dma_desc *desc =3D to_hsu_dma_desc(vdesc); =20 - kfree(desc->sg); kfree(desc); } =20 @@ -276,10 +258,12 @@ static struct dma_async_tx_descriptor *hsu_dma_prep_s= lave_sg( struct scatterlist *sg; unsigned int i; =20 - desc =3D hsu_dma_alloc_desc(sg_len); + desc =3D kzalloc_flex(*desc, sg, sg_len, GFP_NOWAIT); if (!desc) return NULL; =20 + desc->nents =3D sg_len; + for_each_sg(sgl, sg, sg_len, i) { desc->sg[i].addr =3D sg_dma_address(sg); desc->sg[i].len =3D sg_dma_len(sg); @@ -287,7 +271,6 @@ static struct dma_async_tx_descriptor *hsu_dma_prep_sla= ve_sg( desc->length +=3D sg_dma_len(sg); } =20 - desc->nents =3D sg_len; desc->direction =3D direction; /* desc->active =3D 0 by kzalloc */ desc->status =3D DMA_IN_PROGRESS; @@ -430,21 +413,17 @@ int hsu_dma_probe(struct hsu_dma_chip *chip) void __iomem *addr =3D chip->regs + chip->offset; unsigned short i; int ret; + unsigned short nr_channels; =20 - hsu =3D devm_kzalloc(chip->dev, sizeof(*hsu), GFP_KERNEL); + /* Calculate nr_channels from the IO space length */ + nr_channels =3D (chip->length - chip->offset) / HSU_DMA_CHAN_LENGTH; + hsu =3D devm_kzalloc(chip->dev, struct_size(hsu, chan, nr_channels), GFP_= KERNEL); if (!hsu) return -ENOMEM; =20 + hsu->nr_channels =3D nr_channels; chip->hsu =3D hsu; =20 - /* Calculate nr_channels from the IO space length */ - hsu->nr_channels =3D (chip->length - chip->offset) / HSU_DMA_CHAN_LENGTH; - - hsu->chan =3D devm_kcalloc(chip->dev, hsu->nr_channels, - sizeof(*hsu->chan), GFP_KERNEL); - if (!hsu->chan) - return -ENOMEM; - INIT_LIST_HEAD(&hsu->dma.channels); for (i =3D 0; i < hsu->nr_channels; i++) { struct hsu_dma_chan *hsuc =3D &hsu->chan[i]; diff --git a/drivers/dma/hsu/hsu.h b/drivers/dma/hsu/hsu.h index 3bca577b98a1..f6ca1014bccf 100644 --- a/drivers/dma/hsu/hsu.h +++ b/drivers/dma/hsu/hsu.h @@ -71,11 +71,11 @@ struct hsu_dma_sg { struct hsu_dma_desc { struct virt_dma_desc vdesc; enum dma_transfer_direction direction; - struct hsu_dma_sg *sg; unsigned int nents; size_t length; unsigned int active; enum dma_status status; + struct hsu_dma_sg sg[] __counted_by(nents); }; =20 static inline struct hsu_dma_desc *to_hsu_dma_desc(struct virt_dma_desc *v= desc) @@ -115,8 +115,8 @@ struct hsu_dma { struct dma_device dma; =20 /* channels */ - struct hsu_dma_chan *chan; unsigned short nr_channels; + struct hsu_dma_chan chan[] __counted_by(nr_channels); }; =20 static inline struct hsu_dma *to_hsu_dma(struct dma_device *ddev) --=20 2.53.0