diff mbox

bus: arm-ccn: Fix error handling at event allocation

Message ID 1406819797-8372-1-git-send-email-pawel.moll@arm.com
State Accepted
Commit 3e528cb7bae00ba0d73def6645d0f2fa906ee3e8
Headers show

Commit Message

Pawel Moll July 31, 2014, 3:16 p.m. UTC
The bitfield allocation function returns error condition
as a negative value, but in two cases its result
was assigned to an unsigned member of the hw_perf_event
structure, thus the error would not be ever detected.

Fixed by using an intermediate, signed variable.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Pawel Moll <pawel.moll@arm.com>
---

Dan discovered the problem using his static checker. Thanks, Dan!

Arnd, would you pick up the patch as it is or do you want me
to send a pull request for a "ccn/fixes" branch?

 drivers/bus/arm-ccn.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

Olof Johansson Aug. 1, 2014, 3:47 a.m. UTC | #1
On Thu, Jul 31, 2014 at 04:16:37PM +0100, Pawel Moll wrote:
> The bitfield allocation function returns error condition
> as a negative value, but in two cases its result
> was assigned to an unsigned member of the hw_perf_event
> structure, thus the error would not be ever detected.
> 
> Fixed by using an intermediate, signed variable.
> 
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
> Signed-off-by: Pawel Moll <pawel.moll@arm.com>
> ---
> 
> Dan discovered the problem using his static checker. Thanks, Dan!
> 
> Arnd, would you pick up the patch as it is or do you want me
> to send a pull request for a "ccn/fixes" branch?

I've started to prefer applying patches for cases like these, single-patch
pull requests are actually more work than doing that.

So: applied on top of next/drivers, where the CCN driver was merged
as well.


Thanks!


-Olof
diff mbox

Patch

diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c
index 4f86bbb..3266f8f 100644
--- a/drivers/bus/arm-ccn.c
+++ b/drivers/bus/arm-ccn.c
@@ -591,7 +591,7 @@  static int arm_ccn_pmu_event_init(struct perf_event *event)
 	struct arm_ccn *ccn;
 	struct hw_perf_event *hw = &event->hw;
 	u32 node_xp, type, event_id;
-	int valid;
+	int valid, bit;
 	struct arm_ccn_component *source;
 	int i;
 
@@ -713,17 +713,18 @@  static int arm_ccn_pmu_event_init(struct perf_event *event)
 
 	/* Allocate an event source or a watchpoint */
 	if (type == CCN_TYPE_XP && event_id == CCN_EVENT_WATCHPOINT)
-		hw->config_base = arm_ccn_pmu_alloc_bit(source->xp.dt_cmp_mask,
+		bit = arm_ccn_pmu_alloc_bit(source->xp.dt_cmp_mask,
 				CCN_NUM_XP_WATCHPOINTS);
 	else
-		hw->config_base = arm_ccn_pmu_alloc_bit(source->pmu_events_mask,
+		bit = arm_ccn_pmu_alloc_bit(source->pmu_events_mask,
 				CCN_NUM_PMU_EVENTS);
-	if (hw->config_base < 0) {
+	if (bit < 0) {
 		dev_warn(ccn->dev, "No more event sources/watchpoints on node/XP %d!\n",
 				node_xp);
 		clear_bit(hw->idx, ccn->dt.pmu_counters_mask);
 		return -EAGAIN;
 	}
+	hw->config_base = bit;
 
 	ccn->dt.pmu_counters[hw->idx].event = event;