From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 72A2117A31E for ; Tue, 7 Apr 2026 02:48:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775530088; cv=none; b=CPuAurG2NF7Mz1jQ1THQW/jZsdp7Wv55sJrXKc5z8Dafa1VWACgqzYQfwBKH+ieEkJ6yEZZnYBwWc+q0o1P7yzSvM9dypjWgzzomZMx9U5K5HGmTjfWI+9PtBR5G5q7L996o+PJH6ab9Ric+XV9Afa1e5sTfU+ssD84inc/eQz0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775530088; c=relaxed/simple; bh=LwAJ0orBhITziyhLCMzTZBM254JU6uYBtrpbvzVG64w=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=bCv5zsDFAScOAjAAznFQcYOVF9a4LZdzLqE6e2ezBLUjTX60r1zW0JPfMVXQHO6tZl8iq2QbpzMKruukHcFfiqybfP3fwv8V+V6P6rz+sQncNKBYKxG+RO9vZb9P8xOKnSo1eC5BMW0yCYDTfr8ezGMjSWSKGSqiidbM74QyKjE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hDfvEM5d; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hDfvEM5d" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CF798C4CEF7; Tue, 7 Apr 2026 02:48:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775530088; bh=LwAJ0orBhITziyhLCMzTZBM254JU6uYBtrpbvzVG64w=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=hDfvEM5d+vZor2ejMN7YOkBSop+f3tp4fGcz6pzI3LL5R0fADeVxVgbTD6TRU5pNN uPd8lEs3fhfGzw4iTMuXpffdo/f5xR2ZCcg9du13Rm/2zlHQSxcg1V7Gd/4KdO4BhJ 0mzkqzqzJ00gSZgK9oTQ7i3heoB1IzGydjWIZo9NrVv7KWnTbkDmekFgBX45IK3WiE BnU/kdg56Vm4wpMiCOnlzAioA4e2q9l91BX3F2yEbvK5qAUwl3EwCgwb7TDNXg/48S 9O06ZZp1HG/KKQC8WjEkiWevwrtEnyggmPePRFwNaDJqFkqADoZdGDpDVsjGntO/ow ygD+AGw0KAx6w== Message-ID: <02054871-cdac-4687-81bf-ecda3433d957@kernel.org> Date: Mon, 6 Apr 2026 21:48:06 -0500 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] firmware: stratix10-svc: kmalloc_array + kzalloc to flex Content-Language: en-US To: gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, Rosen Penev References: <20260330115101.241784-1-dinguyen@kernel.org> From: Dinh Nguyen In-Reply-To: <20260330115101.241784-1-dinguyen@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Greg, Gentle ping. Thanks, Dinh On 3/30/26 06:51, Dinh Nguyen wrote: > From: Rosen Penev > > Use a flexible array member to combine allocations. Simplifies memory > management. > > Add __counted_by for extra runtime analysis. Also move counting variable > assignment up as required by __counted_by. > > Signed-off-by: Rosen Penev > Signed-off-by: Dinh Nguyen > --- > drivers/firmware/stratix10-svc.c | 82 ++++++++++++++------------------ > 1 file changed, 37 insertions(+), 45 deletions(-) > > diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c > index e9e35d67ef96..5a76cf3fc83a 100644 > --- a/drivers/firmware/stratix10-svc.c > +++ b/drivers/firmware/stratix10-svc.c > @@ -240,10 +240,34 @@ struct stratix10_async_ctrl { > DECLARE_HASHTABLE(trx_list, ASYNC_TRX_HASH_BITS); > }; > > +/** > + * struct stratix10_svc_chan - service communication channel > + * @ctrl: pointer to service controller which is the provider of this channel > + * @scl: pointer to service client which owns the channel > + * @name: service client name associated with the channel > + * @task: pointer to the thread task which handles SMC or HVC call > + * @svc_fifo: a queue for storing service message data (separate fifo for every channel) > + * @svc_fifo_lock: protect access to service message data queue (locking pending fifo) > + * @lock: protect access to the channel > + * @async_chan: reference to asynchronous channel object for this channel > + * > + * This struct is used by service client to communicate with service layer. > + * Each service client has its own channel created by service controller. > + */ > +struct stratix10_svc_chan { > + struct stratix10_svc_controller *ctrl; > + struct stratix10_svc_client *scl; > + char *name; > + struct task_struct *task; > + struct kfifo svc_fifo; > + spinlock_t svc_fifo_lock; > + spinlock_t lock; > + struct stratix10_async_chan *async_chan; > +}; > + > /** > * struct stratix10_svc_controller - service controller > * @dev: device > - * @chans: array of service channels > * @num_chans: number of channels in 'chans' array > * @num_active_client: number of active service client > * @node: list management > @@ -253,13 +277,13 @@ struct stratix10_async_ctrl { > * @svc: manages the list of client svc drivers > * @sdm_lock: only allows a single command single response to SDM > * @actrl: async control structure > + * @chans: array of service channels > * > * This struct is used to create communication channels for service clients, to > * handle secure monitor or hypervisor call. > */ > struct stratix10_svc_controller { > struct device *dev; > - struct stratix10_svc_chan *chans; > int num_chans; > int num_active_client; > struct list_head node; > @@ -269,31 +293,7 @@ struct stratix10_svc_controller { > struct stratix10_svc *svc; > struct mutex sdm_lock; > struct stratix10_async_ctrl actrl; > -}; > - > -/** > - * struct stratix10_svc_chan - service communication channel > - * @ctrl: pointer to service controller which is the provider of this channel > - * @scl: pointer to service client which owns the channel > - * @name: service client name associated with the channel > - * @task: pointer to the thread task which handles SMC or HVC call > - * @svc_fifo: a queue for storing service message data (separate fifo for every channel) > - * @svc_fifo_lock: protect access to service message data queue (locking pending fifo) > - * @lock: protect access to the channel > - * @async_chan: reference to asynchronous channel object for this channel > - * > - * This struct is used by service client to communicate with service layer. > - * Each service client has its own channel created by service controller. > - */ > -struct stratix10_svc_chan { > - struct stratix10_svc_controller *ctrl; > - struct stratix10_svc_client *scl; > - char *name; > - struct task_struct *task; > - struct kfifo svc_fifo; > - spinlock_t svc_fifo_lock; > - spinlock_t lock; > - struct stratix10_async_chan *async_chan; > + struct stratix10_svc_chan chans[] __counted_by(num_chans); > }; > > static LIST_HEAD(svc_ctrl); > @@ -1901,7 +1901,6 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct stratix10_svc_controller *controller; > - struct stratix10_svc_chan *chans; > struct gen_pool *genpool; > struct stratix10_svc_sh_memory *sh_memory; > struct stratix10_svc *svc = NULL; > @@ -1929,23 +1928,16 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) > return PTR_ERR(genpool); > > /* allocate service controller and supporting channel */ > - controller = devm_kzalloc(dev, sizeof(*controller), GFP_KERNEL); > + controller = devm_kzalloc(dev, struct_size(controller, chans, SVC_NUM_CHANNEL), > + GFP_KERNEL); > if (!controller) { > ret = -ENOMEM; > goto err_destroy_pool; > } > > - chans = devm_kmalloc_array(dev, SVC_NUM_CHANNEL, > - sizeof(*chans), GFP_KERNEL | __GFP_ZERO); > - if (!chans) { > - ret = -ENOMEM; > - goto err_destroy_pool; > - } > - > - controller->dev = dev; > controller->num_chans = SVC_NUM_CHANNEL; > + controller->dev = dev; > controller->num_active_client = 0; > - controller->chans = chans; > controller->genpool = genpool; > controller->invoke_fn = invoke_fn; > INIT_LIST_HEAD(&controller->node); > @@ -1962,16 +1954,16 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) > mutex_init(&controller->sdm_lock); > > for (i = 0; i < SVC_NUM_CHANNEL; i++) { > - chans[i].scl = NULL; > - chans[i].ctrl = controller; > - chans[i].name = (char *)chan_names[i]; > - spin_lock_init(&chans[i].lock); > - ret = kfifo_alloc(&chans[i].svc_fifo, fifo_size, GFP_KERNEL); > + controller->chans[i].scl = NULL; > + controller->chans[i].ctrl = controller; > + controller->chans[i].name = (char *)chan_names[i]; > + spin_lock_init(&controller->chans[i].lock); > + ret = kfifo_alloc(&controller->chans[i].svc_fifo, fifo_size, GFP_KERNEL); > if (ret) { > dev_err(dev, "failed to allocate FIFO %d\n", i); > goto err_free_fifos; > } > - spin_lock_init(&chans[i].svc_fifo_lock); > + spin_lock_init(&controller->chans[i].svc_fifo_lock); > } > > list_add_tail(&controller->node, &svc_ctrl); > @@ -2015,7 +2007,7 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) > list_del(&controller->node); > /* free only the FIFOs that were successfully allocated */ > while (i--) > - kfifo_free(&chans[i].svc_fifo); > + kfifo_free(&controller->chans[i].svc_fifo); > stratix10_svc_async_exit(controller); > err_destroy_pool: > gen_pool_destroy(genpool);