diff mbox series

[v2,02/13] xen/spinlock: reduce lock profile ifdefs

Message ID 20231013094224.7060-3-jgross@suse.com (mailing list archive)
State Superseded
Headers show
Series xen/spinlock: make recursive spinlocks a dedicated type | expand

Commit Message

Jürgen Groß Oct. 13, 2023, 9:42 a.m. UTC
With some small adjustments to the LOCK_PROFILE_* macros some #ifdefs
can be dropped from spinlock.c.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
V2:
- new patch
---
 xen/common/spinlock.c | 45 ++++++++++++++++++-------------------------
 1 file changed, 19 insertions(+), 26 deletions(-)

Comments

Jan Beulich Oct. 18, 2023, 3:57 p.m. UTC | #1
On 13.10.2023 11:42, Juergen Gross wrote:
> With some small adjustments to the LOCK_PROFILE_* macros some #ifdefs
> can be dropped from spinlock.c.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
> V2:
> - new patch
> ---
>  xen/common/spinlock.c | 45 ++++++++++++++++++-------------------------
>  1 file changed, 19 insertions(+), 26 deletions(-)
> 
> diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
> index 202c707540..4878a01302 100644
> --- a/xen/common/spinlock.c
> +++ b/xen/common/spinlock.c
> @@ -267,25 +267,28 @@ void spin_debug_disable(void)
>          lock->profile->time_hold += NOW() - lock->profile->time_locked;      \
>          lock->profile->lock_cnt++;                                           \
>      }
> -#define LOCK_PROFILE_VAR    s_time_t block = 0
> -#define LOCK_PROFILE_BLOCK  block = block ? : NOW();
> -#define LOCK_PROFILE_GOT                                                     \
> +#define LOCK_PROFILE_VAR(val)    s_time_t block = (val)

This macro, and then at least for consistency also ...

> +#define LOCK_PROFILE_BLOCK  block = block ? : NOW()

... this one should imo take the variable name as an argument. Otherwise
situations like ...

>  void _spin_barrier(spinlock_t *lock)
>  {
>      spinlock_tickets_t sample;
> -#ifdef CONFIG_DEBUG_LOCK_PROFILE
> -    s_time_t block = NOW();
> -#endif
> +    LOCK_PROFILE_VAR(NOW());
>  
>      check_barrier(&lock->debug);
>      smp_mb();
> @@ -432,13 +431,7 @@ void _spin_barrier(spinlock_t *lock)
>      {
>          while ( observe_head(&lock->tickets) == sample.head )
>              arch_lock_relax();
> -#ifdef CONFIG_DEBUG_LOCK_PROFILE
> -        if ( lock->profile )
> -        {
> -            lock->profile->time_block += NOW() - block;
> -            lock->profile->block_cnt++;
> -        }
> -#endif
> +        LOCK_PROFILE_BLKACC(lock->profile, block);
>      }
>      smp_mb();
>  }

... this arise where there's no visible declaration of "block", but a
use. (Originally I was meaning to ask how this function would build,
when the declaration is dropped.)

Jan
Jürgen Groß Oct. 19, 2023, 9:05 a.m. UTC | #2
On 18.10.23 17:57, Jan Beulich wrote:
> On 13.10.2023 11:42, Juergen Gross wrote:
>> With some small adjustments to the LOCK_PROFILE_* macros some #ifdefs
>> can be dropped from spinlock.c.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
>> ---
>> V2:
>> - new patch
>> ---
>>   xen/common/spinlock.c | 45 ++++++++++++++++++-------------------------
>>   1 file changed, 19 insertions(+), 26 deletions(-)
>>
>> diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
>> index 202c707540..4878a01302 100644
>> --- a/xen/common/spinlock.c
>> +++ b/xen/common/spinlock.c
>> @@ -267,25 +267,28 @@ void spin_debug_disable(void)
>>           lock->profile->time_hold += NOW() - lock->profile->time_locked;      \
>>           lock->profile->lock_cnt++;                                           \
>>       }
>> -#define LOCK_PROFILE_VAR    s_time_t block = 0
>> -#define LOCK_PROFILE_BLOCK  block = block ? : NOW();
>> -#define LOCK_PROFILE_GOT                                                     \
>> +#define LOCK_PROFILE_VAR(val)    s_time_t block = (val)
> 
> This macro, and then at least for consistency also ...
> 
>> +#define LOCK_PROFILE_BLOCK  block = block ? : NOW()
> 
> ... this one should imo take the variable name as an argument. Otherwise
> situations like ...
> 
>>   void _spin_barrier(spinlock_t *lock)
>>   {
>>       spinlock_tickets_t sample;
>> -#ifdef CONFIG_DEBUG_LOCK_PROFILE
>> -    s_time_t block = NOW();
>> -#endif
>> +    LOCK_PROFILE_VAR(NOW());
>>   
>>       check_barrier(&lock->debug);
>>       smp_mb();
>> @@ -432,13 +431,7 @@ void _spin_barrier(spinlock_t *lock)
>>       {
>>           while ( observe_head(&lock->tickets) == sample.head )
>>               arch_lock_relax();
>> -#ifdef CONFIG_DEBUG_LOCK_PROFILE
>> -        if ( lock->profile )
>> -        {
>> -            lock->profile->time_block += NOW() - block;
>> -            lock->profile->block_cnt++;
>> -        }
>> -#endif
>> +        LOCK_PROFILE_BLKACC(lock->profile, block);
>>       }
>>       smp_mb();
>>   }
> 
> ... this arise where there's no visible declaration of "block", but a
> use. (Originally I was meaning to ask how this function would build,
> when the declaration is dropped.)

