From: Pawel Moll Date: Thu, 31 Jul 2014 15:16:37 +0000 (+0100) Subject: bus: arm-ccn: Fix error handling at event allocation X-Git-Tag: v3.17-rc1~76^2 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Flinux.git;a=commitdiff_plain;h=3e528cb7bae00ba0d73def6645d0f2fa906ee3e8 bus: arm-ccn: Fix error handling at event allocation 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 Signed-off-by: Pawel Moll Signed-off-by: Olof Johansson --- diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 4f86bbb2fac5..3266f8ff9311 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;