Commit 98067901 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 fixes from Heiko Carstens:

 - Make KEXEC_SIG available again for CONFIG_MODULES=n

 - The s390 topology code used to call rebuild_sched_domains() before
   common code scheduling domains were setup. This was silently ignored
   by common code, but now results in a warning. Address by avoiding the
   early call

 - Convert debug area lock from spinlock to raw spinlock to address
   lockdep warnings

 - The recent 3490 tape device driver rework resulted in a different
   device driver name, which is visible via sysfs for user space. This
   breaks at least one user space application. Change the device driver
   name back to its old name to fix this

* tag 's390-7.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/tape: Fix device driver name
  s390/debug: Convert debug area lock from a spinlock to a raw spinlock
  s390/smp: Avoid calling rebuild_sched_domains() early
  s390/kexec: Make KEXEC_SIG available when CONFIG_MODULES=n
parents 9abf7952 123d2e75
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -279,6 +279,7 @@ config S390
	select SPARSE_IRQ
	select SWIOTLB
	select SYSCTL_EXCEPTION_TRACE
	select SYSTEM_DATA_VERIFICATION if KEXEC_SIG
	select THREAD_INFO_IN_TASK
	select TRACE_IRQFLAGS_SUPPORT
	select TTY
@@ -313,7 +314,7 @@ config ARCH_SUPPORTS_KEXEC_FILE
	def_bool y

config ARCH_SUPPORTS_KEXEC_SIG
	def_bool MODULE_SIG_FORMAT
	def_bool y

config ARCH_SUPPORTS_KEXEC_PURGATORY
	def_bool y
+2 −2
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ typedef struct debug_info {
	struct debug_info *next;
	struct debug_info *prev;
	refcount_t ref_count;
	spinlock_t lock;
	raw_spinlock_t lock;
	int level;
	int nr_areas;
	int pages_per_area;
@@ -440,7 +440,7 @@ static int VNAME(var, active_entries)[EARLY_AREAS] __initdata
	.next = NULL,							\
	.prev = NULL,							\
	.ref_count = REFCOUNT_INIT(1),					\
	.lock = __SPIN_LOCK_UNLOCKED(var.lock),				\
	.lock = __RAW_SPIN_LOCK_UNLOCKED(var.lock),			\
	.level = DEBUG_DEFAULT_LEVEL,					\
	.nr_areas = EARLY_AREAS,					\
	.pages_per_area = EARLY_PAGES,					\
+30 −30
Original line number Diff line number Diff line
@@ -243,7 +243,7 @@ static debug_info_t *debug_info_alloc(const char *name, int pages_per_area,
	}

	/* initialize members */
	spin_lock_init(&rc->lock);
	raw_spin_lock_init(&rc->lock);
	rc->pages_per_area = pages_per_area;
	rc->nr_areas	   = nr_areas;
	rc->active_area    = 0;
@@ -333,7 +333,7 @@ static debug_info_t *debug_info_copy(debug_info_t *in, int mode)
	do {
		rc = debug_info_alloc(in->name, in->pages_per_area,
			in->nr_areas, in->buf_size, in->level, mode);
		spin_lock_irqsave(&in->lock, flags);
		raw_spin_lock_irqsave(&in->lock, flags);
		if (!rc)
			goto out;
		/* has something changed in the meantime ? */
@@ -341,7 +341,7 @@ static debug_info_t *debug_info_copy(debug_info_t *in, int mode)
		    (rc->nr_areas == in->nr_areas)) {
			break;
		}
		spin_unlock_irqrestore(&in->lock, flags);
		raw_spin_unlock_irqrestore(&in->lock, flags);
		debug_info_free(rc);
	} while (1);

@@ -356,7 +356,7 @@ static debug_info_t *debug_info_copy(debug_info_t *in, int mode)
	}
	rc->active_area = in->active_area;
out:
	spin_unlock_irqrestore(&in->lock, flags);
	raw_spin_unlock_irqrestore(&in->lock, flags);
	return rc;
}

@@ -879,20 +879,20 @@ void debug_register_static(debug_info_t *id, int pages_per_area, int nr_areas)
		pr_err("Registering debug feature %s failed\n", id->name);

		/* Clear pointers to prevent tracing into released initdata. */
		spin_lock_irqsave(&id->lock, flags);
		raw_spin_lock_irqsave(&id->lock, flags);
		id->areas = NULL;
		id->active_pages = NULL;
		id->active_entries = NULL;
		spin_unlock_irqrestore(&id->lock, flags);
		raw_spin_unlock_irqrestore(&id->lock, flags);

		return;
	}

	/* Replace static trace area with dynamic copy. */
	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	debug_events_append(copy, id);
	debug_areas_swap(id, copy);
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);

	/* Clear pointers to initdata and discard copy. */
	copy->areas = NULL;
@@ -966,11 +966,11 @@ static int debug_set_size(debug_info_t *id, int nr_areas, int pages_per_area)
		return -ENOMEM;
	}

	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	debug_events_append(new_id, id);
	debug_areas_swap(new_id, id);
	raw_spin_unlock_irqrestore(&id->lock, flags);
	debug_info_free(new_id);
	spin_unlock_irqrestore(&id->lock, flags);
	pr_info("%s: set new size (%i pages)\n", id->name, pages_per_area);

	return 0;
@@ -1000,9 +1000,9 @@ void debug_set_level(debug_info_t *id, int new_level)
		return;
	}

	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	id->level = new_level;
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
}
EXPORT_SYMBOL(debug_set_level);

