lkml.org 
[lkml]   [2018]   [Apr]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 33/74] s390/alternative: use a copy of the facility bit mask
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Martin Schwidefsky <schwidefsky@de.ibm.com>


    [ Upstream commit cf1489984641369611556bf00c48f945c77bcf02 ]

    To be able to switch off specific CPU alternatives with kernel parameters
    make a copy of the facility bit mask provided by STFLE and use the copy
    for the decision to apply an alternative.

    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/s390/include/asm/facility.h | 18 ++++++++++++++++++
    arch/s390/include/asm/lowcore.h | 3 ++-
    arch/s390/kernel/alternative.c | 3 ++-
    arch/s390/kernel/early.c | 3 +++
    arch/s390/kernel/setup.c | 4 +++-
    arch/s390/kernel/smp.c | 4 +++-
    6 files changed, 31 insertions(+), 4 deletions(-)

    --- a/arch/s390/include/asm/facility.h
    +++ b/arch/s390/include/asm/facility.h
    @@ -17,6 +17,24 @@

    #define MAX_FACILITY_BIT (256*8) /* stfle_fac_list has 256 bytes */

    +static inline void __set_facility(unsigned long nr, void *facilities)
    +{
    + unsigned char *ptr = (unsigned char *) facilities;
    +
    + if (nr >= MAX_FACILITY_BIT)
    + return;
    + ptr[nr >> 3] |= 0x80 >> (nr & 7);
    +}
    +
    +static inline void __clear_facility(unsigned long nr, void *facilities)
    +{
    + unsigned char *ptr = (unsigned char *) facilities;
    +
    + if (nr >= MAX_FACILITY_BIT)
    + return;
    + ptr[nr >> 3] &= ~(0x80 >> (nr & 7));
    +}
    +
    static inline int __test_facility(unsigned long nr, void *facilities)
    {
    unsigned char *ptr;
    --- a/arch/s390/include/asm/lowcore.h
    +++ b/arch/s390/include/asm/lowcore.h
    @@ -150,7 +150,8 @@ struct lowcore {
    __u8 pad_0x0e20[0x0f00-0x0e20]; /* 0x0e20 */

    /* Extended facility list */
    - __u64 stfle_fac_list[32]; /* 0x0f00 */
    + __u64 stfle_fac_list[16]; /* 0x0f00 */
    + __u64 alt_stfle_fac_list[16]; /* 0x0f80 */
    __u8 pad_0x1000[0x11b0-0x1000]; /* 0x1000 */

    /* Pointer to vector register save area */
    --- a/arch/s390/kernel/alternative.c
    +++ b/arch/s390/kernel/alternative.c
    @@ -74,7 +74,8 @@ static void __init_or_module __apply_alt
    instr = (u8 *)&a->instr_offset + a->instr_offset;
    replacement = (u8 *)&a->repl_offset + a->repl_offset;

    - if (!test_facility(a->facility))
    + if (!__test_facility(a->facility,
    + S390_lowcore.alt_stfle_fac_list))
    continue;

    if (unlikely(a->instrlen % 2 || a->replacementlen % 2)) {
    --- a/arch/s390/kernel/early.c
    +++ b/arch/s390/kernel/early.c
    @@ -299,6 +299,9 @@ static noinline __init void setup_facili
    {
    stfle(S390_lowcore.stfle_fac_list,
    ARRAY_SIZE(S390_lowcore.stfle_fac_list));
    + memcpy(S390_lowcore.alt_stfle_fac_list,
    + S390_lowcore.stfle_fac_list,
    + sizeof(S390_lowcore.alt_stfle_fac_list));
    }

    static __init void detect_diag9c(void)
    --- a/arch/s390/kernel/setup.c
    +++ b/arch/s390/kernel/setup.c
    @@ -336,7 +336,9 @@ static void __init setup_lowcore(void)
    lc->machine_flags = S390_lowcore.machine_flags;
    lc->stfl_fac_list = S390_lowcore.stfl_fac_list;
    memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
    - MAX_FACILITY_BIT/8);
    + sizeof(lc->stfle_fac_list));
    + memcpy(lc->alt_stfle_fac_list, S390_lowcore.alt_stfle_fac_list,
    + sizeof(lc->alt_stfle_fac_list));
    if (MACHINE_HAS_VX)
    lc->vector_save_area_addr =
    (unsigned long) &lc->vector_save_area;
    --- a/arch/s390/kernel/smp.c
    +++ b/arch/s390/kernel/smp.c
    @@ -253,7 +253,9 @@ static void pcpu_prepare_secondary(struc
    __ctl_store(lc->cregs_save_area, 0, 15);
    save_access_regs((unsigned int *) lc->access_regs_save_area);
    memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
    - MAX_FACILITY_BIT/8);
    + sizeof(lc->stfle_fac_list));
    + memcpy(lc->alt_stfle_fac_list, S390_lowcore.alt_stfle_fac_list,
    + sizeof(lc->alt_stfle_fac_list));
    }

    static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)

    \
     
     \ /
      Last update: 2018-04-27 17:15    [W:4.096 / U:0.812 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site