From 2d69b8b5633d4d3cbd788443c54b5656077efce9 Mon Sep 17 00:00:00 2001 From: Kristofer Jonsson Date: Thu, 30 Jun 2022 15:34:52 +0200 Subject: Fix bug in inference release Once the inference file descriptor has been created the inference release must be handled by the file descriptor release callback. Change-Id: Ic514983e85821ea3893e11c5c682610f67d1ae31 --- kernel/ethosu_inference.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/kernel/ethosu_inference.c b/kernel/ethosu_inference.c index 55cabc3..d2209fd 100644 --- a/kernel/ethosu_inference.c +++ b/kernel/ethosu_inference.c @@ -103,8 +103,13 @@ static int ethosu_inference_send(struct ethosu_inference *inf) inf->pmu_event_config, ETHOSU_PMU_EVENT_MAX, inf->pmu_cycle_counter_enable); - if (ret) + if (ret) { + dev_warn(inf->edev->dev, + "Failed to send inference request. inf=0x%pK, ret=%d", + inf, ret); + return ret; + } inf->status = ETHOSU_UAPI_STATUS_RUNNING; @@ -177,8 +182,8 @@ static void ethosu_inference_kref_destroy(struct kref *kref) container_of(kref, struct ethosu_inference, kref); dev_info(inf->edev->dev, - "Inference destroy. handle=0x%pK, status=%d\n", - inf, inf->status); + "Inference destroy. inf=0x%pK, status=%d, ifm_count=%u, ofm_count=%u", + inf, inf->status, inf->ifm_count, inf->ofm_count); ethosu_mailbox_deregister(&inf->edev->mailbox, &inf->msg); @@ -198,8 +203,8 @@ static int ethosu_inference_release(struct inode *inode, struct ethosu_inference *inf = file->private_data; dev_info(inf->edev->dev, - "Inference release. handle=0x%pK, status=%d\n", - inf, inf->status); + "Inference release. file=0x%pK, inf=0x%pK", + file, inf); ethosu_inference_put(inf); @@ -232,7 +237,7 @@ static long ethosu_inference_ioctl(struct file *file, if (ret) return ret; - dev_info(inf->edev->dev, "Ioctl: cmd=%u, arg=%lu\n", cmd, arg); + dev_info(inf->edev->dev, "Ioctl: cmd=%u, arg=%lu", cmd, arg); switch (cmd) { case ETHOSU_IOCTL_INFERENCE_STATUS: { @@ -294,6 +299,15 @@ int ethosu_inference_create(struct ethosu_device *edev, int fd; int ret = -ENOMEM; + if (uapi->ifm_count > ETHOSU_FD_MAX || + uapi->ofm_count > ETHOSU_FD_MAX) { + dev_warn(edev->dev, + "Too many IFM and/or OFM buffers for inference. ifm_count=%u, ofm_count=%u", + uapi->ifm_count, uapi->ofm_count); + + return -EFAULT; + } + inf = devm_kzalloc(edev->dev, sizeof(*inf), GFP_KERNEL); if (!inf) return -ENOMEM; @@ -356,6 +370,11 @@ int ethosu_inference_create(struct ethosu_device *edev, /* Increment network reference count */ ethosu_network_get(net); + /* Send inference request to Arm Ethos-U subsystem */ + ret = ethosu_inference_send(inf); + if (ret) + goto put_net; + /* Create file descriptor */ ret = fd = anon_inode_getfd("ethosu-inference", ðosu_inference_fops, inf, O_RDWR | O_CLOEXEC); @@ -366,11 +385,6 @@ int ethosu_inference_create(struct ethosu_device *edev, inf->file = fget(ret); fput(inf->file); - /* Send inference request to Arm Ethos-U subsystem */ - ret = ethosu_inference_send(inf); - if (ret) - goto put_net; - dev_info(edev->dev, "Inference create. Id=%d, handle=0x%p, fd=%d", inf->msg.id, inf, fd); -- cgit v1.2.1