@@ -1184,10 +1184,10 @@ debug_entry_t *debug_event_common(debug_info_t *id, int level, const void *buf,
	if (!debug_active || !id->areas)
		return NULL;
	if (debug_critical) {
		if (!spin_trylock_irqsave(&id->lock, flags))
		if (!raw_spin_trylock_irqsave(&id->lock, flags))
			return NULL;
	} else {
		spin_lock_irqsave(&id->lock, flags);
		raw_spin_lock_irqsave(&id->lock, flags);
	}
	do {
		active = get_active_entry(id);
@@ -1199,7 +1199,7 @@ debug_entry_t *debug_event_common(debug_info_t *id, int level, const void *buf,
		buf += id->buf_size;
	} while (len > 0);

	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
	return active;
}
EXPORT_SYMBOL(debug_event_common);
@@ -1217,10 +1217,10 @@ debug_entry_t *debug_exception_common(debug_info_t *id, int level,
	if (!debug_active || !id->areas)
		return NULL;
	if (debug_critical) {
		if (!spin_trylock_irqsave(&id->lock, flags))
		if (!raw_spin_trylock_irqsave(&id->lock, flags))
			return NULL;
	} else {
		spin_lock_irqsave(&id->lock, flags);
		raw_spin_lock_irqsave(&id->lock, flags);
	}
	do {
		active = get_active_entry(id);
@@ -1232,7 +1232,7 @@ debug_entry_t *debug_exception_common(debug_info_t *id, int level,
		buf += id->buf_size;
	} while (len > 0);

	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
	return active;
}
EXPORT_SYMBOL(debug_exception_common);
@@ -1267,10 +1267,10 @@ debug_entry_t *__debug_sprintf_event(debug_info_t *id, int level, char *string,
	numargs = debug_count_numargs(string);

	if (debug_critical) {
		if (!spin_trylock_irqsave(&id->lock, flags))
		if (!raw_spin_trylock_irqsave(&id->lock, flags))
			return NULL;
	} else {
		spin_lock_irqsave(&id->lock, flags);
		raw_spin_lock_irqsave(&id->lock, flags);
	}
	active = get_active_entry(id);
	curr_event = (debug_sprintf_entry_t *) DEBUG_DATA(active);
@@ -1280,7 +1280,7 @@ debug_entry_t *__debug_sprintf_event(debug_info_t *id, int level, char *string,
		curr_event->args[idx] = va_arg(ap, long);
	va_end(ap);
	debug_finish_entry(id, active, level, 0);
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);

	return active;
}
@@ -1303,10 +1303,10 @@ debug_entry_t *__debug_sprintf_exception(debug_info_t *id, int level, char *stri
	numargs = debug_count_numargs(string);

	if (debug_critical) {
		if (!spin_trylock_irqsave(&id->lock, flags))
		if (!raw_spin_trylock_irqsave(&id->lock, flags))
			return NULL;
	} else {
		spin_lock_irqsave(&id->lock, flags);
		raw_spin_lock_irqsave(&id->lock, flags);
	}
	active = get_active_entry(id);
	curr_event = (debug_sprintf_entry_t *)DEBUG_DATA(active);
@@ -1316,7 +1316,7 @@ debug_entry_t *__debug_sprintf_exception(debug_info_t *id, int level, char *stri
		curr_event->args[idx] = va_arg(ap, long);
	va_end(ap);
	debug_finish_entry(id, active, level, 1);
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);

	return active;
}
@@ -1350,7 +1350,7 @@ int debug_register_view(debug_info_t *id, struct debug_view *view)
		mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
	pde = debugfs_create_file(view->name, mode, id->debugfs_root_entry,
				  id, &debug_file_ops);
	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
		if (!id->views[i])
			break;
@@ -1361,7 +1361,7 @@ int debug_register_view(debug_info_t *id, struct debug_view *view)
		id->views[i] = view;
		id->debugfs_entries[i] = pde;
	}
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
	if (rc) {
		pr_err("Registering view %s/%s would exceed the maximum "
		       "number of views %i\n", id->name, view->name, i);
@@ -1391,7 +1391,7 @@ int debug_unregister_view(debug_info_t *id, struct debug_view *view)

	if (!id)
		goto out;
	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
		if (id->views[i] == view)
			break;
@@ -1403,7 +1403,7 @@ int debug_unregister_view(debug_info_t *id, struct debug_view *view)
		id->views[i] = NULL;
		id->debugfs_entries[i] = NULL;
	}
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
	debugfs_remove(dentry);
out:
	return rc;
@@ -1557,7 +1557,7 @@ static void debug_flush(debug_info_t *id, int area)

	if (!id || !id->areas)
		return;
	spin_lock_irqsave(&id->lock, flags);
	raw_spin_lock_irqsave(&id->lock, flags);
	if (area == DEBUG_FLUSH_ALL) {
		id->active_area = 0;
		memset(id->active_entries, 0, id->nr_areas * sizeof(int));
@@ -1572,7 +1572,7 @@ static void debug_flush(debug_info_t *id, int area)
		for (i = 0; i < id->pages_per_area; i++)
			memset(id->areas[area][i], 0, PAGE_SIZE);
	}
	spin_unlock_irqrestore(&id->lock, flags);
	raw_spin_unlock_irqrestore(&id->lock, flags);
}

/*
+1 −1
Original line number Diff line number Diff line
@@ -1151,7 +1151,7 @@ int __ref smp_rescan_cpus(bool early)
	smp_get_core_info(info, 0);
	nr = __smp_rescan_cpus(info, early);
	kfree(info);
	if (nr)
	if (nr && !early)
		topology_schedule_update();
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -784,7 +784,7 @@ tape_3490_online(struct ccw_device *cdev)

static struct ccw_driver tape_3490_driver = {
	.driver = {
		.name = "tape_3490",
		.name = "tape_34xx",
		.owner = THIS_MODULE,
	},
	.ids = tape_3490_ids,