From nobody Thu Mar 28 11:19:16 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1565330936; cv=none; d=zoho.com; s=zohoarc; b=FpCtlUVxgetkWwUj0dW13wGEUVxsPXdYrSpLAbKMFbHCTJawamZmyBcmjJu8p9qw6cDPPoh3oXdIy0As8iJuCOrluiAMiruNtoYqF9XY1QAJyR6qsH5txlaKbarR4iZBJVQqqlPEEyBvos6sMF6xSiKBxm8xac9yt/pkhzlFqU4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565330936; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=wiRjHPcNoSh0Yhe/t6GEWPzELf0hWv50sQV6BLHYsjU=; b=GC8qU+msnvkLcdsa6sqzFwADSOHuGbvGS0/V/ov4YoP7Grs2unGkRY+za19D7sa7zAW/ElF7t6r0wpplQE8NSwX/S5wD47RAwCRj58jD6ef/28uwNGrGwyoYrWEl5qoDVS6LqTKUCTHuXYrUr3FviK2Hq1IKEywHoCsUhhW2KTk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1565330936554531.2348972376842; Thu, 8 Aug 2019 23:08:56 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4D-0006eH-5k; Fri, 09 Aug 2019 06:07:57 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4C-0006dX-4B for xen-devel@lists.xenproject.org; Fri, 09 Aug 2019 06:07:56 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 045452fc-ba6c-11e9-bb68-83c39d6ce56b; Fri, 09 Aug 2019 06:07:50 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id CB197B077; Fri, 9 Aug 2019 06:07:48 +0000 (UTC) X-Inumbo-ID: 045452fc-ba6c-11e9-bb68-83c39d6ce56b X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 9 Aug 2019 08:07:40 +0200 Message-Id: <20190809060744.8985-2-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190809060744.8985-1-jgross@suse.com> References: <20190809060744.8985-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 1/5] xen/spinlocks: in debug builds store cpu holding the lock X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Add the cpu currently holding the lock to struct lock_debug. This makes analysis of locking errors easier and it can be tested whether the correct cpu is releasing a lock again. Signed-off-by: Juergen Gross --- V2: adjust types (Jan Beulich) --- xen/common/spinlock.c | 33 ++++++++++++++++++++++++++------- xen/include/xen/spinlock.h | 17 ++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 6bc52d70c0..1be1b5ebe6 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -13,9 +13,9 @@ =20 static atomic_t spin_debug __read_mostly =3D ATOMIC_INIT(0); =20 -static void check_lock(struct lock_debug *debug) +static void check_lock(union lock_debug *debug) { - int irq_safe =3D !local_irq_is_enabled(); + bool irq_safe =3D !local_irq_is_enabled(); =20 if ( unlikely(atomic_read(&spin_debug) <=3D 0) ) return; @@ -43,18 +43,21 @@ static void check_lock(struct lock_debug *debug) */ if ( unlikely(debug->irq_safe !=3D irq_safe) ) { - int seen =3D cmpxchg(&debug->irq_safe, -1, irq_safe); + union lock_debug seen, new =3D { 0 }; =20 - if ( seen =3D=3D !irq_safe ) + new.irq_safe =3D irq_safe; + seen.val =3D cmpxchg(&debug->val, LOCK_DEBUG_INITVAL, new.val); + + if ( !seen.unseen && seen.irq_safe =3D=3D !irq_safe ) { printk("CHECKLOCK FAILURE: prev irqsafe: %d, curr irqsafe %d\n= ", - seen, irq_safe); + seen.irq_safe, irq_safe); BUG(); } } } =20 -static void check_barrier(struct lock_debug *debug) +static void check_barrier(union lock_debug *debug) { if ( unlikely(atomic_read(&spin_debug) <=3D 0) ) return; @@ -70,7 +73,18 @@ static void check_barrier(struct lock_debug *debug) * However, if we spin on an IRQ-unsafe lock with IRQs disabled then t= hat * is clearly wrong, for the same reason outlined in check_lock() abov= e. */ - BUG_ON(!local_irq_is_enabled() && (debug->irq_safe =3D=3D 0)); + BUG_ON(!local_irq_is_enabled() && !debug->irq_safe); +} + +static void got_lock(union lock_debug *debug) +{ + debug->cpu =3D smp_processor_id(); +} + +static void rel_lock(union lock_debug *debug) +{ + ASSERT(debug->cpu =3D=3D smp_processor_id()); + debug->cpu =3D SPINLOCK_NO_CPU; } =20 void spin_debug_enable(void) @@ -87,6 +101,8 @@ void spin_debug_disable(void) =20 #define check_lock(l) ((void)0) #define check_barrier(l) ((void)0) +#define got_lock(l) ((void)0) +#define rel_lock(l) ((void)0) =20 #endif =20 @@ -150,6 +166,7 @@ void inline _spin_lock_cb(spinlock_t *lock, void (*cb)(= void *), void *data) cb(data); arch_lock_relax(); } + got_lock(&lock->debug); LOCK_PROFILE_GOT; preempt_disable(); arch_lock_acquire_barrier(); @@ -181,6 +198,7 @@ void _spin_unlock(spinlock_t *lock) arch_lock_release_barrier(); preempt_enable(); LOCK_PROFILE_REL; + rel_lock(&lock->debug); add_sized(&lock->tickets.head, 1); arch_lock_signal(); } @@ -224,6 +242,7 @@ int _spin_trylock(spinlock_t *lock) if ( cmpxchg(&lock->tickets.head_tail, old.head_tail, new.head_tail) !=3D old.head_tail ) return 0; + got_lock(&lock->debug); #ifdef CONFIG_LOCK_PROFILE if (lock->profile) lock->profile->time_locked =3D NOW(); diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index a811b73bf3..97b6200bf5 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -7,14 +7,21 @@ #include =20 #ifndef NDEBUG -struct lock_debug { - s16 irq_safe; /* +1: IRQ-safe; 0: not IRQ-safe; -1: don't know yet */ +union lock_debug { + uint16_t val; +#define LOCK_DEBUG_INITVAL 0xffff + struct { + uint16_t cpu:12; + uint16_t pad:2; + bool irq_safe:1; + bool unseen:1; + }; }; -#define _LOCK_DEBUG { -1 } +#define _LOCK_DEBUG { LOCK_DEBUG_INITVAL } void spin_debug_enable(void); void spin_debug_disable(void); #else -struct lock_debug { }; +union lock_debug { }; #define _LOCK_DEBUG { } #define spin_debug_enable() ((void)0) #define spin_debug_disable() ((void)0) @@ -143,7 +150,7 @@ typedef struct spinlock { #define SPINLOCK_NO_CPU 0xfffu u16 recurse_cnt:4; #define SPINLOCK_MAX_RECURSE 0xfu - struct lock_debug debug; + union lock_debug debug; #ifdef CONFIG_LOCK_PROFILE struct lock_profile *profile; #endif --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Thu Mar 28 11:19:16 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1565330953; cv=none; d=zoho.com; s=zohoarc; b=HPGv2tdIaYaEoswjZqh+Srf4wlMT/Umft/Ps9UIz9P68ELpVolxpCmRMRP+X/voIwI14UNFuqYwY/jhiQRf7q+279wO+jZF10HJ5loemU0z9PE7HzOygdHOVNeD3wCaqiKbWzPjvFw5qxX4IhLy1/ew1BKhtT3KhpB2glV+FsvE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565330953; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=5Mejc43ebArGGhg9Kb1skjj1tzJxfqbdpsCBAsXBRoM=; b=kZErOW8S4+S6c4oGYK+pMcJvmoI3RbpUFmuy463vtneLWBa8g58yuGtfyG1YueNmT09qtaA+P/HMyZ5g2u13DHRu6iSlGS7u42lO8K3DwtaoNzH2ze745XL634yUpO5Bs8x8LwX5F4p9CSKulVp8hIopWwscA4BA57SzTkaNozI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1565330953917783.9289571107361; Thu, 8 Aug 2019 23:09:13 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4C-0006dv-S1; Fri, 09 Aug 2019 06:07:56 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4C-0006dW-3r for xen-devel@lists.xenproject.org; Fri, 09 Aug 2019 06:07:56 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 0462a7b2-ba6c-11e9-8e86-576d79567877; Fri, 09 Aug 2019 06:07:50 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id CD806B07B; Fri, 9 Aug 2019 06:07:48 +0000 (UTC) X-Inumbo-ID: 0462a7b2-ba6c-11e9-8e86-576d79567877 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 9 Aug 2019 08:07:41 +0200 Message-Id: <20190809060744.8985-3-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190809060744.8985-1-jgross@suse.com> References: <20190809060744.8985-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 2/5] xen: add new CONFIG_DEBUG_LOCKS option X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Instead of enabling debugging for debug builds only add a dedicated Kconfig option for that purpose which defaults to DEBUG. Signed-off-by: Juergen Gross --- V2: - rename to CONFIG_DEBUG_LOCKS (Jan Beulich) --- xen/Kconfig.debug | 7 +++++++ xen/common/spinlock.c | 4 ++-- xen/include/xen/spinlock.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug index e10e314e25..1faaa3ba6a 100644 --- a/xen/Kconfig.debug +++ b/xen/Kconfig.debug @@ -51,6 +51,13 @@ config LOCK_PROFILE You can use serial console to print (and reset) using 'l' and 'L' respectively, or the 'xenlockprof' tool. =20 +config DEBUG_LOCKS + bool "Lock debugging" + default DEBUG + ---help--- + Enable debugging features of lock handling. Some additional + checks will be performed when acquiring and releasing locks. + config PERF_COUNTERS bool "Performance Counters" ---help--- diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 1be1b5ebe6..79e70a9947 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -9,7 +9,7 @@ #include #include =20 -#ifndef NDEBUG +#ifdef CONFIG_DEBUG_LOCKS =20 static atomic_t spin_debug __read_mostly =3D ATOMIC_INIT(0); =20 @@ -97,7 +97,7 @@ void spin_debug_disable(void) atomic_dec(&spin_debug); } =20 -#else /* defined(NDEBUG) */ +#else /* CONFIG_DEBUG_LOCKS */ =20 #define check_lock(l) ((void)0) #define check_barrier(l) ((void)0) diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index 97b6200bf5..dfa0b72f8d 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -6,7 +6,7 @@ #include #include =20 -#ifndef NDEBUG +#ifdef CONFIG_DEBUG_LOCKS union lock_debug { uint16_t val; #define LOCK_DEBUG_INITVAL 0xffff --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Thu Mar 28 11:19:16 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1565330937; cv=none; d=zoho.com; s=zohoarc; b=TSXwVjXbCqEPzW4NXDP+8EkJzC4Ko2s0ZUWJdrD2fVxe5rVDWQgul1vbp7gZ2NUnI32Aq9IUlGwZ7/dJT7TL/dYnzpEln/E9wvxak4HMdOf+cWpJWk44NujzKFzQp7utw9wvLx8+tTFE/ZtlShCEygE2N+2o8wopJU8YcNF2Rco= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565330937; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=FYw/Nf9AoRr4tmz9oFpOSrZwpoKqQDfXqKtfurGNQps=; b=oXC/DacMy9LLFoCmvyX1EsT4o862/99rlif1xXdbS9RwonVaJBvO4Q8GEGXYYHpe5nQpHyAQVDkxxe5BO1zGS/gr8R/9EqKDSfJ9zsYJzWqOUMCbY+R287tNWMRf67wNW0TSBtzuUP3fcP9Xb+kgFbJWYE7agOIEc+c2H+Ia/fM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1565330937406966.7952387348557; Thu, 8 Aug 2019 23:08:57 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4A-0006br-2a; Fri, 09 Aug 2019 06:07:54 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy48-0006bV-Po for xen-devel@lists.xenproject.org; Fri, 09 Aug 2019 06:07:52 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 047873df-ba6c-11e9-8980-bc764e045a96; Fri, 09 Aug 2019 06:07:51 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id CB115B05E; Fri, 9 Aug 2019 06:07:48 +0000 (UTC) X-Inumbo-ID: 047873df-ba6c-11e9-8980-bc764e045a96 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 9 Aug 2019 08:07:42 +0200 Message-Id: <20190809060744.8985-4-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190809060744.8985-1-jgross@suse.com> References: <20190809060744.8985-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 3/5] xen: print lock profile info in panic() X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , Volodymyr Babchuk , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Print the lock profile data when the system crashes and add some more information for each lock data (lock address, cpu holding the lock). While at it use the PRI_stime format specifier for printing time data. This is especially beneficial for watchdog triggered crashes in case of deadlocks. In order to have the cpu holding the lock available let the lock profile config option select DEBUG_LOCKS. As printing the lock profile data will make use of locking, too, we need to disable spinlock debugging before calling spinlock_profile_printall() from panic(). While at it remove a superfluous #ifdef CONFIG_LOCK_PROFILE and rename CONFIG_LOCK_PROFILE to CONFIG_DEBUG_LOCK_PROFILE. Also move the .lockprofile.data section to init area in linker scripts as the data is no longer needed after boot. Signed-off-by: Juergen Gross --- V2: - rename CONFIG_LOCK_PROFILE to CONFIG_DEBUG_LOCK_PROFILE (Jan Beulich) - move .lockprofile.data section to init area in linker scripts - use PRI_stime (Andrew Cooper) - don't print "cpu=3D4095", but "not locked" (Andrew Cooper) --- xen/Kconfig.debug | 3 ++- xen/arch/arm/xen.lds.S | 13 +++++++------ xen/arch/x86/domain.c | 2 +- xen/arch/x86/xen.lds.S | 13 +++++++------ xen/common/keyhandler.c | 2 +- xen/common/spinlock.c | 33 ++++++++++++++++++--------------- xen/common/sysctl.c | 2 +- xen/drivers/char/console.c | 4 +++- xen/include/xen/spinlock.h | 12 +++++++----- 9 files changed, 47 insertions(+), 37 deletions(-) diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug index 1faaa3ba6a..22573e74db 100644 --- a/xen/Kconfig.debug +++ b/xen/Kconfig.debug @@ -44,8 +44,9 @@ config COVERAGE =20 If unsure, say N here. =20 -config LOCK_PROFILE +config DEBUG_LOCK_PROFILE bool "Lock Profiling" + select DEBUG_LOCKS ---help--- Lock profiling allows you to see how often locks are taken and blocked. You can use serial console to print (and reset) using 'l' and 'L' diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index 12c107f45d..ba20e90e83 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -55,12 +55,6 @@ SECTIONS *(.data.rel.ro) *(.data.rel.ro.*) =20 -#ifdef CONFIG_LOCK_PROFILE - . =3D ALIGN(POINTER_ALIGN); - __lock_profile_start =3D .; - *(.lockprofile.data) - __lock_profile_end =3D .; -#endif . =3D ALIGN(POINTER_ALIGN); __param_start =3D .; *(.data.param) @@ -174,6 +168,13 @@ SECTIONS . =3D ALIGN(4); *(.altinstr_replacement) =20 +#ifdef CONFIG_DEBUG_LOCK_PROFILE + . =3D ALIGN(POINTER_ALIGN); + __lock_profile_start =3D .; + *(.lockprofile.data) + __lock_profile_end =3D .; +#endif + *(.init.data) *(.init.data.rel) *(.init.data.rel.*) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 5933b3f51b..369e29c12c 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -305,7 +305,7 @@ struct domain *alloc_domain_struct(void) #endif =20 =20 -#ifndef CONFIG_LOCK_PROFILE +#ifndef CONFIG_DEBUG_LOCK_PROFILE BUILD_BUG_ON(sizeof(*d) > PAGE_SIZE); #endif d =3D alloc_xenheap_pages(order, MEMF_bits(bits)); diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index a73139cd29..7b4fc74973 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -129,12 +129,6 @@ SECTIONS *(.ex_table.pre) __stop___pre_ex_table =3D .; =20 -#ifdef CONFIG_LOCK_PROFILE - . =3D ALIGN(POINTER_ALIGN); - __lock_profile_start =3D .; - *(.lockprofile.data) - __lock_profile_end =3D .; -#endif . =3D ALIGN(POINTER_ALIGN); __param_start =3D .; *(.data.param) @@ -252,6 +246,13 @@ SECTIONS *(.altinstructions) __alt_instructions_end =3D .; =20 +#ifdef CONFIG_DEBUG_LOCK_PROFILE + . =3D ALIGN(POINTER_ALIGN); + __lock_profile_start =3D .; + *(.lockprofile.data) + __lock_profile_end =3D .; +#endif + . =3D ALIGN(8); __ctors_start =3D .; *(.ctors) diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 57b360ee4b..c36baa4dff 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -62,7 +62,7 @@ static struct keyhandler { KEYHANDLER('P', perfc_reset, "reset performance counters", 0), #endif =20 -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE KEYHANDLER('l', spinlock_profile_printall, "print lock profile info", = 1), KEYHANDLER('L', spinlock_profile_reset, "reset lock profile info", 0), #endif diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 79e70a9947..c4f706c627 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -106,7 +106,7 @@ void spin_debug_disable(void) =20 #endif =20 -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE =20 #define LOCK_PROFILE_REL = \ if (lock->profile) = \ @@ -243,7 +243,7 @@ int _spin_trylock(spinlock_t *lock) old.head_tail, new.head_tail) !=3D old.head_tail ) return 0; got_lock(&lock->debug); -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE if (lock->profile) lock->profile->time_locked =3D NOW(); #endif @@ -258,7 +258,7 @@ int _spin_trylock(spinlock_t *lock) void _spin_barrier(spinlock_t *lock) { spinlock_tickets_t sample; -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE s_time_t block =3D NOW(); #endif =20 @@ -269,7 +269,7 @@ void _spin_barrier(spinlock_t *lock) { while ( observe_head(&lock->tickets) =3D=3D sample.head ) arch_lock_relax(); -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE if ( lock->profile ) { lock->profile->time_block +=3D NOW() - block; @@ -327,7 +327,7 @@ void _spin_unlock_recursive(spinlock_t *lock) } } =20 -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE =20 struct lock_profile_anc { struct lock_profile_qhead *head_q; /* first head of this type */ @@ -362,14 +362,19 @@ static void spinlock_profile_iterate(lock_profile_sub= func *sub, void *par) static void spinlock_profile_print_elem(struct lock_profile *data, int32_t type, int32_t idx, void *par) { - if ( type =3D=3D LOCKPROF_TYPE_GLOBAL ) - printk("%s %s:\n", lock_profile_ancs[type].name, data->name); + struct spinlock *lock =3D data->lock; + + printk("%s ", lock_profile_ancs[type].name); + if ( type !=3D LOCKPROF_TYPE_GLOBAL ) + printk("%d ", idx); + printk("%s: addr=3D%p, lockval=3D%08x, ", data->name, lock, + lock->tickets.head_tail); + if ( lock->debug.cpu =3D=3D SPINLOCK_NO_CPU ) + printk("not locked\n"); else - printk("%s %d %s:\n", lock_profile_ancs[type].name, idx, data->nam= e); - printk(" lock:%12"PRId64"(%08X:%08X), block:%12"PRId64"(%08X:%08X)\n", - data->lock_cnt, (u32)(data->time_hold >> 32), (u32)data->time_h= old, - data->block_cnt, (u32)(data->time_block >> 32), - (u32)data->time_block); + printk("cpu=3D%d\n", lock->debug.cpu); + printk(" lock:%" PRId64 "(%" PRI_stime "), block:%" PRId64 "(%" PRI_s= time ")\n", + data->lock_cnt, data->time_hold, data->block_cnt, data->time_bl= ock); } =20 void spinlock_profile_printall(unsigned char key) @@ -488,7 +493,6 @@ void _lock_profile_deregister_struct( spin_unlock(&lock_profile_lock); } =20 -#ifdef CONFIG_LOCK_PROFILE static int __init lock_prof_init(void) { struct lock_profile **q; @@ -507,6 +511,5 @@ static int __init lock_prof_init(void) return 0; } __initcall(lock_prof_init); -#endif =20 -#endif /* LOCK_PROFILE */ +#endif /* CONFIG_DEBUG_LOCK_PROFILE */ diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 765effde8d..46aebecbd3 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -119,7 +119,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_s= ysctl) break; #endif =20 -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE case XEN_SYSCTL_lockprof_op: ret =3D spinlock_profile_control(&op->u.lockprof_op); break; diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 1680d078db..404d28a725 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -1167,7 +1167,9 @@ void panic(const char *fmt, ...) unsigned long flags; static DEFINE_SPINLOCK(lock); static char buf[128]; - =20 + + spin_debug_disable(); + spinlock_profile_printall('\0'); debugtrace_dump(); =20 /* Protects buf[] and ensure multi-line message prints atomically. */ diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index dfa0b72f8d..0b010ff6ad 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -1,6 +1,7 @@ #ifndef __SPINLOCK_H__ #define __SPINLOCK_H__ =20 +#include #include #include #include @@ -27,7 +28,7 @@ union lock_debug { }; #define spin_debug_disable() ((void)0) #endif =20 -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE =20 #include =20 @@ -73,9 +74,9 @@ struct lock_profile { struct spinlock *lock; /* the lock itself */ u64 lock_cnt; /* # of complete locking ops */ u64 block_cnt; /* # of complete wait for lock */ - s64 time_hold; /* cumulated lock time */ - s64 time_block; /* cumulated wait time */ - s64 time_locked; /* system time of last locking */ + s_time_t time_hold; /* cumulated lock time */ + s_time_t time_block; /* cumulated wait time */ + s_time_t time_locked; /* system time of last locking */ }; =20 struct lock_profile_qhead { @@ -131,6 +132,7 @@ struct lock_profile_qhead { }; #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l)) #define lock_profile_register_struct(type, ptr, idx, print) #define lock_profile_deregister_struct(type, ptr) +#define spinlock_profile_printall(key) =20 #endif =20 @@ -151,7 +153,7 @@ typedef struct spinlock { u16 recurse_cnt:4; #define SPINLOCK_MAX_RECURSE 0xfu union lock_debug debug; -#ifdef CONFIG_LOCK_PROFILE +#ifdef CONFIG_DEBUG_LOCK_PROFILE struct lock_profile *profile; #endif } spinlock_t; --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Thu Mar 28 11:19:16 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1565330937; cv=none; d=zoho.com; s=zohoarc; b=mczfvplxgC3YlbAzFIxyPRvJe4/RqKCZ+IhY0Xuj/lFXmPgMuEcx2bEF3g5W3MkK+wogUPY9ay/SYxGMTVplzJ5xyrVEdXbQ1GiYYaqtwyp7nSdIvKDPIGCoCFSAY+zZ/gYfVLfTRcJVNWHURkg61pSp1gvdLx9HTQQrF9LHB68= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565330937; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=nA+ysEN2APNGWCbNS6UPCjwdIWdWAc45snxp9Ec2EHk=; b=CZuJ/bPy24y8Yw4oyCeRKsasFz1sLUsDltd6NSjaDEL35Gg7NHTPWXtKZ03b3+bsgDmcf/HdJ+UHAwNqyUZRW6KNK3cHIAFSp2keurJHTRypGK3kXxqXuKSt5xCbRQ5o8AE3bIT9iT2C+OJlkz/WvslyKVkpsSavt3FPABJe6gY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1565330937196582.3004003707248; Thu, 8 Aug 2019 23:08:57 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy49-0006bk-Q4; Fri, 09 Aug 2019 06:07:53 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy48-0006bU-OL for xen-devel@lists.xenproject.org; Fri, 09 Aug 2019 06:07:52 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 04835b47-ba6c-11e9-8980-bc764e045a96; Fri, 09 Aug 2019 06:07:51 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id CF310B090; Fri, 9 Aug 2019 06:07:48 +0000 (UTC) X-Inumbo-ID: 04835b47-ba6c-11e9-8980-bc764e045a96 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 9 Aug 2019 08:07:43 +0200 Message-Id: <20190809060744.8985-5-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190809060744.8985-1-jgross@suse.com> References: <20190809060744.8985-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 4/5] xen: modify lock profiling interface X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Today adding locks located in a struct to lock profiling requires a unique type index for each structure. This makes it hard to add any new structure as the related sysctl interface needs to be changed, too. Instead of using an index the already existing struct name specified in lock_profile_register_struct() can be used as an identifier instead. Modify the sysctl interface to use the struct name instead of the type index and adapt the related coding accordingly. Instead of an array of struct anchors for lock profiling we now use a linked list for that purpose. Use the special idx value -1 for cases where the idx isn't relevant (global locks) and shouldn't be printed. Increment the sysctl.h interface version as an interface is being modified. Add the missing setting of profiling time to xc_lockprof_query(). Add freeing element data when deregistering a structure. Signed-off-by: Juergen Gross --- V2: - add comment about memory allocation needs (Jan Beulich) - check success of memory allocation (Jan Beulich) --- tools/libxc/xc_misc.c | 1 + tools/misc/xenlockprof.c | 17 ++------ xen/common/domain.c | 4 +- xen/common/spinlock.c | 95 ++++++++++++++++++++++++++++++++---------= ---- xen/include/public/sysctl.h | 11 ++---- xen/include/xen/spinlock.h | 29 ++++++++------ 6 files changed, 95 insertions(+), 62 deletions(-) diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 5e6714ae2b..68c17293bd 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -510,6 +510,7 @@ int xc_lockprof_query(xc_interface *xch, rc =3D do_sysctl(xch, &sysctl); =20 *n_elems =3D sysctl.u.lockprof_op.nr_elem; + *time =3D sysctl.u.lockprof_op.time; =20 return rc; } diff --git a/tools/misc/xenlockprof.c b/tools/misc/xenlockprof.c index 11f43a35e3..c6aa3fe841 100644 --- a/tools/misc/xenlockprof.c +++ b/tools/misc/xenlockprof.c @@ -88,19 +88,10 @@ int main(int argc, char *argv[]) sb =3D 0; for ( j =3D 0; j < i; j++ ) { - switch ( data[j].type ) - { - case LOCKPROF_TYPE_GLOBAL: - sprintf(name, "global lock %s", data[j].name); - break; - case LOCKPROF_TYPE_PERDOM: - sprintf(name, "domain %d lock %s", data[j].idx, data[j].name); - break; - default: - sprintf(name, "unknown type(%d) %d lock %s", data[j].type, - data[j].idx, data[j].name); - break; - } + if ( data[j].idx =3D=3D LOCKPROF_IDX_NONE ) + sprintf(name, "%s %s", data[j].type, data[j].name); + else + sprintf(name, "%s %d %s", data[j].type, data[j].idx, data[j].n= ame); l =3D (double)(data[j].lock_time) / 1E+09; b =3D (double)(data[j].block_time) / 1E+09; sl +=3D l; diff --git a/xen/common/domain.c b/xen/common/domain.c index 744b572195..1051bf38a3 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -290,7 +290,7 @@ static void _domain_destroy(struct domain *d) =20 xsm_free_security_domain(d); =20 - lock_profile_deregister_struct(LOCKPROF_TYPE_PERDOM, d); + lock_profile_deregister_struct(d, "Domain"); =20 free_domain_struct(d); } @@ -369,7 +369,7 @@ struct domain *domain_create(domid_t domid, d->max_vcpus =3D config->max_vcpus; } =20 - lock_profile_register_struct(LOCKPROF_TYPE_PERDOM, d, domid, "Domain"); + lock_profile_register_struct(d, domid, "Domain"); =20 if ( (err =3D xsm_alloc_security_domain(d)) !=3D 0 ) goto fail; diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index c4f706c627..cbde896ae6 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -330,42 +330,43 @@ void _spin_unlock_recursive(spinlock_t *lock) #ifdef CONFIG_DEBUG_LOCK_PROFILE =20 struct lock_profile_anc { + struct lock_profile_anc *next; /* next type */ struct lock_profile_qhead *head_q; /* first head of this type */ - char *name; /* descriptive string for print */ + const char *name; /* descriptive string for print */ }; =20 typedef void lock_profile_subfunc( - struct lock_profile *, int32_t, int32_t, void *); + struct lock_profile *, const char *, int32_t, void *); =20 extern struct lock_profile *__lock_profile_start; extern struct lock_profile *__lock_profile_end; =20 static s_time_t lock_profile_start; -static struct lock_profile_anc lock_profile_ancs[LOCKPROF_TYPE_N]; +static struct lock_profile_anc *lock_profile_ancs; static struct lock_profile_qhead lock_profile_glb_q; static spinlock_t lock_profile_lock =3D SPIN_LOCK_UNLOCKED; =20 static void spinlock_profile_iterate(lock_profile_subfunc *sub, void *par) { - int i; + struct lock_profile_anc *anc; struct lock_profile_qhead *hq; struct lock_profile *eq; =20 spin_lock(&lock_profile_lock); - for ( i =3D 0; i < LOCKPROF_TYPE_N; i++ ) - for ( hq =3D lock_profile_ancs[i].head_q; hq; hq =3D hq->head_q ) + for ( anc =3D lock_profile_ancs; anc; anc =3D anc->next ) + for ( hq =3D anc->head_q; hq; hq =3D hq->head_q ) for ( eq =3D hq->elem_q; eq; eq =3D eq->next ) - sub(eq, i, hq->idx, par); + sub(eq, anc->name, hq->idx, par); spin_unlock(&lock_profile_lock); } =20 static void spinlock_profile_print_elem(struct lock_profile *data, - int32_t type, int32_t idx, void *par) + const char *type, int32_t idx, void *par) { struct spinlock *lock =3D data->lock; =20 - printk("%s ", lock_profile_ancs[type].name); - if ( type !=3D LOCKPROF_TYPE_GLOBAL ) + printk("%s ", type); + if ( idx !=3D LOCKPROF_IDX_NONE ) printk("%d ", idx); printk("%s: addr=3D%p, lockval=3D%08x, ", data->name, lock, lock->tickets.head_tail); @@ -389,7 +390,7 @@ void spinlock_profile_printall(unsigned char key) } =20 static void spinlock_profile_reset_elem(struct lock_profile *data, - int32_t type, int32_t idx, void *par) + const char *type, int32_t idx, void *par) { data->lock_cnt =3D 0; data->block_cnt =3D 0; @@ -413,7 +414,7 @@ typedef struct { } spinlock_profile_ucopy_t; =20 static void spinlock_profile_ucopy_elem(struct lock_profile *data, - int32_t type, int32_t idx, void *par) + const char *type, int32_t idx, void *par) { spinlock_profile_ucopy_t *p =3D par; struct xen_sysctl_lockprof_data elem; @@ -424,7 +425,7 @@ static void spinlock_profile_ucopy_elem(struct lock_pro= file *data, if ( p->pc->nr_elem < p->pc->max_elem ) { safe_strcpy(elem.name, data->name); - elem.type =3D type; + safe_strcpy(elem.type, type); elem.idx =3D idx; elem.lock_cnt =3D data->lock_cnt; elem.block_cnt =3D data->block_cnt; @@ -465,31 +466,70 @@ int spinlock_profile_control(struct xen_sysctl_lockpr= of_op *pc) return rc; } =20 -void _lock_profile_register_struct( - int32_t type, struct lock_profile_qhead *qhead, int32_t idx, char *nam= e) +static struct lock_profile_anc *find_prof_anc(const char *name) { - qhead->idx =3D idx; + struct lock_profile_anc *anc; + + for ( anc =3D lock_profile_ancs; anc; anc =3D anc->next ) + if ( !strcmp(anc->name, name) ) + return anc; + return NULL; +} + +void _lock_profile_register_struct(struct lock_profile_qhead *qhead, + int32_t idx, const char *name) +{ + struct lock_profile_anc *anc; + spin_lock(&lock_profile_lock); - qhead->head_q =3D lock_profile_ancs[type].head_q; - lock_profile_ancs[type].head_q =3D qhead; - lock_profile_ancs[type].name =3D name; + + anc =3D find_prof_anc(name); + if ( !anc ) + { + anc =3D xzalloc(struct lock_profile_anc); + if ( !anc ) + goto out; + anc->name =3D name; + anc->next =3D lock_profile_ancs; + lock_profile_ancs =3D anc; + } + + qhead->idx =3D idx; + qhead->head_q =3D anc->head_q; + anc->head_q =3D qhead; + + out: spin_unlock(&lock_profile_lock); } =20 -void _lock_profile_deregister_struct( - int32_t type, struct lock_profile_qhead *qhead) +void _lock_profile_deregister_struct(struct lock_profile_qhead *qhead, + const char *name) { + struct lock_profile_anc *anc; struct lock_profile_qhead **q; + struct lock_profile *elem; =20 spin_lock(&lock_profile_lock); - for ( q =3D &lock_profile_ancs[type].head_q; *q; q =3D &(*q)->head_q ) + + anc =3D find_prof_anc(name); + if ( anc ) { - if ( *q =3D=3D qhead ) + for ( q =3D &anc->head_q; *q; q =3D &(*q)->head_q ) { - *q =3D qhead->head_q; - break; + if ( *q =3D=3D qhead ) + { + *q =3D qhead->head_q; + while ( qhead->elem_q ) + { + elem =3D qhead->elem_q; + qhead->elem_q =3D elem->next; + xfree(elem); + } + break; + } } } + spin_unlock(&lock_profile_lock); } =20 @@ -504,9 +544,8 @@ static int __init lock_prof_init(void) (*q)->lock->profile =3D *q; } =20 - _lock_profile_register_struct( - LOCKPROF_TYPE_GLOBAL, &lock_profile_glb_q, - 0, "Global lock"); + _lock_profile_register_struct(&lock_profile_glb_q, LOCKPROF_IDX_NONE, + "Global"); =20 return 0; } diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 91c48dcae0..fafce64f02 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -35,7 +35,7 @@ #include "domctl.h" #include "physdev.h" =20 -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000012 +#define XEN_SYSCTL_INTERFACE_VERSION 0x00000013 =20 /* * Read console content from Xen buffer ring. @@ -433,14 +433,11 @@ struct xen_sysctl_page_offline_op { /* Sub-operations: */ #define XEN_SYSCTL_LOCKPROF_reset 1 /* Reset all profile data to zero. */ #define XEN_SYSCTL_LOCKPROF_query 2 /* Get lock profile information. */ -/* Record-type: */ -#define LOCKPROF_TYPE_GLOBAL 0 /* global lock, idx meaningless */ -#define LOCKPROF_TYPE_PERDOM 1 /* per-domain lock, idx is domid */ -#define LOCKPROF_TYPE_N 2 /* number of types */ struct xen_sysctl_lockprof_data { - char name[40]; /* lock name (may include up to 2 %d specifiers= ) */ - int32_t type; /* LOCKPROF_TYPE_??? */ + char name[40]; /* lock name */ + char type[20]; /* e.g. "domain" */ int32_t idx; /* index (e.g. domain id) */ +#define LOCKPROF_IDX_NONE -1 uint64_aligned_t lock_cnt; /* # of locking succeeded */ uint64_aligned_t block_cnt; /* # of wait for lock */ uint64_aligned_t lock_time; /* nsecs lock held */ diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index 0b010ff6ad..9cca49835a 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -51,19 +51,24 @@ union lock_debug { }; =20 with ptr being the main structure pointer and lock the spinlock field =20 + It should be noted that this will need to allocate memory, so interr= upts + must be enabled. + - each structure has to be added to profiling with =20 - lock_profile_register_struct(type, ptr, idx, print); + lock_profile_register_struct(ptr, idx, print); =20 with: - type: something like LOCKPROF_TYPE_PERDOM ptr: pointer to the structure idx: index of that structure, e.g. domid print: descriptive string like "domain" =20 + It should be noted that this will might need to allocate memory, so + interrupts must be enabled. + - removing of a structure is done via =20 - lock_profile_deregister_struct(type, ptr); + lock_profile_deregister_struct(ptr, print); */ =20 struct spinlock; @@ -109,14 +114,14 @@ struct lock_profile_qhead { (s)->profile_head.elem_q =3D prof; = \ } while(0) =20 -void _lock_profile_register_struct( - int32_t, struct lock_profile_qhead *, int32_t, char *); -void _lock_profile_deregister_struct(int32_t, struct lock_profile_qhead *); +void _lock_profile_register_struct(struct lock_profile_qhead *, int32_t, + const char *); +void _lock_profile_deregister_struct(struct lock_profile_qhead *, const ch= ar *); =20 -#define lock_profile_register_struct(type, ptr, idx, print) = \ - _lock_profile_register_struct(type, &((ptr)->profile_head), idx, print) -#define lock_profile_deregister_struct(type, ptr) = \ - _lock_profile_deregister_struct(type, &((ptr)->profile_head)) +#define lock_profile_register_struct(ptr, idx, print) = \ + _lock_profile_register_struct(&((ptr)->profile_head), idx, print) +#define lock_profile_deregister_struct(ptr, print) = \ + _lock_profile_deregister_struct(&((ptr)->profile_head), print) =20 extern int spinlock_profile_control(struct xen_sysctl_lockprof_op *pc); extern void spinlock_profile_printall(unsigned char key); @@ -130,8 +135,8 @@ struct lock_profile_qhead { }; #define DEFINE_SPINLOCK(l) spinlock_t l =3D SPIN_LOCK_UNLOCKED =20 #define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l)) -#define lock_profile_register_struct(type, ptr, idx, print) -#define lock_profile_deregister_struct(type, ptr) +#define lock_profile_register_struct(ptr, idx, print) +#define lock_profile_deregister_struct(ptr, print) #define spinlock_profile_printall(key) =20 #endif --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Thu Mar 28 11:19:16 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1565330935; cv=none; d=zoho.com; s=zohoarc; b=CjipJC+AX3gH+XPC4ccIBocOWkfztMTZQBUNTeDrZsFKhM5F1tOxFMogY334jQvpTVCIY73HsD1Rx0vl54JvPkvw1BXtyAWStqakr8tjhIlag75LdZDuvVGEoM/dp2BK8HtzRvfhqveT4dh28SOURjIOGY7sWqO8Jw/hTPbTQP4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565330935; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=el0PcciL+bvJIvZhzsUiecEdkwpL7nnOdpvxH8FJrFA=; b=nb5wLJilIpJ+AgeL1dEPJhoGBZ3wB9ifp6/ZJmgUDDreaOxB0/0UIB2Naxhj/AnnI8eBkwJpEDXZGKZGuUYxiasrxSeN5a1xAZxa4XPBW+G0y5VFvd1irLe9lr9AIUCiGoWCuZF3ejvIr7kgHBjYfTohFbSK8c5Evvzdy4s0eMc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1565330935354813.5770697492042; Thu, 8 Aug 2019 23:08:55 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4B-0006d2-HP; Fri, 09 Aug 2019 06:07:55 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hvy4A-0006bo-23 for xen-devel@lists.xenproject.org; Fri, 09 Aug 2019 06:07:54 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 0580b8e7-ba6c-11e9-8980-bc764e045a96; Fri, 09 Aug 2019 06:07:53 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 05274AFBE; Fri, 9 Aug 2019 06:07:50 +0000 (UTC) X-Inumbo-ID: 0580b8e7-ba6c-11e9-8980-bc764e045a96 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 9 Aug 2019 08:07:44 +0200 Message-Id: <20190809060744.8985-6-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190809060744.8985-1-jgross@suse.com> References: <20190809060744.8985-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v2 5/5] xen: modify several static locks to unique names X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" In order to have unique names when doing lock profiling several local locks "lock" need to be renamed. Signed-off-by: Juergen Gross --- xen/arch/x86/irq.c | 6 +++--- xen/arch/x86/time.c | 6 +++--- xen/common/keyhandler.c | 6 +++--- xen/common/perfc.c | 6 +++--- xen/common/trace.c | 6 +++--- xen/drivers/char/console.c | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 0ee33464d2..c348f9e6c9 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -867,14 +867,14 @@ void set_direct_apic_vector( void alloc_direct_apic_vector( uint8_t *vector, void (*handler)(struct cpu_user_regs *)) { - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(apic_alloc_lock); =20 - spin_lock(&lock); + spin_lock(&apic_alloc_lock); if (*vector =3D=3D 0) { *vector =3D alloc_hipriority_vector(); set_direct_apic_vector(*vector, handler); } - spin_unlock(&lock); + spin_unlock(&apic_alloc_lock); } =20 void do_IRQ(struct cpu_user_regs *regs) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index d8242295ef..9e8f3e65b1 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -1426,9 +1426,9 @@ static void tsc_check_slave(void *unused) static void tsc_check_reliability(void) { unsigned int cpu =3D smp_processor_id(); - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(tsc_check_lock); =20 - spin_lock(&lock); + spin_lock(&tsc_check_lock); =20 tsc_check_count++; smp_call_function(tsc_check_slave, NULL, 0); @@ -1439,7 +1439,7 @@ static void tsc_check_reliability(void) while ( !cpumask_empty(&tsc_check_cpumask) ) cpu_relax(); =20 - spin_unlock(&lock); + spin_unlock(&tsc_check_lock); } =20 /* diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index c36baa4dff..6e4ff890db 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -371,9 +371,9 @@ static void read_clocks(unsigned char key) static u64 sumdif_stime =3D 0, maxdif_stime =3D 0; static u64 sumdif_cycles =3D 0, maxdif_cycles =3D 0; static u32 count =3D 0; - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(read_clocks_lock); =20 - spin_lock(&lock); + spin_lock(&read_clocks_lock); =20 smp_call_function(read_clocks_slave, NULL, 0); =20 @@ -408,7 +408,7 @@ static void read_clocks(unsigned char key) min_cycles =3D per_cpu(read_cycles_time, min_cycles_cpu); max_cycles =3D per_cpu(read_cycles_time, max_cycles_cpu); =20 - spin_unlock(&lock); + spin_unlock(&read_clocks_lock); =20 dif_stime =3D max_stime - min_stime; if ( dif_stime > maxdif_stime ) diff --git a/xen/common/perfc.c b/xen/common/perfc.c index 3abe35892a..8a099fb0be 100644 --- a/xen/common/perfc.c +++ b/xen/common/perfc.c @@ -241,10 +241,10 @@ static int perfc_copy_info(XEN_GUEST_HANDLE_64(xen_sy= sctl_perfc_desc_t) desc, /* Dom0 control of perf counters */ int perfc_control(struct xen_sysctl_perfc_op *pc) { - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(perfc_control_lock); int rc; =20 - spin_lock(&lock); + spin_lock(&perfc_control_lock); =20 switch ( pc->cmd ) { @@ -262,7 +262,7 @@ int perfc_control(struct xen_sysctl_perfc_op *pc) break; } =20 - spin_unlock(&lock); + spin_unlock(&perfc_control_lock); =20 pc->nr_counters =3D NR_PERFCTRS; pc->nr_vals =3D perfc_nbr_vals; diff --git a/xen/common/trace.c b/xen/common/trace.c index d1ef81407b..a216bea00c 100644 --- a/xen/common/trace.c +++ b/xen/common/trace.c @@ -368,10 +368,10 @@ void __init init_trace_bufs(void) */ int tb_control(struct xen_sysctl_tbuf_op *tbc) { - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(tb_control_lock); int rc =3D 0; =20 - spin_lock(&lock); + spin_lock(&tb_control_lock); =20 switch ( tbc->cmd ) { @@ -432,7 +432,7 @@ int tb_control(struct xen_sysctl_tbuf_op *tbc) break; } =20 - spin_unlock(&lock); + spin_unlock(&tb_control_lock); =20 return rc; } diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 404d28a725..028900caa5 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -1165,7 +1165,7 @@ void panic(const char *fmt, ...) { va_list args; unsigned long flags; - static DEFINE_SPINLOCK(lock); + static DEFINE_SPINLOCK(panic_lock); static char buf[128]; =20 spin_debug_disable(); @@ -1173,7 +1173,7 @@ void panic(const char *fmt, ...) debugtrace_dump(); =20 /* Protects buf[] and ensure multi-line message prints atomically. */ - spin_lock_irqsave(&lock, flags); + spin_lock_irqsave(&panic_lock, flags); =20 va_start(args, fmt); (void)vsnprintf(buf, sizeof(buf), fmt, args); @@ -1193,7 +1193,7 @@ void panic(const char *fmt, ...) printk("Reboot in five seconds...\n"); #endif =20 - spin_unlock_irqrestore(&lock, flags); + spin_unlock_irqrestore(&panic_lock, flags); =20 debugger_trap_immediate(); =20 --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel