Commit ba28549b authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

Merge tag 'lockdep-for-tip.2025.07.16' of...

Merge tag 'lockdep-for-tip.2025.07.16' of git://git.kernel.org/pub/scm/linux/kernel/git/boqun/linux

 into locking/core

Locking changes for v6.17:

- General
  - Mark devm_mutex_init() as __must_check
  - Add #[must_use] to Lock::try_lock()
  - Remove OWNER_SPINNABLE in rwsem
  - Remove redundant #ifdefs in mutex
- Lockdep
  - Avoid returning struct in lock_stats()
  - Change `static const` into enum for LOCKF_*_IRQ_*
  - Temporarily use synchronize_rcu_expedited() in
    lockdep_unregister_key() to speed things up.

Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
parents 7ff495e2 7a3cedaf
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -307,7 +307,9 @@ static int lp8860_probe(struct i2c_client *client)
	led->client = client;
	led->led_dev.brightness_set_blocking = lp8860_brightness_set;

	devm_mutex_init(&client->dev, &led->lock);
	ret = devm_mutex_init(&client->dev, &led->lock);
	if (ret)
		return dev_err_probe(&client->dev, ret, "Failed to initialize lock\n");

	led->regmap = devm_regmap_init_i2c(client, &lp8860_regmap_config);
	if (IS_ERR(led->regmap)) {
+3 −1
Original line number Diff line number Diff line
@@ -1273,7 +1273,9 @@ static int nxp_fspi_probe(struct platform_device *pdev)
	if (ret)
		return dev_err_probe(dev, ret, "Failed to request irq\n");

	devm_mutex_init(dev, &f->lock);
	ret = devm_mutex_init(dev, &f->lock);
	if (ret)
		return dev_err_probe(dev, ret, "Failed to initialize lock\n");

	ctlr->bus_num = -1;
	ctlr->num_chipselect = NXP_FSPI_MAX_CHIPSELECT;
+1 −1
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ struct lock_class_stats {
	unsigned long			bounces[nr_bounce_types];
};

struct lock_class_stats lock_stats(struct lock_class *class);
void lock_stats(struct lock_class *class, struct lock_class_stats *stats);
void clear_lock_stats(struct lock_class *class);
#endif

+7 −4
Original line number Diff line number Diff line
@@ -126,11 +126,11 @@ do { \

#ifdef CONFIG_DEBUG_MUTEXES

int __devm_mutex_init(struct device *dev, struct mutex *lock);
int __must_check __devm_mutex_init(struct device *dev, struct mutex *lock);

#else

static inline int __devm_mutex_init(struct device *dev, struct mutex *lock)
static inline int __must_check __devm_mutex_init(struct device *dev, struct mutex *lock)
{
	/*
	 * When CONFIG_DEBUG_MUTEXES is off mutex_destroy() is just a nop so
@@ -141,14 +141,17 @@ static inline int __devm_mutex_init(struct device *dev, struct mutex *lock)

#endif

#define devm_mutex_init(dev, mutex)			\
#define __mutex_init_ret(mutex)				\
({							\
	typeof(mutex) mutex_ = (mutex);			\
							\
	mutex_init(mutex_);				\
	__devm_mutex_init(dev, mutex_);			\
	mutex_;						\
})

#define devm_mutex_init(dev, mutex) \
	__devm_mutex_init(dev, __mutex_init_ret(mutex))

/*
 * See kernel/locking/mutex.c for detailed documentation of these APIs.
 * Also see Documentation/locking/mutex-design.rst.
+22 −17
Original line number Diff line number Diff line
@@ -297,33 +297,30 @@ static inline void lock_time_add(struct lock_time *src, struct lock_time *dst)
	dst->nr += src->nr;
}

struct lock_class_stats lock_stats(struct lock_class *class)
void lock_stats(struct lock_class *class, struct lock_class_stats *stats)
{
	struct lock_class_stats stats;
	int cpu, i;

	memset(&stats, 0, sizeof(struct lock_class_stats));
	memset(stats, 0, sizeof(struct lock_class_stats));
	for_each_possible_cpu(cpu) {
		struct lock_class_stats *pcs =
			&per_cpu(cpu_lock_stats, cpu)[class - lock_classes];

		for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++)
			stats.contention_point[i] += pcs->contention_point[i];
		for (i = 0; i < ARRAY_SIZE(stats->contention_point); i++)
			stats->contention_point[i] += pcs->contention_point[i];

		for (i = 0; i < ARRAY_SIZE(stats.contending_point); i++)
			stats.contending_point[i] += pcs->contending_point[i];
		for (i = 0; i < ARRAY_SIZE(stats->contending_point); i++)
			stats->contending_point[i] += pcs->contending_point[i];

		lock_time_add(&pcs->read_waittime, &stats.read_waittime);
		lock_time_add(&pcs->write_waittime, &stats.write_waittime);
		lock_time_add(&pcs->read_waittime, &stats->read_waittime);
		lock_time_add(&pcs->write_waittime, &stats->write_waittime);

		lock_time_add(&pcs->read_holdtime, &stats.read_holdtime);
		lock_time_add(&pcs->write_holdtime, &stats.write_holdtime);
		lock_time_add(&pcs->read_holdtime, &stats->read_holdtime);
		lock_time_add(&pcs->write_holdtime, &stats->write_holdtime);

		for (i = 0; i < ARRAY_SIZE(stats.bounces); i++)
			stats.bounces[i] += pcs->bounces[i];
		for (i = 0; i < ARRAY_SIZE(stats->bounces); i++)
			stats->bounces[i] += pcs->bounces[i];
	}

	return stats;
}

void clear_lock_stats(struct lock_class *class)
@@ -6619,8 +6616,16 @@ void lockdep_unregister_key(struct lock_class_key *key)
	if (need_callback)
		call_rcu(&delayed_free.rcu_head, free_zapped_rcu);

	/* Wait until is_dynamic_key() has finished accessing k->hash_entry. */
	synchronize_rcu();
	/*
	 * Wait until is_dynamic_key() has finished accessing k->hash_entry.
	 *
	 * Some operations like __qdisc_destroy() will call this in a debug
	 * kernel, and the network traffic is disabled while waiting, hence
	 * the delay of the wait matters in debugging cases. Currently use a
	 * synchronize_rcu_expedited() to speed up the wait at the cost of
	 * system IPIs. TODO: Replace RCU with hazptr for this.
	 */
	synchronize_rcu_expedited();
}
EXPORT_SYMBOL_GPL(lockdep_unregister_key);

Loading