[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#766635: kernel patch for hppa architecture



Source: kernel
Version: 3.16.5-1
Severity: important
Tags: patch

Dear debian kernel maintainers,

Can you please apply this hppa-arch-specific patch to the debian kernel 3.16.5 and keep it until you upgrade to sources of upstream kernel 3.18 ?

Main reason for this patch is to make it possible to use systemd on hppa.
Without this patch people who will by mistake install systemd (e.g. because of dependencies) will render their machines unbootable.
The patch breaks the ABI on hppa, but in a way which will not affect people, because it changes the signals which are usually not used. This has been tested by installing and booting mixtures of glibc and kernel with corresponding patches.


Since this patch affects kernel and glibc, I've opened this debian bug report for the glibc patch:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766605


Upstream Linux kernel commit (committed into kernel 3.18, as attached here) is 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1f25df2eff5b25f52c139d3ff31bc883eee9a0ab&utm_source=anzwix

Upstream glibc commit is:
https://sourceware.org/git/?p=glibc.git;a=commit;h=13d845549e41823e6658122dcf268154bcbbcfde


To better explain what we fix here, the glibc changelog description of Carlos is probably best (copied in here):

This is a conscious ABI break for hppa.

We find ourselves unable to run systemd because it expects
SIGRTMIN+29 signals to be available and with hppa starting
at 37 that exceeds the 64 signals available. It is arguable
that the systemd code could compact their signal usage (the
have a gap and don't check SIGRTMAX to see if they are over).
However, that would require pursuing this upstream with systemd.
The least work option is to make hppa more like other arches.

The best option is to free up 3 signals for use with SIGXCPU,
SIGXFSZ and SIGSTKFLT, and move those below 31. We make SIGSYS
equal to SIGUNUSED as is expected. We remove SIGEMT and SIGLOST
as HPUX signal we won't ever use. With that change we match all
other machines.

Given that these signals are so esoteric, testing by other users
building minimal systems from scratch showed no problems. In fact
Tcl fails to build if you make SIGEMT == SIGABRT, so we just removed
SIGEMT (they use a large switch statement in C to handle signals, and
I don't think it's valid to assume they will all have distinct values
to fit into a switch).

Committed as the only solution we possibly have here.
commit 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab
Author: Helge Deller <deller@gmx.de>
Date:   Fri Oct 10 22:20:17 2014 +0200

    parisc: Reduce SIGRTMIN from 37 to 32 to behave like other Linux architectures
    
    This patch reduces the value of SIGRTMIN on PARISC from 37 to 32, thus
    increasing the number of available RT signals and bring it in sync with other
    Linux architectures.
    
    Historically we wanted to natively support HP-UX 32bit binaries with the
    PA-RISC Linux port.  Because of that we carried the various available signals
    from HP-UX (e.g. SIGEMT and SIGLOST) and folded them in between the native
    Linux signals.  Although this was the right decision at that time, this
    required us to increase SIGRTMIN to at least 37 which left us with 27 (64-37)
    RT signals.
    
    Those 27 RT signals haven't been a problem in the past, but with the upcoming
    importance of systemd we now got the problem that systemd alloctes (hardcoded)
    signals up to SIGRTMIN+29 which is beyond our NSIG of 64. Because of that we
    have not been able to use systemd on the PARISC Linux port yet.
    
    Of course we could ask the systemd developers to not use those hardcoded
    values, but this change is very unlikely, esp. with PA-RISC being a niche
    architecture.
    
    The other possibility would be to increase NSIG to e.g. 128, but this would
    mean to duplicate most of the existing Linux signal handling code into the
    parisc specific Linux kernel tree which would most likely introduce lots of new
    bugs beside the code duplication.
    
    The third option is to drop some HP-UX signals and shuffle some other signals
    around to bring SIGRTMIN to 32.  This is of course an ABI change, but testing
    has shown that existing Linux installations are not visibly affected by this
    change - most likely because we move those signals around which are rarely used
    and move them to slots which haven't been used in Linux yet. In an existing
    installation I was able to exchange either the Linux kernel or glibc (or both)
    without affecting the boot process and installed applications.
    
    Dropping the HP-UX signals isn't an issue either, since support for HP-UX was
    basically dropped a few months back with Kernel 3.14 in commit
    f5a408d53edef3af07ac7697b8bc54a755628450 already, when we changed EWOULDBLOCK
    to be equal to EAGAIN.
    
    So, even if this is an ABI change, it's better to change it now and thus bring
    PARISC Linux in sync with other architectures to avoid other issues in the
    future.
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Cc: Carlos O'Donell <carlos@systemhalted.org>
    Cc: John David Anglin <dave.anglin@bell.net>
    Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
    Cc: PARISC Linux Kernel Mailinglist <linux-parisc@vger.kernel.org>
    Tested-by: Aaro Koskinen <aaro.koskinen@iki.fi>

diff --git a/arch/parisc/include/uapi/asm/signal.h b/arch/parisc/include/uapi/asm/signal.h
index f5645d6..10df707 100644
--- a/arch/parisc/include/uapi/asm/signal.h
+++ b/arch/parisc/include/uapi/asm/signal.h
@@ -8,12 +8,12 @@
 #define SIGTRAP		 5
 #define SIGABRT		 6
 #define SIGIOT		 6
-#define SIGEMT		 7
+#define SIGSTKFLT	 7
 #define SIGFPE		 8
 #define SIGKILL		 9
 #define SIGBUS		10
 #define SIGSEGV		11
-#define SIGSYS		12 /* Linux doesn't use this */
+#define SIGXCPU		12
 #define SIGPIPE		13
 #define SIGALRM		14
 #define SIGTERM		15
@@ -32,16 +32,12 @@
 #define SIGTTIN		27
 #define SIGTTOU		28
 #define SIGURG		29
-#define SIGLOST		30 /* Linux doesn't use this either */
-#define	SIGUNUSED	31
-#define SIGRESERVE	SIGUNUSED
-
-#define SIGXCPU		33
-#define SIGXFSZ		34
-#define SIGSTKFLT	36
+#define SIGXFSZ		30
+#define SIGUNUSED	31
+#define SIGSYS		31 /* Linux doesn't use this */
 
 /* These should not be considered constants from userland.  */
-#define SIGRTMIN	37
+#define SIGRTMIN	32
 #define SIGRTMAX	_NSIG /* it's 44 under HP/UX */
 
 /*

Reply to: