diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/events/hw_breakpoint.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 9a7b487c6fe2..fe8a916507ed 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
| @@ -111,14 +111,16 @@ static unsigned int max_task_bp_pinned(int cpu, enum bp_type_idx type) | |||
| 111 | * Count the number of breakpoints of the same type and same task. | 111 | * Count the number of breakpoints of the same type and same task. |
| 112 | * The given event must be not on the list. | 112 | * The given event must be not on the list. |
| 113 | */ | 113 | */ |
| 114 | static int task_bp_pinned(struct perf_event *bp, enum bp_type_idx type) | 114 | static int task_bp_pinned(int cpu, struct perf_event *bp, enum bp_type_idx type) |
| 115 | { | 115 | { |
| 116 | struct task_struct *tsk = bp->hw.bp_target; | 116 | struct task_struct *tsk = bp->hw.bp_target; |
| 117 | struct perf_event *iter; | 117 | struct perf_event *iter; |
| 118 | int count = 0; | 118 | int count = 0; |
| 119 | 119 | ||
| 120 | list_for_each_entry(iter, &bp_task_head, hw.bp_list) { | 120 | list_for_each_entry(iter, &bp_task_head, hw.bp_list) { |
| 121 | if (iter->hw.bp_target == tsk && find_slot_idx(iter) == type) | 121 | if (iter->hw.bp_target == tsk && |
| 122 | find_slot_idx(iter) == type && | ||
| 123 | cpu == iter->cpu) | ||
| 122 | count += hw_breakpoint_weight(iter); | 124 | count += hw_breakpoint_weight(iter); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| @@ -141,7 +143,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp, | |||
| 141 | if (!tsk) | 143 | if (!tsk) |
| 142 | slots->pinned += max_task_bp_pinned(cpu, type); | 144 | slots->pinned += max_task_bp_pinned(cpu, type); |
| 143 | else | 145 | else |
| 144 | slots->pinned += task_bp_pinned(bp, type); | 146 | slots->pinned += task_bp_pinned(cpu, bp, type); |
| 145 | slots->flexible = per_cpu(nr_bp_flexible[type], cpu); | 147 | slots->flexible = per_cpu(nr_bp_flexible[type], cpu); |
| 146 | 148 | ||
| 147 | return; | 149 | return; |
| @@ -154,7 +156,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp, | |||
| 154 | if (!tsk) | 156 | if (!tsk) |
| 155 | nr += max_task_bp_pinned(cpu, type); | 157 | nr += max_task_bp_pinned(cpu, type); |
| 156 | else | 158 | else |
| 157 | nr += task_bp_pinned(bp, type); | 159 | nr += task_bp_pinned(cpu, bp, type); |
| 158 | 160 | ||
| 159 | if (nr > slots->pinned) | 161 | if (nr > slots->pinned) |
| 160 | slots->pinned = nr; | 162 | slots->pinned = nr; |
| @@ -188,7 +190,7 @@ static void toggle_bp_task_slot(struct perf_event *bp, int cpu, bool enable, | |||
| 188 | int old_idx = 0; | 190 | int old_idx = 0; |
| 189 | int idx = 0; | 191 | int idx = 0; |
| 190 | 192 | ||
| 191 | old_count = task_bp_pinned(bp, type); | 193 | old_count = task_bp_pinned(cpu, bp, type); |
| 192 | old_idx = old_count - 1; | 194 | old_idx = old_count - 1; |
| 193 | idx = old_idx + weight; | 195 | idx = old_idx + weight; |
| 194 | 196 | ||
