[PATCH] media: amphion: Use kmalloc instead of vmalloc

ming.qian@oss.nxp.com posted 1 patch 1 month, 2 weeks ago
drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
4 files changed, 27 insertions(+), 35 deletions(-)
[PATCH] media: amphion: Use kmalloc instead of vmalloc
Posted by ming.qian@oss.nxp.com 1 month, 2 weeks ago
From: Ming Qian <ming.qian@oss.nxp.com>

Replace vmalloc/vfree with kmalloc/kfree for allocating small
driver structures (vpu_inst, vdec_t, venc_t, vpu_cmd_t, and
frame objects).

vmalloc() is designed for large memory allocations and incurs
unnecessary overhead for small objects due to virtual memory
mapping. kmalloc() is more appropriate as it allocates physically
contiguous memory with lower overhead.

ftrace measurements of vpu_alloc_cmd() show significant improvement:

  Before (vmalloc):  35-72 us   (avg ~45.7 us)
  After (kmalloc):   11-26 us   (avg ~16.8 us)

This reduces allocation time by approximately 63%.

No functional changes are intended.

Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>
---
 drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
 drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
 drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
 drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
 4 files changed, 27 insertions(+), 35 deletions(-)

diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c
index c0d2aabb9e0e..7a1c58cac02d 100644
--- a/drivers/media/platform/amphion/vdec.c
+++ b/drivers/media/platform/amphion/vdec.c
@@ -9,7 +9,6 @@
 #include <linux/list.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/vmalloc.h>
 #include <linux/videodev2.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-event.h>
@@ -17,7 +16,6 @@
 #include <media/v4l2-ioctl.h>
 #include <media/videobuf2-v4l2.h>
 #include <media/videobuf2-dma-contig.h>
-#include <media/videobuf2-vmalloc.h>
 #include "vpu.h"
 #include "vpu_defs.h"
 #include "vpu_core.h"
@@ -1642,9 +1640,9 @@ static void vdec_cleanup(struct vpu_inst *inst)
 		vdec->slots = NULL;
 		vdec->slot_count = 0;
 	}
-	vfree(vdec);
+	kfree(vdec);
 	inst->priv = NULL;
-	vfree(inst);
+	kfree(inst);
 }
 
 static void vdec_init_params(struct vdec_t *vdec)
@@ -1909,13 +1907,13 @@ static int vdec_open(struct file *file)
 	struct vdec_t *vdec;
 	int ret;
 
-	inst = vzalloc(sizeof(*inst));
+	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
 	if (!inst)
 		return -ENOMEM;
 
-	vdec = vzalloc(sizeof(*vdec));
+	vdec = kzalloc(sizeof(*vdec), GFP_KERNEL);
 	if (!vdec) {
-		vfree(inst);
+		kfree(inst);
 		return -ENOMEM;
 	}
 
@@ -1923,8 +1921,8 @@ static int vdec_open(struct file *file)
 				    sizeof(*vdec->slots),
 				    GFP_KERNEL | __GFP_ZERO);
 	if (!vdec->slots) {
-		vfree(vdec);
-		vfree(inst);
+		kfree(vdec);
+		kfree(inst);
 		return -ENOMEM;
 	}
 	vdec->slot_count = VDEC_SLOT_CNT_DFT;
diff --git a/drivers/media/platform/amphion/venc.c b/drivers/media/platform/amphion/venc.c
index aced76401b69..9e5cbc2b0d3f 100644
--- a/drivers/media/platform/amphion/venc.c
+++ b/drivers/media/platform/amphion/venc.c
@@ -13,14 +13,12 @@
 #include <linux/videodev2.h>
 #include <linux/ktime.h>
 #include <linux/rational.h>
-#include <linux/vmalloc.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-mem2mem.h>
 #include <media/v4l2-ioctl.h>
 #include <media/videobuf2-v4l2.h>
 #include <media/videobuf2-dma-contig.h>
-#include <media/videobuf2-vmalloc.h>
 #include "vpu.h"
 #include "vpu_defs.h"
 #include "vpu_core.h"
@@ -844,7 +842,7 @@ static int venc_get_encoded_frames(struct vpu_inst *inst)
 					       v4l2_m2m_dst_buf_remove(inst->fh.m2m_ctx)))
 			break;
 		list_del_init(&frame->list);
-		vfree(frame);
+		kfree(frame);
 	}
 
 	return 0;
@@ -860,7 +858,7 @@ static int venc_frame_encoded(struct vpu_inst *inst, void *arg)
 	if (!info)
 		return -EINVAL;
 	venc = inst->priv;
-	frame = vzalloc(sizeof(*frame));
+	frame = kzalloc(sizeof(*frame), GFP_KERNEL);
 	if (!frame)
 		return -ENOMEM;
 
@@ -912,9 +910,9 @@ static void venc_cleanup(struct vpu_inst *inst)
 		return;
 
 	venc = inst->priv;
-	vfree(venc);
+	kfree(venc);
 	inst->priv = NULL;
-	vfree(inst);
+	kfree(inst);
 }
 
 static int venc_start_session(struct vpu_inst *inst, u32 type)
@@ -1067,7 +1065,7 @@ static void venc_cleanup_frames(struct venc_t *venc)
 
 	list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
 		list_del_init(&frame->list);
-		vfree(frame);
+		kfree(frame);
 	}
 }
 
@@ -1151,7 +1149,7 @@ static int venc_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
 		return ret;
 
 	list_del_init(&frame->list);
-	vfree(frame);
+	kfree(frame);
 	return 0;
 }
 
@@ -1309,13 +1307,13 @@ static int venc_open(struct file *file)
 	struct venc_t *venc;
 	int ret;
 
-	inst = vzalloc(sizeof(*inst));
+	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
 	if (!inst)
 		return -ENOMEM;
 
-	venc = vzalloc(sizeof(*venc));
+	venc = kzalloc(sizeof(*venc), GFP_KERNEL);
 	if (!venc) {
-		vfree(inst);
+		kfree(inst);
 		return -ENOMEM;
 	}
 
diff --git a/drivers/media/platform/amphion/vpu_cmds.c b/drivers/media/platform/amphion/vpu_cmds.c
index 5695f5c1cb3e..ab69412e0aa7 100644
--- a/drivers/media/platform/amphion/vpu_cmds.c
+++ b/drivers/media/platform/amphion/vpu_cmds.c
@@ -13,7 +13,6 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/delay.h>
-#include <linux/vmalloc.h>
 #include "vpu.h"
 #include "vpu_defs.h"
 #include "vpu_cmds.h"
@@ -84,13 +83,13 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
 	int i;
 	int ret;
 
-	cmd = vzalloc(sizeof(*cmd));
+	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
 	if (!cmd)
 		return NULL;
 
-	cmd->pkt = vzalloc(sizeof(*cmd->pkt));
+	cmd->pkt = kzalloc(sizeof(*cmd->pkt), GFP_KERNEL);
 	if (!cmd->pkt) {
-		vfree(cmd);
+		kfree(cmd);
 		return NULL;
 	}
 
@@ -98,8 +97,8 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
 	ret = vpu_iface_pack_cmd(inst->core, cmd->pkt, inst->id, id, data);
 	if (ret) {
 		dev_err(inst->dev, "iface pack cmd %s fail\n", vpu_id_name(id));
-		vfree(cmd->pkt);
-		vfree(cmd);
+		kfree(cmd->pkt);
+		kfree(cmd);
 		return NULL;
 	}
 	for (i = 0; i < ARRAY_SIZE(vpu_cmd_requests); i++) {
@@ -118,8 +117,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
 		return;
 	if (cmd->last_response_cmd)
 		atomic_long_set(cmd->last_response_cmd, cmd->key);
-	vfree(cmd->pkt);
-	vfree(cmd);
+	kfree(cmd->pkt);
+	kfree(cmd);
 }
 
 static int vpu_session_process_cmd(struct vpu_inst *inst, struct vpu_cmd_t *cmd)
diff --git a/drivers/media/platform/amphion/vpu_core.c b/drivers/media/platform/amphion/vpu_core.c
index 168f0514851e..85cc4a14f8ed 100644
--- a/drivers/media/platform/amphion/vpu_core.c
+++ b/drivers/media/platform/amphion/vpu_core.c
@@ -17,7 +17,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/pm_domain.h>
 #include <linux/firmware.h>
-#include <linux/vmalloc.h>
 #include "vpu.h"
 #include "vpu_defs.h"
 #include "vpu_core.h"
@@ -265,7 +264,7 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
 	INIT_WORK(&core->msg_work, vpu_msg_run_work);
 	INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
 	buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
