Mailing List Archive

[xen staging] lockprof: don't pass name into registration function
commit b2a64292b0bfa317886b3432d1a5b2a4193a48d6
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Fri Jul 24 10:19:25 2020 +0200
Commit: Jan Beulich <jbeulich@suse.com>
CommitDate: Fri Jul 24 10:19:25 2020 +0200

lockprof: don't pass name into registration function

The type uniquely identifies the associated name, hence the name fields
can be statically initialized.

Also constify not just the involved struct field, but also struct
lock_profile's. Rather than specifying lock_profile_ancs[]' dimension at
definition time, add a suitable build time check, such that at least
missing tail additions to the initializer can be spotted easily.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
xen/common/domain.c | 2 +-
xen/common/spinlock.c | 17 ++++++++++-------
xen/include/xen/spinlock.h | 10 +++++-----
3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/xen/common/domain.c b/xen/common/domain.c
index e9be05f1d0..f0f9c62feb 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -392,7 +392,7 @@ struct domain *domain_create(domid_t domid,
d->max_vcpus = config->max_vcpus;
}

- lock_profile_register_struct(LOCKPROF_TYPE_PERDOM, d, domid, "Domain");
+ lock_profile_register_struct(LOCKPROF_TYPE_PERDOM, d, domid);

if ( (err = xsm_alloc_security_domain(d)) != 0 )
goto fail;
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index 6c8b62beb0..17f4519fc7 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -338,7 +338,7 @@ void _spin_unlock_recursive(spinlock_t *lock)

struct lock_profile_anc {
struct lock_profile_qhead *head_q; /* first head of this type */
- char *name; /* descriptive string for print */
+ const char *name; /* descriptive string for print */
};

typedef void lock_profile_subfunc(
@@ -348,7 +348,10 @@ extern struct lock_profile *__lock_profile_start;
extern struct lock_profile *__lock_profile_end;

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[] = {
+ [LOCKPROF_TYPE_GLOBAL] = { .name = "Global" },
+ [LOCKPROF_TYPE_PERDOM] = { .name = "Domain" },
+};
static struct lock_profile_qhead lock_profile_glb_q;
static spinlock_t lock_profile_lock = SPIN_LOCK_UNLOCKED;

@@ -473,13 +476,12 @@ int spinlock_profile_control(struct xen_sysctl_lockprof_op *pc)
}

void _lock_profile_register_struct(
- int32_t type, struct lock_profile_qhead *qhead, int32_t idx, char *name)
+ int32_t type, struct lock_profile_qhead *qhead, int32_t idx)
{
qhead->idx = idx;
spin_lock(&lock_profile_lock);
qhead->head_q = lock_profile_ancs[type].head_q;
lock_profile_ancs[type].head_q = qhead;
- lock_profile_ancs[type].name = name;
spin_unlock(&lock_profile_lock);
}

@@ -504,6 +506,8 @@ static int __init lock_prof_init(void)
{
struct lock_profile **q;

+ BUILD_BUG_ON(ARRAY_SIZE(lock_profile_ancs) != LOCKPROF_TYPE_N);
+
for ( q = &__lock_profile_start; q < &__lock_profile_end; q++ )
{
(*q)->next = lock_profile_glb_q.elem_q;
@@ -511,9 +515,8 @@ static int __init lock_prof_init(void)
(*q)->lock->profile = *q;
}

- _lock_profile_register_struct(
- LOCKPROF_TYPE_GLOBAL, &lock_profile_glb_q,
- 0, "Global lock");
+ _lock_profile_register_struct(LOCKPROF_TYPE_GLOBAL,
+ &lock_profile_glb_q, 0);

return 0;
}
diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h
index c0e7690a6c..ca13b600a0 100644
--- a/xen/include/xen/spinlock.h
+++ b/xen/include/xen/spinlock.h
@@ -72,7 +72,7 @@ struct spinlock;

struct lock_profile {
struct lock_profile *next; /* forward link */
- char *name; /* lock name */
+ const char *name; /* lock name */
struct spinlock *lock; /* the lock itself */
u64 lock_cnt; /* # of complete locking ops */
u64 block_cnt; /* # of complete wait for lock */
@@ -118,11 +118,11 @@ struct lock_profile_qhead {
} while(0)

void _lock_profile_register_struct(
- int32_t, struct lock_profile_qhead *, int32_t, char *);
+ int32_t, struct lock_profile_qhead *, int32_t);
void _lock_profile_deregister_struct(int32_t, struct lock_profile_qhead *);

-#define lock_profile_register_struct(type, ptr, idx, print) \
- _lock_profile_register_struct(type, &((ptr)->profile_head), idx, print)
+#define lock_profile_register_struct(type, ptr, idx) \
+ _lock_profile_register_struct(type, &((ptr)->profile_head), idx)
#define lock_profile_deregister_struct(type, ptr) \
_lock_profile_deregister_struct(type, &((ptr)->profile_head))

@@ -138,7 +138,7 @@ struct lock_profile_qhead { };
#define DEFINE_SPINLOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED

#define spin_lock_init_prof(s, l) spin_lock_init(&((s)->l))
-#define lock_profile_register_struct(type, ptr, idx, print)
+#define lock_profile_register_struct(type, ptr, idx)
#define lock_profile_deregister_struct(type, ptr)
#define spinlock_profile_printall(key)

--
generated by git-patchbot for /home/xen/git/xen.git#staging