Discussion:
[PATCH] usb: dwc2: gadget: sparse warning of context imbalance
Sudip Mukherjee
2014-10-10 13:09:39 UTC
Permalink
sparse was giving the following warning:
warning: context imbalance in 's3c_hsotg_ep_enable'
- different lock contexts for basic block

we were returning ENOMEM while still holding the spinlock.
The sparse warning was fixed by releasing the spinlock before return.

Signed-off-by: Sudip Mukherjee <sudip-ofJRbWXBVFamYgehrs7/***@public.gmane.org>
---
drivers/usb/dwc2/gadget.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 7b5856f..046e90d 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2561,8 +2561,10 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
hs_ep->fifo_size = val;
break;
}
- if (i == 8)
+ if (i == 8) {
+ spin_unlock_irqrestore(&hsotg->lock, flags);
return -ENOMEM;
+ }
}

/* for non control endpoints, set PID to D0 */
--
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-***@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Paul Zimmerman
2014-10-14 20:55:55 UTC
Permalink
Sent: Friday, October 10, 2014 6:10 AM
warning: context imbalance in 's3c_hsotg_ep_enable'
- different lock contexts for basic block
we were returning ENOMEM while still holding the spinlock.
The sparse warning was fixed by releasing the spinlock before return.
---
drivers/usb/dwc2/gadget.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 7b5856f..046e90d 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2561,8 +2561,10 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
hs_ep->fifo_size = val;
break;
}
- if (i == 8)
+ if (i == 8) {
+ spin_unlock_irqrestore(&hsotg->lock, flags);
return -ENOMEM;
+ }
}
/* for non control endpoints, set PID to D0 */
For a long function like this, I'd rather keep a single return point at
the end. Something like this:

}
- if (i == 8)
- return -ENOMEM;
+ if (i == 8) {
+ ret = -ENOMEM;
+ goto out;
+ }
}
...

+out:
spin_unlock_irqrestore(&hsotg->lock, flags);
return ret;
}

Care to respin the patch like that?
--
Paul
Sudip Mukherjee
2014-10-15 09:17:57 UTC
Permalink
Post by Paul Zimmerman
Sent: Friday, October 10, 2014 6:10 AM
warning: context imbalance in 's3c_hsotg_ep_enable'
- different lock contexts for basic block
we were returning ENOMEM while still holding the spinlock.
The sparse warning was fixed by releasing the spinlock before return.
---
drivers/usb/dwc2/gadget.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 7b5856f..046e90d 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2561,8 +2561,10 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
hs_ep->fifo_size = val;
break;
}
- if (i == 8)
+ if (i == 8) {
+ spin_unlock_irqrestore(&hsotg->lock, flags);
return -ENOMEM;
+ }
}
/* for non control endpoints, set PID to D0 */
For a long function like this, I'd rather keep a single return point at
}
- if (i == 8)
- return -ENOMEM;
+ if (i == 8) {
+ ret = -ENOMEM;
+ goto out;
+ }
}
...
spin_unlock_irqrestore(&hsotg->lock, flags);
return ret;
}
Care to respin the patch like that?
sure , modified patch will be in your inbox in a short time.

thanks
sudip
Post by Paul Zimmerman
--
Paul
Felipe Balbi
2014-10-17 19:16:35 UTC
Permalink
From: Sudip Mukherjee <***@gmail.com>

sparse was giving the following warning:
warning: context imbalance in 's3c_hsotg_ep_enable'
- different lock contexts for basic block

we were returning ENOMEM while still holding the spinlock.
The sparse warning was fixed by releasing the spinlock before return.

Cc: <***@vger.kernel.org> # v3.17
Acked-by: Paul Zimmerman <***@synopsys.com>
Signed-off-by: Sudip Mukherjee <***@vectorindia.org>
Signed-off-by: Felipe Balbi <***@ti.com>
---

Resending so it reaches ***@vger.kernel.org

Once v3.18-rc1 is tagged, I'll move this to my
'fixes' branch.

drivers/usb/dwc2/gadget.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 7b5856f..7f25527 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2561,8 +2561,10 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
hs_ep->fifo_size = val;
break;
}
- if (i == 8)
- return -ENOMEM;
+ if (i == 8) {
+ ret = -ENOMEM;
+ goto error;
+ }
}

/* for non control endpoints, set PID to D0 */
@@ -2579,6 +2581,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
/* enable the endpoint interrupt */
s3c_hsotg_ctrl_epint(hsotg, index, dir_in, 1);

+error:
spin_unlock_irqrestore(&hsotg->lock, flags);
return ret;
}
--
2.1.0.GIT
Loading...