/* 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_rlock)    /* # of opt-acquired read locks        */ 
 | 
LOCK_EVENT(rwsem_opt_wlock)    /* # of opt-acquired write locks    */ 
 | 
LOCK_EVENT(rwsem_opt_fail)    /* # of failed optspins            */ 
 | 
LOCK_EVENT(rwsem_opt_nospin)    /* # of disabled optspins        */ 
 | 
LOCK_EVENT(rwsem_opt_norspin)    /* # of disabled reader-only optspins    */ 
 | 
LOCK_EVENT(rwsem_opt_rlock2)    /* # of opt-acquired 2ndary read locks    */ 
 | 
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_rlock_handoff)    /* # of read lock handoffs        */ 
 | 
LOCK_EVENT(rwsem_wlock)        /* # of write locks acquired        */ 
 | 
LOCK_EVENT(rwsem_wlock_fail)    /* # of failed write lock acquisitions    */ 
 | 
LOCK_EVENT(rwsem_wlock_handoff)    /* # of write lock handoffs        */ 
 |