s390 fixes for 7.0 merge window

- 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
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEECMNfWEw3SLnmiLkZIg7DeRspbsIFAmmYUo8ACgkQIg7DeRsp
 bsL+rw//f6AadV9X3tCPe/vaNdxQWkVtd1Ov+eKYkIohSFvghBo4+4c6qXlsc4jp
 Opedqs2+YUdx2/tR3nTPkfG/Nm49rGpB+i4CYAjBUlAjIN1czyUlvICJ6ZVQbpQt
 zR+I7Ej/QsBR0XMqbUfPNWMwbdZlW395kXNhCAKckbjM1M+Hezp9WZjuaQ1vWCUv
 wGXAUI+/fTgPKUu3nIQRw2JkG2M+IfFj3jkYMXTW8D8WzoqLXPwtjmjcDtTU/VDr
 otq97rDUd8MvNsxV5hX+T7nI0JQIFrdb32bCy0mhWhnvc7rHdewLfp5+793vKG/K
 DcOouXr/vJcPUhAUQI3ksREAwAEJV1phKeILXbbUhpkAZUQAozVG6+YrzMk/4VSW
 Zm6BGcOLVo0DQtn97I55gKSPFiNoCQwSdU+CcrbzA8aEDBMfxLFKBvh50sAx/0I3
 zXbXYDjgPdqOKuyUprB8Y6PJTrCnHebXPGs2Kgl2XU3k4m61h/60EHIXe6w0ErM8
 1hl8+Rdn4jmWDcAOFKTBpo8Y/o+WZVcNssPr4F7ArcjJTWmAtxWP3NQAux3UM2HW
 3dOV6dcdbmndKSmKwtWrvMVv0GvcgWAp/NhjwKx37EovYLFJg4DqtiioqiOFjWKD
 4gwIB8gKxbWjNSGq3cKTiH021iWoRIDoCeAFJWRdrH5xt7rxCWc=
 =7EJS
 -----END PGP SIGNATURE-----

Merge tag 's390-7.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

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
This commit is contained in:
Linus Torvalds 2026-02-20 09:24:45 -08:00
commit 9806790115
5 changed files with 36 additions and 35 deletions

View file

@ -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

View file

@ -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, \

View file

@ -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);
}
/*

View file

@ -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;
}

View file

@ -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,