aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/lockdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/lockdep.c')
-rw-r--r--kernel/lockdep.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 70ca4db28aff..a8dc99d9fef7 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -149,6 +149,50 @@ static void lock_time_inc(struct lock_time *lt, s64 time)
149 lt->nr++; 149 lt->nr++;
150} 150}
151 151
152static inline void lock_time_add(struct lock_time *src, struct lock_time *dst)
153{
154 dst->min += src->min;
155 dst->max += src->max;
156 dst->total += src->total;
157 dst->nr += src->nr;
158}
159
160struct lock_class_stats lock_stats(struct lock_class *class)
161{
162 struct lock_class_stats stats;
163 int cpu, i;
164
165 memset(&stats, 0, sizeof(struct lock_class_stats));
166 for_each_possible_cpu(cpu) {
167 struct lock_class_stats *pcs =
168 &per_cpu(lock_stats, cpu)[class - lock_classes];
169
170 for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++)
171 stats.contention_point[i] += pcs->contention_point[i];
172
173 lock_time_add(&pcs->read_waittime, &stats.read_waittime);
174 lock_time_add(&pcs->write_waittime, &stats.write_waittime);
175
176 lock_time_add(&pcs->read_holdtime, &stats.read_holdtime);
177 lock_time_add(&pcs->write_holdtime, &stats.write_holdtime);
178 }
179
180 return stats;
181}
182
183void clear_lock_stats(struct lock_class *class)
184{
185 int cpu;
186
187 for_each_possible_cpu(cpu) {
188 struct lock_class_stats *cpu_stats =
189 &per_cpu(lock_stats, cpu)[class - lock_classes];
190
191 memset(cpu_stats, 0, sizeof(struct lock_class_stats));
192 }
193 memset(class->contention_point, 0, sizeof(class->contention_point));
194}
195
152static struct lock_class_stats *get_lock_stats(struct lock_class *class) 196static struct lock_class_stats *get_lock_stats(struct lock_class *class)
153{ 197{
154 return &get_cpu_var(lock_stats)[class - lock_classes]; 198 return &get_cpu_var(lock_stats)[class - lock_classes];