|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License as published by | 
|  | * the Free Software Foundation; either version 2 of the License, or | 
|  | * (at your option) any later version. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * Authors: Waiman Long <longman@redhat.com> | 
|  | */ | 
|  |  | 
|  | #ifndef LOCK_EVENT | 
|  | #define LOCK_EVENT(name)	LOCKEVENT_ ## name, | 
|  | #endif | 
|  |  | 
|  | #ifdef CONFIG_QUEUED_SPINLOCKS | 
|  | #ifdef CONFIG_PARAVIRT_SPINLOCKS | 
|  | /* | 
|  | * Locking events for PV qspinlock. | 
|  | */ | 
|  | LOCK_EVENT(pv_hash_hops)	/* Average # of hops per hashing operation */ | 
|  | LOCK_EVENT(pv_kick_unlock)	/* # of vCPU kicks issued at unlock time   */ | 
|  | LOCK_EVENT(pv_kick_wake)	/* # of vCPU kicks for pv_latency_wake	   */ | 
|  | LOCK_EVENT(pv_latency_kick)	/* Average latency (ns) of vCPU kick	   */ | 
|  | LOCK_EVENT(pv_latency_wake)	/* Average latency (ns) of kick-to-wakeup  */ | 
|  | LOCK_EVENT(pv_lock_stealing)	/* # of lock stealing operations	   */ | 
|  | LOCK_EVENT(pv_spurious_wakeup)	/* # of spurious wakeups in non-head vCPUs */ | 
|  | LOCK_EVENT(pv_wait_again)	/* # of wait's after queue head vCPU kick  */ | 
|  | LOCK_EVENT(pv_wait_early)	/* # of early vCPU wait's		   */ | 
|  | LOCK_EVENT(pv_wait_head)	/* # of vCPU wait's at the queue head	   */ | 
|  | LOCK_EVENT(pv_wait_node)	/* # of vCPU wait's at non-head queue node */ | 
|  | #endif /* CONFIG_PARAVIRT_SPINLOCKS */ | 
|  |  | 
|  | /* | 
|  | * Locking events for qspinlock | 
|  | * | 
|  | * Subtracting lock_use_node[234] from lock_slowpath will give you | 
|  | * lock_use_node1. | 
|  | */ | 
|  | LOCK_EVENT(lock_pending)	/* # of locking ops via pending code	     */ | 
|  | LOCK_EVENT(lock_slowpath)	/* # of locking ops via MCS lock queue	     */ | 
|  | LOCK_EVENT(lock_use_node2)	/* # of locking ops that use 2nd percpu node */ | 
|  | LOCK_EVENT(lock_use_node3)	/* # of locking ops that use 3rd percpu node */ | 
|  | LOCK_EVENT(lock_use_node4)	/* # of locking ops that use 4th percpu node */ | 
|  | LOCK_EVENT(lock_no_node)	/* # of locking ops w/o using percpu node    */ | 
|  | #endif /* CONFIG_QUEUED_SPINLOCKS */ | 
|  |  | 
|  | /* | 
|  | * Locking events for rwsem | 
|  | */ | 
|  | LOCK_EVENT(rwsem_sleep_reader)	/* # of reader sleeps			*/ | 
|  | LOCK_EVENT(rwsem_sleep_writer)	/* # of writer sleeps			*/ | 
|  | LOCK_EVENT(rwsem_wake_reader)	/* # of reader wakeups			*/ | 
|  | LOCK_EVENT(rwsem_wake_writer)	/* # of writer wakeups			*/ | 
|  | LOCK_EVENT(rwsem_opt_wlock)	/* # of write locks opt-spin acquired	*/ | 
|  | LOCK_EVENT(rwsem_opt_fail)	/* # of failed opt-spinnings		*/ | 
|  | LOCK_EVENT(rwsem_rlock)		/* # of read locks acquired		*/ | 
|  | LOCK_EVENT(rwsem_rlock_fast)	/* # of fast read locks acquired	*/ | 
|  | LOCK_EVENT(rwsem_rlock_fail)	/* # of failed read lock acquisitions	*/ | 
|  | LOCK_EVENT(rwsem_rtrylock)	/* # of read trylock calls		*/ | 
|  | LOCK_EVENT(rwsem_wlock)		/* # of write locks acquired		*/ | 
|  | LOCK_EVENT(rwsem_wlock_fail)	/* # of failed write lock acquisitions	*/ | 
|  | LOCK_EVENT(rwsem_wtrylock)	/* # of write trylock calls		*/ |