staging: fsl-mc/dpio: Fix incorrect comparison
authorIoana Radulescu <ruxandra.radulescu@nxp.com>
Thu, 28 Sep 2017 14:10:33 +0000 (09:10 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 Dec 2017 12:40:42 +0000 (13:40 +0100)
[ Upstream commit 8dabf52ffb6445fa5bcc8b6d2ecb615f60d0dd12 ]

For some dpio functions, a cpu id parameter value of -1 is
valid and means "any". But when trying to validate this param
value against an upper limit, in this case num_possible_cpus(),
we risk obtaining the wrong result due to an implicit cast.

Avoid an incorrect check result by explicitly comparing the
cpu id with the "any" value before verifying the upper bound.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/fsl-mc/bus/dpio/dpio-service.c
drivers/staging/fsl-mc/include/dpaa2-io.h

index f8096828f5b7110076d996282d07958f98961724..a609ec82daf34e7170c45e9636175d5781ddf70d 100644 (file)
@@ -76,7 +76,7 @@ static inline struct dpaa2_io *service_select_by_cpu(struct dpaa2_io *d,
        if (d)
                return d;
 
-       if (unlikely(cpu >= num_possible_cpus()))
+       if (cpu != DPAA2_IO_ANY_CPU && cpu >= num_possible_cpus())
                return NULL;
 
        /*
@@ -121,7 +121,7 @@ struct dpaa2_io *dpaa2_io_create(const struct dpaa2_io_desc *desc)
                return NULL;
 
        /* check if CPU is out of range (-1 means any cpu) */
-       if (desc->cpu >= num_possible_cpus()) {
+       if (desc->cpu != DPAA2_IO_ANY_CPU && desc->cpu >= num_possible_cpus()) {
                kfree(obj);
                return NULL;
        }
index c5646096c5d4c9d4d258029d128080c38a6088e4..afc2d060d077cffd29d9f503323770befb211d66 100644 (file)
@@ -54,6 +54,8 @@ struct device;
  * for dequeue.
  */
 
+#define DPAA2_IO_ANY_CPU       -1
+
 /**
  * struct dpaa2_io_desc - The DPIO descriptor
  * @receives_notifications: Use notificaton mode. Non-zero if the DPIO
@@ -91,8 +93,8 @@ irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj);
  * @cb:           The callback to be invoked when the notification arrives
  * @is_cdan:      Zero for FQDAN, non-zero for CDAN
  * @id:           FQID or channel ID, needed for rearm
- * @desired_cpu:  The cpu on which the notifications will show up. -1 means
- *                any CPU.
+ * @desired_cpu:  The cpu on which the notifications will show up. Use
+ *                DPAA2_IO_ANY_CPU if don't care
  * @dpio_id:      The dpio index
  * @qman64:       The 64-bit context value shows up in the FQDAN/CDAN.
  * @node:         The list node