Explorar el Código

dsp-kernel: Handle dspsignal_wait based on timeout

Currently, dsp signal waits definite timeout even though
time out set to indefinite wait and returns timeout error.
Fix is added proper check for waiting indefinitely and
returned proper error code.

Change-Id: Ib4d8835cee6c686dae45f8b5ddf128d24c28cdad
Signed-off-by: Minghao Xue <[email protected]>
Minghao Xue hace 1 año
padre
commit
0abf6ac7b3
Se han modificado 1 ficheros con 5 adiciones y 3 borrados
  1. 5 3
      dsp/adsprpc.c

+ 5 - 3
dsp/adsprpc.c

@@ -7053,6 +7053,7 @@ int fastrpc_dspsignal_wait(struct fastrpc_file *fl,
 			   struct fastrpc_ioctl_dspsignal_wait *wait)
 {
 	int err = 0, cid = -1;
+	uint32_t timeout_usec = wait->timeout_usec;
 	unsigned long timeout = usecs_to_jiffies(wait->timeout_usec);
 	uint32_t signal_id = wait->signal_id;
 	struct fastrpc_dspsignal *s = NULL;
@@ -7102,14 +7103,15 @@ int fastrpc_dspsignal_wait(struct fastrpc_file *fl,
 	spin_unlock_irqrestore(&fl->dspsignals_lock, irq_flags);
 
 	trace_fastrpc_dspsignal("wait", signal_id, s->state, wait->timeout_usec);
-	if (timeout != 0xffffffff)
+	if (timeout_usec != 0xffffffff)
 		ret = wait_for_completion_interruptible_timeout(&s->comp, timeout);
 	else
 		ret = wait_for_completion_interruptible(&s->comp);
 	trace_fastrpc_dspsignal("wakeup", signal_id, s->state, wait->timeout_usec);
 
-	if (ret == 0) {
-		DSPSIGNAL_VERBOSE("Wait for signal %u timed out\n", signal_id);
+	if (timeout_usec != 0xffffffff && ret == 0) {
+		DSPSIGNAL_VERBOSE("Wait for signal %u timed out %ld us\n",
+				signal_id, timeout_usec);
 		err = -ETIMEDOUT;
 		goto bail;
 	} else if (ret < 0) {