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
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 @@
 				       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 @@
 		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 @@
 	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 @@
 	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 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 @@
 	/* 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", &ethosu_inference_fops,
 				    inf, O_RDWR | O_CLOEXEC);
@@ -366,11 +385,6 @@
 	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);