162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify
462306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by
562306a36Sopenharmony_ci * the Free Software Foundation; either version 2 of the License, or
662306a36Sopenharmony_ci * (at your option) any later version.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful,
962306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
1062306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1162306a36Sopenharmony_ci * GNU General Public License for more details.
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Authors: Waiman Long <longman@redhat.com>
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#ifndef __LOCKING_LOCK_EVENTS_H
1762306a36Sopenharmony_ci#define __LOCKING_LOCK_EVENTS_H
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cienum lock_events {
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "lock_events_list.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	lockevent_num,	/* Total number of lock event counts */
2462306a36Sopenharmony_ci	LOCKEVENT_reset_cnts = lockevent_num,
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#ifdef CONFIG_LOCK_EVENT_COUNTS
2862306a36Sopenharmony_ci/*
2962306a36Sopenharmony_ci * Per-cpu counters
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_ciDECLARE_PER_CPU(unsigned long, lockevents[lockevent_num]);
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/*
3462306a36Sopenharmony_ci * Increment the statistical counters. use raw_cpu_inc() because of lower
3562306a36Sopenharmony_ci * overhead and we don't care if we loose the occasional update.
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cistatic inline void __lockevent_inc(enum lock_events event, bool cond)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	if (cond)
4062306a36Sopenharmony_ci		raw_cpu_inc(lockevents[event]);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define lockevent_inc(ev)	  __lockevent_inc(LOCKEVENT_ ##ev, true)
4462306a36Sopenharmony_ci#define lockevent_cond_inc(ev, c) __lockevent_inc(LOCKEVENT_ ##ev, c)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void __lockevent_add(enum lock_events event, int inc)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	raw_cpu_add(lockevents[event], inc);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define lockevent_add(ev, c)	__lockevent_add(LOCKEVENT_ ##ev, c)
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#else  /* CONFIG_LOCK_EVENT_COUNTS */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define lockevent_inc(ev)
5662306a36Sopenharmony_ci#define lockevent_add(ev, c)
5762306a36Sopenharmony_ci#define lockevent_cond_inc(ev, c)
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#endif /* CONFIG_LOCK_EVENT_COUNTS */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cissize_t lockevent_read(struct file *file, char __user *user_buf,
6262306a36Sopenharmony_ci		       size_t count, loff_t *ppos);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#endif /* __LOCKING_LOCK_EVENTS_H */
65