-	core->msg_buffer = vzalloc(buffer_size);
+	core->msg_buffer = kzalloc(buffer_size, GFP_KERNEL);
 	if (!core->msg_buffer) {
 		dev_err(core->dev, "failed allocate buffer for fifo\n");
 		ret = -ENOMEM;
@@ -282,10 +281,8 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
 
 	return 0;
 error:
-	if (core->msg_buffer) {
-		vfree(core->msg_buffer);
-		core->msg_buffer = NULL;
-	}
+	kfree(core->msg_buffer);
+	core->msg_buffer = NULL;
 	if (core->workqueue) {
 		destroy_workqueue(core->workqueue);
 		core->workqueue = NULL;
@@ -308,7 +305,7 @@ static int vpu_core_unregister(struct device *dev, struct vpu_core *core)
 
 	vpu_core_put_vpu(core);
 	core->vpu = NULL;
-	vfree(core->msg_buffer);
+	kfree(core->msg_buffer);
 	core->msg_buffer = NULL;
 
 	if (core->workqueue) {

base-commit: b70886ff5833cf499e77af77d2324ce8f68b60ce
-- 
2.52.0
Re: [PATCH] media: amphion: Use kmalloc instead of vmalloc
Posted by Frank Li 1 month ago
On Mon, Dec 22, 2025 at 04:49:10PM +0800, ming.qian@oss.nxp.com wrote:
> From: Ming Qian <ming.qian@oss.nxp.com>
>
> Replace vmalloc/vfree with kmalloc/kfree for allocating small
> driver structures (vpu_inst, vdec_t, venc_t, vpu_cmd_t, and
> frame objects).
>
> vmalloc() is designed for large memory allocations and incurs
> unnecessary overhead for small objects due to virtual memory
> mapping. kmalloc() is more appropriate as it allocates physically
> contiguous memory with lower overhead.
>
> ftrace measurements of vpu_alloc_cmd() show significant improvement:
>
>   Before (vmalloc):  35-72 us   (avg ~45.7 us)
>   After (kmalloc):   11-26 us   (avg ~16.8 us)
>
> This reduces allocation time by approximately 63%.
>
> No functional changes are intended.
>
> Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>
> ---

Reviewed-by: Frank Li <Frank.Li@nxp.com>

>  drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
>  drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
>  drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
>  drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
>  4 files changed, 27 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c
> index c0d2aabb9e0e..7a1c58cac02d 100644
> --- a/drivers/media/platform/amphion/vdec.c
> +++ b/drivers/media/platform/amphion/vdec.c
> @@ -9,7 +9,6 @@
>  #include <linux/list.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> -#include <linux/vmalloc.h>
>  #include <linux/videodev2.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
> @@ -17,7 +16,6 @@
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -1642,9 +1640,9 @@ static void vdec_cleanup(struct vpu_inst *inst)
>  		vdec->slots = NULL;
>  		vdec->slot_count = 0;
>  	}
> -	vfree(vdec);
> +	kfree(vdec);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>
>  static void vdec_init_params(struct vdec_t *vdec)
> @@ -1909,13 +1907,13 @@ static int vdec_open(struct file *file)
>  	struct vdec_t *vdec;
>  	int ret;
>
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>
> -	vdec = vzalloc(sizeof(*vdec));
> +	vdec = kzalloc(sizeof(*vdec), GFP_KERNEL);
>  	if (!vdec) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>
> @@ -1923,8 +1921,8 @@ static int vdec_open(struct file *file)
>  				    sizeof(*vdec->slots),
>  				    GFP_KERNEL | __GFP_ZERO);
>  	if (!vdec->slots) {
> -		vfree(vdec);
> -		vfree(inst);
> +		kfree(vdec);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  	vdec->slot_count = VDEC_SLOT_CNT_DFT;
> diff --git a/drivers/media/platform/amphion/venc.c b/drivers/media/platform/amphion/venc.c
> index aced76401b69..9e5cbc2b0d3f 100644
> --- a/drivers/media/platform/amphion/venc.c
> +++ b/drivers/media/platform/amphion/venc.c
> @@ -13,14 +13,12 @@
>  #include <linux/videodev2.h>
>  #include <linux/ktime.h>
>  #include <linux/rational.h>
> -#include <linux/vmalloc.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
>  #include <media/v4l2-mem2mem.h>
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -844,7 +842,7 @@ static int venc_get_encoded_frames(struct vpu_inst *inst)
>  					       v4l2_m2m_dst_buf_remove(inst->fh.m2m_ctx)))
>  			break;
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>
>  	return 0;
> @@ -860,7 +858,7 @@ static int venc_frame_encoded(struct vpu_inst *inst, void *arg)
>  	if (!info)
>  		return -EINVAL;
>  	venc = inst->priv;
> -	frame = vzalloc(sizeof(*frame));
> +	frame = kzalloc(sizeof(*frame), GFP_KERNEL);
>  	if (!frame)
>  		return -ENOMEM;
>
> @@ -912,9 +910,9 @@ static void venc_cleanup(struct vpu_inst *inst)
>  		return;
>
>  	venc = inst->priv;
> -	vfree(venc);
> +	kfree(venc);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>
>  static int venc_start_session(struct vpu_inst *inst, u32 type)
> @@ -1067,7 +1065,7 @@ static void venc_cleanup_frames(struct venc_t *venc)
>
>  	list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>  }
>
> @@ -1151,7 +1149,7 @@ static int venc_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
>  		return ret;
>
>  	list_del_init(&frame->list);
> -	vfree(frame);
> +	kfree(frame);
>  	return 0;
>  }
>
> @@ -1309,13 +1307,13 @@ static int venc_open(struct file *file)
>  	struct venc_t *venc;
>  	int ret;
>
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>
> -	venc = vzalloc(sizeof(*venc));
> +	venc = kzalloc(sizeof(*venc), GFP_KERNEL);
>  	if (!venc) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>
> diff --git a/drivers/media/platform/amphion/vpu_cmds.c b/drivers/media/platform/amphion/vpu_cmds.c
> index 5695f5c1cb3e..ab69412e0aa7 100644
> --- a/drivers/media/platform/amphion/vpu_cmds.c
> +++ b/drivers/media/platform/amphion/vpu_cmds.c
> @@ -13,7 +13,6 @@
>  #include <linux/slab.h>
>  #include <linux/types.h>
>  #include <linux/delay.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_cmds.h"
> @@ -84,13 +83,13 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>  	int i;
>  	int ret;
>
> -	cmd = vzalloc(sizeof(*cmd));
> +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
>  	if (!cmd)
>  		return NULL;
>
> -	cmd->pkt = vzalloc(sizeof(*cmd->pkt));
> +	cmd->pkt = kzalloc(sizeof(*cmd->pkt), GFP_KERNEL);
>  	if (!cmd->pkt) {
> -		vfree(cmd);
> +		kfree(cmd);
>  		return NULL;
>  	}
>
> @@ -98,8 +97,8 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>  	ret = vpu_iface_pack_cmd(inst->core, cmd->pkt, inst->id, id, data);
>  	if (ret) {
>  		dev_err(inst->dev, "iface pack cmd %s fail\n", vpu_id_name(id));
> -		vfree(cmd->pkt);
> -		vfree(cmd);
> +		kfree(cmd->pkt);
> +		kfree(cmd);
>  		return NULL;
>  	}
>  	for (i = 0; i < ARRAY_SIZE(vpu_cmd_requests); i++) {
> @@ -118,8 +117,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
>  		return;
>  	if (cmd->last_response_cmd)
>  		atomic_long_set(cmd->last_response_cmd, cmd->key);
> -	vfree(cmd->pkt);
> -	vfree(cmd);
> +	kfree(cmd->pkt);
> +	kfree(cmd);
>  }
>
>  static int vpu_session_process_cmd(struct vpu_inst *inst, struct vpu_cmd_t *cmd)
> diff --git a/drivers/media/platform/amphion/vpu_core.c b/drivers/media/platform/amphion/vpu_core.c
> index 168f0514851e..85cc4a14f8ed 100644
> --- a/drivers/media/platform/amphion/vpu_core.c
> +++ b/drivers/media/platform/amphion/vpu_core.c
> @@ -17,7 +17,6 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/pm_domain.h>
>  #include <linux/firmware.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -265,7 +264,7 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>  	INIT_WORK(&core->msg_work, vpu_msg_run_work);
>  	INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
>  	buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
> -	core->msg_buffer = vzalloc(buffer_size);
> +	core->msg_buffer = kzalloc(buffer_size, GFP_KERNEL);
>  	if (!core->msg_buffer) {
>  		dev_err(core->dev, "failed allocate buffer for fifo\n");
>  		ret = -ENOMEM;
> @@ -282,10 +281,8 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>
>  	return 0;
>  error:
> -	if (core->msg_buffer) {
> -		vfree(core->msg_buffer);
> -		core->msg_buffer = NULL;
> -	}
> +	kfree(core->msg_buffer);
> +	core->msg_buffer = NULL;
>  	if (core->workqueue) {
>  		destroy_workqueue(core->workqueue);
>  		core->workqueue = NULL;
> @@ -308,7 +305,7 @@ static int vpu_core_unregister(struct device *dev, struct vpu_core *core)
>
>  	vpu_core_put_vpu(core);
>  	core->vpu = NULL;
> -	vfree(core->msg_buffer);
> +	kfree(core->msg_buffer);
>  	core->msg_buffer = NULL;
>
>  	if (core->workqueue) {
>
> base-commit: b70886ff5833cf499e77af77d2324ce8f68b60ce
> --
> 2.52.0
>
Re: [PATCH] media: amphion: Use kmalloc instead of vmalloc
Posted by Nicolas Dufresne 1 month ago
Hi,


Le lundi 22 décembre 2025 à 16:49 +0800, ming.qian@oss.nxp.com a écrit :
> From: Ming Qian <ming.qian@oss.nxp.com>
> 
> Replace vmalloc/vfree with kmalloc/kfree for allocating small
> driver structures (vpu_inst, vdec_t, venc_t, vpu_cmd_t, and
> frame objects).
> 
> vmalloc() is designed for large memory allocations and incurs
> unnecessary overhead for small objects due to virtual memory
> mapping. kmalloc() is more appropriate as it allocates physically
> contiguous memory with lower overhead.
> 
> ftrace measurements of vpu_alloc_cmd() show significant improvement:
> 
>   Before (vmalloc):  35-72 us   (avg ~45.7 us)
>   After (kmalloc):   11-26 us   (avg ~16.8 us)
> 
> This reduces allocation time by approximately 63%.
> 
> No functional changes are intended.
> 
> Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>

Looks good to me.

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
>  drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
>  drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
>  drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
>  4 files changed, 27 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/media/platform/amphion/vdec.c
> b/drivers/media/platform/amphion/vdec.c
> index c0d2aabb9e0e..7a1c58cac02d 100644
> --- a/drivers/media/platform/amphion/vdec.c
> +++ b/drivers/media/platform/amphion/vdec.c
> @@ -9,7 +9,6 @@
>  #include <linux/list.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> -#include <linux/vmalloc.h>
>  #include <linux/videodev2.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
> @@ -17,7 +16,6 @@
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -1642,9 +1640,9 @@ static void vdec_cleanup(struct vpu_inst *inst)
>  		vdec->slots = NULL;
>  		vdec->slot_count = 0;
>  	}
> -	vfree(vdec);
> +	kfree(vdec);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>  
>  static void vdec_init_params(struct vdec_t *vdec)
> @@ -1909,13 +1907,13 @@ static int vdec_open(struct file *file)
>  	struct vdec_t *vdec;
>  	int ret;
>  
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>  
> -	vdec = vzalloc(sizeof(*vdec));
> +	vdec = kzalloc(sizeof(*vdec), GFP_KERNEL);
>  	if (!vdec) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  
> @@ -1923,8 +1921,8 @@ static int vdec_open(struct file *file)
>  				    sizeof(*vdec->slots),
>  				    GFP_KERNEL | __GFP_ZERO);
>  	if (!vdec->slots) {
> -		vfree(vdec);
> -		vfree(inst);
> +		kfree(vdec);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  	vdec->slot_count = VDEC_SLOT_CNT_DFT;
> diff --git a/drivers/media/platform/amphion/venc.c
> b/drivers/media/platform/amphion/venc.c
> index aced76401b69..9e5cbc2b0d3f 100644
> --- a/drivers/media/platform/amphion/venc.c
> +++ b/drivers/media/platform/amphion/venc.c
> @@ -13,14 +13,12 @@
>  #include <linux/videodev2.h>
>  #include <linux/ktime.h>
>  #include <linux/rational.h>
> -#include <linux/vmalloc.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
>  #include <media/v4l2-mem2mem.h>
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -844,7 +842,7 @@ static int venc_get_encoded_frames(struct vpu_inst *inst)
>  					       v4l2_m2m_dst_buf_remove(inst-
> >fh.m2m_ctx)))
>  			break;
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>  
>  	return 0;
> @@ -860,7 +858,7 @@ static int venc_frame_encoded(struct vpu_inst *inst, void
> *arg)
>  	if (!info)
>  		return -EINVAL;
>  	venc = inst->priv;
> -	frame = vzalloc(sizeof(*frame));
> +	frame = kzalloc(sizeof(*frame), GFP_KERNEL);
>  	if (!frame)
>  		return -ENOMEM;
>  
> @@ -912,9 +910,9 @@ static void venc_cleanup(struct vpu_inst *inst)
>  		return;
>  
>  	venc = inst->priv;
> -	vfree(venc);
> +	kfree(venc);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>  
>  static int venc_start_session(struct vpu_inst *inst, u32 type)
> @@ -1067,7 +1065,7 @@ static void venc_cleanup_frames(struct venc_t *venc)
>  
>  	list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>  }
>  
> @@ -1151,7 +1149,7 @@ static int venc_process_capture(struct vpu_inst *inst,
> struct vb2_buffer *vb)
>  		return ret;
>  
>  	list_del_init(&frame->list);
> -	vfree(frame);
> +	kfree(frame);
>  	return 0;
>  }
>  
> @@ -1309,13 +1307,13 @@ static int venc_open(struct file *file)
>  	struct venc_t *venc;
>  	int ret;
>  
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>  
> -	venc = vzalloc(sizeof(*venc));
> +	venc = kzalloc(sizeof(*venc), GFP_KERNEL);
>  	if (!venc) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  
> diff --git a/drivers/media/platform/amphion/vpu_cmds.c
> b/drivers/media/platform/amphion/vpu_cmds.c
> index 5695f5c1cb3e..ab69412e0aa7 100644
> --- a/drivers/media/platform/amphion/vpu_cmds.c
> +++ b/drivers/media/platform/amphion/vpu_cmds.c
> @@ -13,7 +13,6 @@
>  #include <linux/slab.h>
>  #include <linux/types.h>
>  #include <linux/delay.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_cmds.h"
> @@ -84,13 +83,13 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst
> *inst, u32 id, void *data
>  	int i;
>  	int ret;
>  
> -	cmd = vzalloc(sizeof(*cmd));
> +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
>  	if (!cmd)
>  		return NULL;
>  
> -	cmd->pkt = vzalloc(sizeof(*cmd->pkt));
> +	cmd->pkt = kzalloc(sizeof(*cmd->pkt), GFP_KERNEL);
>  	if (!cmd->pkt) {
> -		vfree(cmd);
> +		kfree(cmd);
>  		return NULL;
>  	}
>  
> @@ -98,8 +97,8 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst
> *inst, u32 id, void *data
>  	ret = vpu_iface_pack_cmd(inst->core, cmd->pkt, inst->id, id, data);
>  	if (ret) {
>  		dev_err(inst->dev, "iface pack cmd %s fail\n",
> vpu_id_name(id));
> -		vfree(cmd->pkt);
> -		vfree(cmd);
> +		kfree(cmd->pkt);
> +		kfree(cmd);
>  		return NULL;
>  	}
>  	for (i = 0; i < ARRAY_SIZE(vpu_cmd_requests); i++) {
> @@ -118,8 +117,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
>  		return;
>  	if (cmd->last_response_cmd)
>  		atomic_long_set(cmd->last_response_cmd, cmd->key);
> -	vfree(cmd->pkt);
> -	vfree(cmd);
> +	kfree(cmd->pkt);
> +	kfree(cmd);
>  }
>  
>  static int vpu_session_process_cmd(struct vpu_inst *inst, struct vpu_cmd_t
> *cmd)
> diff --git a/drivers/media/platform/amphion/vpu_core.c
> b/drivers/media/platform/amphion/vpu_core.c
> index 168f0514851e..85cc4a14f8ed 100644
> --- a/drivers/media/platform/amphion/vpu_core.c
> +++ b/drivers/media/platform/amphion/vpu_core.c
> @@ -17,7 +17,6 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/pm_domain.h>
>  #include <linux/firmware.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -265,7 +264,7 @@ static int vpu_core_register(struct device *dev, struct
> vpu_core *core)
>  	INIT_WORK(&core->msg_work, vpu_msg_run_work);
>  	INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
>  	buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
> -	core->msg_buffer = vzalloc(buffer_size);
> +	core->msg_buffer = kzalloc(buffer_size, GFP_KERNEL);
>  	if (!core->msg_buffer) {
>  		dev_err(core->dev, "failed allocate buffer for fifo\n");
>  		ret = -ENOMEM;
> @@ -282,10 +281,8 @@ static int vpu_core_register(struct device *dev, struct
> vpu_core *core)
>  
>  	return 0;
>  error:
> -	if (core->msg_buffer) {
> -		vfree(core->msg_buffer);
> -		core->msg_buffer = NULL;
> -	}
> +	kfree(core->msg_buffer);
> +	core->msg_buffer = NULL;
>  	if (core->workqueue) {
>  		destroy_workqueue(core->workqueue);
>  		core->workqueue = NULL;
> @@ -308,7 +305,7 @@ static int vpu_core_unregister(struct device *dev, struct
> vpu_core *core)
>  
>  	vpu_core_put_vpu(core);
>  	core->vpu = NULL;
> -	vfree(core->msg_buffer);
> +	kfree(core->msg_buffer);
>  	core->msg_buffer = NULL;
>  
>  	if (core->workqueue) {
> 
> base-commit: b70886ff5833cf499e77af77d2324ce8f68b60ce
Re: [PATCH] media: amphion: Use kmalloc instead of vmalloc
Posted by Nicolas Dufresne 1 month, 2 weeks ago
Hi,

Le lundi 22 décembre 2025 à 16:49 +0800, ming.qian@oss.nxp.com a écrit :
> From: Ming Qian <ming.qian@oss.nxp.com>
> 
> Replace vmalloc/vfree with kmalloc/kfree for allocating small
> driver structures (vpu_inst, vdec_t, venc_t, vpu_cmd_t, and
> frame objects).
> 
> vmalloc() is designed for large memory allocations and incurs
> unnecessary overhead for small objects due to virtual memory
> mapping. kmalloc() is more appropriate as it allocates physically
> contiguous memory with lower overhead.
> 
> ftrace measurements of vpu_alloc_cmd() show significant improvement:
> 
>   Before (vmalloc):  35-72 us   (avg ~45.7 us)
>   After (kmalloc):   11-26 us   (avg ~16.8 us)
> 
> This reduces allocation time by approximately 63%.
> 
> No functional changes are intended.
> 
> Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>

I don't see this patch on patchwork yet, I don't know why. Did you get a
notification or anything ? The patch looks good to me.

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
>  drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
>  drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
>  drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
>  4 files changed, 27 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c
> index c0d2aabb9e0e..7a1c58cac02d 100644
> --- a/drivers/media/platform/amphion/vdec.c
> +++ b/drivers/media/platform/amphion/vdec.c
> @@ -9,7 +9,6 @@
>  #include <linux/list.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> -#include <linux/vmalloc.h>
>  #include <linux/videodev2.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
> @@ -17,7 +16,6 @@
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -1642,9 +1640,9 @@ static void vdec_cleanup(struct vpu_inst *inst)
>  		vdec->slots = NULL;
>  		vdec->slot_count = 0;
>  	}
> -	vfree(vdec);
> +	kfree(vdec);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>  
>  static void vdec_init_params(struct vdec_t *vdec)
> @@ -1909,13 +1907,13 @@ static int vdec_open(struct file *file)
>  	struct vdec_t *vdec;
>  	int ret;
>  
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>  
> -	vdec = vzalloc(sizeof(*vdec));
> +	vdec = kzalloc(sizeof(*vdec), GFP_KERNEL);
>  	if (!vdec) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  
> @@ -1923,8 +1921,8 @@ static int vdec_open(struct file *file)
>  				    sizeof(*vdec->slots),
>  				    GFP_KERNEL | __GFP_ZERO);
>  	if (!vdec->slots) {
> -		vfree(vdec);
> -		vfree(inst);
> +		kfree(vdec);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  	vdec->slot_count = VDEC_SLOT_CNT_DFT;
> diff --git a/drivers/media/platform/amphion/venc.c b/drivers/media/platform/amphion/venc.c
> index aced76401b69..9e5cbc2b0d3f 100644
> --- a/drivers/media/platform/amphion/venc.c
> +++ b/drivers/media/platform/amphion/venc.c
> @@ -13,14 +13,12 @@
>  #include <linux/videodev2.h>
>  #include <linux/ktime.h>
>  #include <linux/rational.h>
> -#include <linux/vmalloc.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-event.h>
>  #include <media/v4l2-mem2mem.h>
>  #include <media/v4l2-ioctl.h>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> -#include <media/videobuf2-vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -844,7 +842,7 @@ static int venc_get_encoded_frames(struct vpu_inst *inst)
>  					       v4l2_m2m_dst_buf_remove(inst->fh.m2m_ctx)))
>  			break;
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>  
>  	return 0;
> @@ -860,7 +858,7 @@ static int venc_frame_encoded(struct vpu_inst *inst, void *arg)
>  	if (!info)
>  		return -EINVAL;
>  	venc = inst->priv;
> -	frame = vzalloc(sizeof(*frame));
> +	frame = kzalloc(sizeof(*frame), GFP_KERNEL);
>  	if (!frame)
>  		return -ENOMEM;
>  
> @@ -912,9 +910,9 @@ static void venc_cleanup(struct vpu_inst *inst)
>  		return;
>  
>  	venc = inst->priv;
> -	vfree(venc);
> +	kfree(venc);
>  	inst->priv = NULL;
> -	vfree(inst);
> +	kfree(inst);
>  }
>  
>  static int venc_start_session(struct vpu_inst *inst, u32 type)
> @@ -1067,7 +1065,7 @@ static void venc_cleanup_frames(struct venc_t *venc)
>  
>  	list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
>  		list_del_init(&frame->list);
> -		vfree(frame);
> +		kfree(frame);
>  	}
>  }
>  
> @@ -1151,7 +1149,7 @@ static int venc_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
>  		return ret;
>  
>  	list_del_init(&frame->list);
> -	vfree(frame);
> +	kfree(frame);
>  	return 0;
>  }
>  
> @@ -1309,13 +1307,13 @@ static int venc_open(struct file *file)
>  	struct venc_t *venc;
>  	int ret;
>  
> -	inst = vzalloc(sizeof(*inst));
> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>  	if (!inst)
>  		return -ENOMEM;
>  
> -	venc = vzalloc(sizeof(*venc));
> +	venc = kzalloc(sizeof(*venc), GFP_KERNEL);
>  	if (!venc) {
> -		vfree(inst);
> +		kfree(inst);
>  		return -ENOMEM;
>  	}
>  
> diff --git a/drivers/media/platform/amphion/vpu_cmds.c b/drivers/media/platform/amphion/vpu_cmds.c
> index 5695f5c1cb3e..ab69412e0aa7 100644
> --- a/drivers/media/platform/amphion/vpu_cmds.c
> +++ b/drivers/media/platform/amphion/vpu_cmds.c
> @@ -13,7 +13,6 @@
>  #include <linux/slab.h>
>  #include <linux/types.h>
>  #include <linux/delay.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_cmds.h"
> @@ -84,13 +83,13 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>  	int i;
>  	int ret;
>  
> -	cmd = vzalloc(sizeof(*cmd));
> +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
>  	if (!cmd)
>  		return NULL;
>  
> -	cmd->pkt = vzalloc(sizeof(*cmd->pkt));
> +	cmd->pkt = kzalloc(sizeof(*cmd->pkt), GFP_KERNEL);
>  	if (!cmd->pkt) {
> -		vfree(cmd);
> +		kfree(cmd);
>  		return NULL;
>  	}
>  
> @@ -98,8 +97,8 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>  	ret = vpu_iface_pack_cmd(inst->core, cmd->pkt, inst->id, id, data);
>  	if (ret) {
>  		dev_err(inst->dev, "iface pack cmd %s fail\n", vpu_id_name(id));
> -		vfree(cmd->pkt);
> -		vfree(cmd);
> +		kfree(cmd->pkt);
> +		kfree(cmd);
>  		return NULL;
>  	}
>  	for (i = 0; i < ARRAY_SIZE(vpu_cmd_requests); i++) {
> @@ -118,8 +117,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
>  		return;
>  	if (cmd->last_response_cmd)
>  		atomic_long_set(cmd->last_response_cmd, cmd->key);
> -	vfree(cmd->pkt);
> -	vfree(cmd);
> +	kfree(cmd->pkt);
> +	kfree(cmd);
>  }
>  
>  static int vpu_session_process_cmd(struct vpu_inst *inst, struct vpu_cmd_t *cmd)
> diff --git a/drivers/media/platform/amphion/vpu_core.c b/drivers/media/platform/amphion/vpu_core.c
> index 168f0514851e..85cc4a14f8ed 100644
> --- a/drivers/media/platform/amphion/vpu_core.c
> +++ b/drivers/media/platform/amphion/vpu_core.c
> @@ -17,7 +17,6 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/pm_domain.h>
>  #include <linux/firmware.h>
> -#include <linux/vmalloc.h>
>  #include "vpu.h"
>  #include "vpu_defs.h"
>  #include "vpu_core.h"
> @@ -265,7 +264,7 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>  	INIT_WORK(&core->msg_work, vpu_msg_run_work);
>  	INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
>  	buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
> -	core->msg_buffer = vzalloc(buffer_size);
> +	core->msg_buffer = kzalloc(buffer_size, GFP_KERNEL);
>  	if (!core->msg_buffer) {
>  		dev_err(core->dev, "failed allocate buffer for fifo\n");
>  		ret = -ENOMEM;
> @@ -282,10 +281,8 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>  
>  	return 0;
>  error:
> -	if (core->msg_buffer) {
> -		vfree(core->msg_buffer);
> -		core->msg_buffer = NULL;
> -	}
> +	kfree(core->msg_buffer);
> +	core->msg_buffer = NULL;
>  	if (core->workqueue) {
>  		destroy_workqueue(core->workqueue);
>  		core->workqueue = NULL;
> @@ -308,7 +305,7 @@ static int vpu_core_unregister(struct device *dev, struct vpu_core *core)
>  
>  	vpu_core_put_vpu(core);
>  	core->vpu = NULL;
> -	vfree(core->msg_buffer);
> +	kfree(core->msg_buffer);
>  	core->msg_buffer = NULL;
>  
>  	if (core->workqueue) {
> 
> base-commit: b70886ff5833cf499e77af77d2324ce8f68b60ce
Re: [PATCH] media: amphion: Use kmalloc instead of vmalloc
Posted by Ming Qian(OSS) 1 month, 2 weeks ago
Hi Nicolas,

On 12/23/2025 6:35 AM, Nicolas Dufresne wrote:
> Hi,
> 
> Le lundi 22 décembre 2025 à 16:49 +0800, ming.qian@oss.nxp.com a écrit :
>> From: Ming Qian <ming.qian@oss.nxp.com>
>>
>> Replace vmalloc/vfree with kmalloc/kfree for allocating small
>> driver structures (vpu_inst, vdec_t, venc_t, vpu_cmd_t, and
>> frame objects).
>>
>> vmalloc() is designed for large memory allocations and incurs
>> unnecessary overhead for small objects due to virtual memory
>> mapping. kmalloc() is more appropriate as it allocates physically
>> contiguous memory with lower overhead.
>>
>> ftrace measurements of vpu_alloc_cmd() show significant improvement:
>>
>>    Before (vmalloc):  35-72 us   (avg ~45.7 us)
>>    After (kmalloc):   11-26 us   (avg ~16.8 us)
>>
>> This reduces allocation time by approximately 63%.
>>
>> No functional changes are intended.
>>
>> Signed-off-by: Ming Qian <ming.qian@oss.nxp.com>
> 
> I don't see this patch on patchwork yet, I don't know why. Did you get a
> notification or anything ? The patch looks good to me.
> 
> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> 

I did not receive any system notification or reply.
It's currently in patchwork, and I'm not sure why there's been such a 
long delay.

Thanks for your review.

Regards,
Ming

>> ---
>>   drivers/media/platform/amphion/vdec.c     | 16 +++++++---------
>>   drivers/media/platform/amphion/venc.c     | 20 +++++++++-----------
>>   drivers/media/platform/amphion/vpu_cmds.c | 15 +++++++--------
>>   drivers/media/platform/amphion/vpu_core.c | 11 ++++-------
>>   4 files changed, 27 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c
>> index c0d2aabb9e0e..7a1c58cac02d 100644
>> --- a/drivers/media/platform/amphion/vdec.c
>> +++ b/drivers/media/platform/amphion/vdec.c
>> @@ -9,7 +9,6 @@
>>   #include <linux/list.h>
>>   #include <linux/kernel.h>
>>   #include <linux/module.h>
>> -#include <linux/vmalloc.h>
>>   #include <linux/videodev2.h>
>>   #include <media/v4l2-device.h>
>>   #include <media/v4l2-event.h>
>> @@ -17,7 +16,6 @@
>>   #include <media/v4l2-ioctl.h>
>>   #include <media/videobuf2-v4l2.h>
>>   #include <media/videobuf2-dma-contig.h>
>> -#include <media/videobuf2-vmalloc.h>
>>   #include "vpu.h"
>>   #include "vpu_defs.h"
>>   #include "vpu_core.h"
>> @@ -1642,9 +1640,9 @@ static void vdec_cleanup(struct vpu_inst *inst)
>>   		vdec->slots = NULL;
>>   		vdec->slot_count = 0;
>>   	}
>> -	vfree(vdec);
>> +	kfree(vdec);
>>   	inst->priv = NULL;
>> -	vfree(inst);
>> +	kfree(inst);
>>   }
>>   
>>   static void vdec_init_params(struct vdec_t *vdec)
>> @@ -1909,13 +1907,13 @@ static int vdec_open(struct file *file)
>>   	struct vdec_t *vdec;
>>   	int ret;
>>   
>> -	inst = vzalloc(sizeof(*inst));
>> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>>   	if (!inst)
>>   		return -ENOMEM;
>>   
>> -	vdec = vzalloc(sizeof(*vdec));
>> +	vdec = kzalloc(sizeof(*vdec), GFP_KERNEL);
>>   	if (!vdec) {
>> -		vfree(inst);
>> +		kfree(inst);
>>   		return -ENOMEM;
>>   	}
>>   
>> @@ -1923,8 +1921,8 @@ static int vdec_open(struct file *file)
>>   				    sizeof(*vdec->slots),
>>   				    GFP_KERNEL | __GFP_ZERO);
>>   	if (!vdec->slots) {
>> -		vfree(vdec);
>> -		vfree(inst);
>> +		kfree(vdec);
>> +		kfree(inst);
>>   		return -ENOMEM;
>>   	}
>>   	vdec->slot_count = VDEC_SLOT_CNT_DFT;
>> diff --git a/drivers/media/platform/amphion/venc.c b/drivers/media/platform/amphion/venc.c
>> index aced76401b69..9e5cbc2b0d3f 100644
>> --- a/drivers/media/platform/amphion/venc.c
>> +++ b/drivers/media/platform/amphion/venc.c
>> @@ -13,14 +13,12 @@
>>   #include <linux/videodev2.h>
>>   #include <linux/ktime.h>
>>   #include <linux/rational.h>
>> -#include <linux/vmalloc.h>
>>   #include <media/v4l2-device.h>
>>   #include <media/v4l2-event.h>
>>   #include <media/v4l2-mem2mem.h>
>>   #include <media/v4l2-ioctl.h>
>>   #include <media/videobuf2-v4l2.h>
>>   #include <media/videobuf2-dma-contig.h>
>> -#include <media/videobuf2-vmalloc.h>
>>   #include "vpu.h"
>>   #include "vpu_defs.h"
>>   #include "vpu_core.h"
>> @@ -844,7 +842,7 @@ static int venc_get_encoded_frames(struct vpu_inst *inst)
>>   					       v4l2_m2m_dst_buf_remove(inst->fh.m2m_ctx)))
>>   			break;
>>   		list_del_init(&frame->list);
>> -		vfree(frame);
>> +		kfree(frame);
>>   	}
>>   
>>   	return 0;
>> @@ -860,7 +858,7 @@ static int venc_frame_encoded(struct vpu_inst *inst, void *arg)
>>   	if (!info)
>>   		return -EINVAL;
>>   	venc = inst->priv;
>> -	frame = vzalloc(sizeof(*frame));
>> +	frame = kzalloc(sizeof(*frame), GFP_KERNEL);
>>   	if (!frame)
>>   		return -ENOMEM;
>>   
>> @@ -912,9 +910,9 @@ static void venc_cleanup(struct vpu_inst *inst)
>>   		return;
>>   
>>   	venc = inst->priv;
>> -	vfree(venc);
>> +	kfree(venc);
>>   	inst->priv = NULL;
>> -	vfree(inst);
>> +	kfree(inst);
>>   }
>>   
>>   static int venc_start_session(struct vpu_inst *inst, u32 type)
>> @@ -1067,7 +1065,7 @@ static void venc_cleanup_frames(struct venc_t *venc)
>>   
>>   	list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
>>   		list_del_init(&frame->list);
>> -		vfree(frame);
>> +		kfree(frame);
>>   	}
>>   }
>>   
>> @@ -1151,7 +1149,7 @@ static int venc_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
>>   		return ret;
>>   
>>   	list_del_init(&frame->list);
>> -	vfree(frame);
>> +	kfree(frame);
>>   	return 0;
>>   }
>>   
>> @@ -1309,13 +1307,13 @@ static int venc_open(struct file *file)
>>   	struct venc_t *venc;
>>   	int ret;
>>   
>> -	inst = vzalloc(sizeof(*inst));
>> +	inst = kzalloc(sizeof(*inst), GFP_KERNEL);
>>   	if (!inst)
>>   		return -ENOMEM;
>>   
>> -	venc = vzalloc(sizeof(*venc));
>> +	venc = kzalloc(sizeof(*venc), GFP_KERNEL);
>>   	if (!venc) {
>> -		vfree(inst);
>> +		kfree(inst);
>>   		return -ENOMEM;
>>   	}
>>   
>> diff --git a/drivers/media/platform/amphion/vpu_cmds.c b/drivers/media/platform/amphion/vpu_cmds.c
>> index 5695f5c1cb3e..ab69412e0aa7 100644
>> --- a/drivers/media/platform/amphion/vpu_cmds.c
>> +++ b/drivers/media/platform/amphion/vpu_cmds.c
>> @@ -13,7 +13,6 @@
>>   #include <linux/slab.h>
>>   #include <linux/types.h>
>>   #include <linux/delay.h>
>> -#include <linux/vmalloc.h>
>>   #include "vpu.h"
>>   #include "vpu_defs.h"
>>   #include "vpu_cmds.h"
>> @@ -84,13 +83,13 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>>   	int i;
>>   	int ret;
>>   
>> -	cmd = vzalloc(sizeof(*cmd));
>> +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
>>   	if (!cmd)
>>   		return NULL;
>>   
>> -	cmd->pkt = vzalloc(sizeof(*cmd->pkt));
>> +	cmd->pkt = kzalloc(sizeof(*cmd->pkt), GFP_KERNEL);
>>   	if (!cmd->pkt) {
>> -		vfree(cmd);
>> +		kfree(cmd);
>>   		return NULL;
>>   	}
>>   
>> @@ -98,8 +97,8 @@ static struct vpu_cmd_t *vpu_alloc_cmd(struct vpu_inst *inst, u32 id, void *data
>>   	ret = vpu_iface_pack_cmd(inst->core, cmd->pkt, inst->id, id, data);
>>   	if (ret) {
>>   		dev_err(inst->dev, "iface pack cmd %s fail\n", vpu_id_name(id));
>> -		vfree(cmd->pkt);
>> -		vfree(cmd);
>> +		kfree(cmd->pkt);
>> +		kfree(cmd);
>>   		return NULL;
>>   	}
>>   	for (i = 0; i < ARRAY_SIZE(vpu_cmd_requests); i++) {
>> @@ -118,8 +117,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd)
>>   		return;
>>   	if (cmd->last_response_cmd)
>>   		atomic_long_set(cmd->last_response_cmd, cmd->key);
>> -	vfree(cmd->pkt);
>> -	vfree(cmd);
>> +	kfree(cmd->pkt);
>> +	kfree(cmd);
>>   }
>>   
>>   static int vpu_session_process_cmd(struct vpu_inst *inst, struct vpu_cmd_t *cmd)
>> diff --git a/drivers/media/platform/amphion/vpu_core.c b/drivers/media/platform/amphion/vpu_core.c
>> index 168f0514851e..85cc4a14f8ed 100644
>> --- a/drivers/media/platform/amphion/vpu_core.c
>> +++ b/drivers/media/platform/amphion/vpu_core.c
>> @@ -17,7 +17,6 @@
>>   #include <linux/pm_runtime.h>
>>   #include <linux/pm_domain.h>
>>   #include <linux/firmware.h>
>> -#include <linux/vmalloc.h>
>>   #include "vpu.h"
>>   #include "vpu_defs.h"
>>   #include "vpu_core.h"
>> @@ -265,7 +264,7 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>>   	INIT_WORK(&core->msg_work, vpu_msg_run_work);
>>   	INIT_DELAYED_WORK(&core->msg_delayed_work, vpu_msg_delayed_work);
>>   	buffer_size = roundup_pow_of_two(VPU_MSG_BUFFER_SIZE);
>> -	core->msg_buffer = vzalloc(buffer_size);
>> +	core->msg_buffer = kzalloc(buffer_size, GFP_KERNEL);
>>   	if (!core->msg_buffer) {
>>   		dev_err(core->dev, "failed allocate buffer for fifo\n");
>>   		ret = -ENOMEM;
>> @@ -282,10 +281,8 @@ static int vpu_core_register(struct device *dev, struct vpu_core *core)
>>   
>>   	return 0;
>>   error:
>> -	if (core->msg_buffer) {
>> -		vfree(core->msg_buffer);
>> -		core->msg_buffer = NULL;
>> -	}
>> +	kfree(core->msg_buffer);
>> +	core->msg_buffer = NULL;
>>   	if (core->workqueue) {
>>   		destroy_workqueue(core->workqueue);
>>   		core->workqueue = NULL;
>> @@ -308,7 +305,7 @@ static int vpu_core_unregister(struct device *dev, struct vpu_core *core)
>>   
>>   	vpu_core_put_vpu(core);
>>   	core->vpu = NULL;
>> -	vfree(core->msg_buffer);
>> +	kfree(core->msg_buffer);
>>   	core->msg_buffer = NULL;
>>   
>>   	if (core->workqueue) {
>>
>> base-commit: b70886ff5833cf499e77af77d2324ce8f68b60ce