Okay.


Juergen
diff mbox series

Patch

diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index 202c707540..4878a01302 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -267,25 +267,28 @@  void spin_debug_disable(void)
         lock->profile->time_hold += NOW() - lock->profile->time_locked;      \
         lock->profile->lock_cnt++;                                           \
     }
-#define LOCK_PROFILE_VAR    s_time_t block = 0
-#define LOCK_PROFILE_BLOCK  block = block ? : NOW();
-#define LOCK_PROFILE_GOT                                                     \
+#define LOCK_PROFILE_VAR(val)    s_time_t block = (val)
+#define LOCK_PROFILE_BLOCK  block = block ? : NOW()
+#define LOCK_PROFILE_BLKACC(tst, val)                                        \
+    if ( tst )                                                               \
+    {                                                                        \
+        lock->profile->time_block += lock->profile->time_locked - (val);     \
+        lock->profile->block_cnt++;                                          \
+    }
+#define LOCK_PROFILE_GOT(val)                                                \
     if ( lock->profile )                                                     \
     {                                                                        \
         lock->profile->time_locked = NOW();                                  \
-        if ( block )                                                         \
-        {                                                                    \
-            lock->profile->time_block += lock->profile->time_locked - block; \
-            lock->profile->block_cnt++;                                      \
-        }                                                                    \
+        LOCK_PROFILE_BLKACC(val, val);                                       \
     }
 
 #else
 
 #define LOCK_PROFILE_REL
-#define LOCK_PROFILE_VAR
+#define LOCK_PROFILE_VAR(val)
 #define LOCK_PROFILE_BLOCK
-#define LOCK_PROFILE_GOT
+#define LOCK_PROFILE_BLKACC(tst, val)
+#define LOCK_PROFILE_GOT(val)
 
 #endif
 
@@ -308,7 +311,7 @@  static void always_inline spin_lock_common(spinlock_t *lock,
                                            void (*cb)(void *), void *data)
 {
     spinlock_tickets_t tickets = SPINLOCK_TICKET_INC;
-    LOCK_PROFILE_VAR;
+    LOCK_PROFILE_VAR(0);
 
     check_lock(&lock->debug, false);
     preempt_disable();
@@ -323,7 +326,7 @@  static void always_inline spin_lock_common(spinlock_t *lock,
     }
     arch_lock_acquire_barrier();
     got_lock(&lock->debug);
-    LOCK_PROFILE_GOT;
+    LOCK_PROFILE_GOT(block);
 }
 
 void _spin_lock(spinlock_t *lock)
@@ -411,19 +414,15 @@  int _spin_trylock(spinlock_t *lock)
      * arch_lock_acquire_barrier().
      */
     got_lock(&lock->debug);
-#ifdef CONFIG_DEBUG_LOCK_PROFILE
-    if ( lock->profile )
-        lock->profile->time_locked = NOW();
-#endif
+    LOCK_PROFILE_GOT(0);
+
     return 1;
 }
 
 void _spin_barrier(spinlock_t *lock)
 {
     spinlock_tickets_t sample;
-#ifdef CONFIG_DEBUG_LOCK_PROFILE
-    s_time_t block = NOW();
-#endif
+    LOCK_PROFILE_VAR(NOW());
 
     check_barrier(&lock->debug);
     smp_mb();
@@ -432,13 +431,7 @@  void _spin_barrier(spinlock_t *lock)
     {
         while ( observe_head(&lock->tickets) == sample.head )
             arch_lock_relax();
-#ifdef CONFIG_DEBUG_LOCK_PROFILE
-        if ( lock->profile )
-        {
-            lock->profile->time_block += NOW() - block;
-            lock->profile->block_cnt++;
-        }
-#endif
+        LOCK_PROFILE_BLKACC(lock->profile, block);
     }
     smp_mb();
 }