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 <dan.carpenter@oracle.com> Signed-off-by: Pawel Moll <pawel.moll@arm.com> Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
parent
f64a3c895b
commit
3e528cb7ba
1 changed files with 5 additions and 4 deletions
|
@ -591,7 +591,7 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
|
||||||
struct arm_ccn *ccn;
|
struct arm_ccn *ccn;
|
||||||
struct hw_perf_event *hw = &event->hw;
|
struct hw_perf_event *hw = &event->hw;
|
||||||
u32 node_xp, type, event_id;
|
u32 node_xp, type, event_id;
|
||||||
int valid;
|
int valid, bit;
|
||||||
struct arm_ccn_component *source;
|
struct arm_ccn_component *source;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -713,17 +713,18 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
|
||||||
|
|
||||||
/* Allocate an event source or a watchpoint */
|
/* Allocate an event source or a watchpoint */
|
||||||
if (type == CCN_TYPE_XP && event_id == CCN_EVENT_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);
|
CCN_NUM_XP_WATCHPOINTS);
|
||||||
else
|
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);
|
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",
|
dev_warn(ccn->dev, "No more event sources/watchpoints on node/XP %d!\n",
|
||||||
node_xp);
|
node_xp);
|
||||||
clear_bit(hw->idx, ccn->dt.pmu_counters_mask);
|
clear_bit(hw->idx, ccn->dt.pmu_counters_mask);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
hw->config_base = bit;
|
||||||
|
|
||||||
ccn->dt.pmu_counters[hw->idx].event = event;
|
ccn->dt.pmu_counters[hw->idx].event = event;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue