lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 762/879] s390/stp: clock_delta should be signed
    Date
    From: Sven Schnelle <svens@linux.ibm.com>

    commit 5ace65ebb5ce9fe1cc8fdbdd97079fb566ef0ea4 upstream.

    clock_delta is declared as unsigned long in various places. However,
    the clock sync delta can be negative. This would add a huge positive
    offset in clock_sync_global where clock_delta is added to clk.eitod
    which is a 72 bit integer. Declare it as signed long to fix this.

    Cc: stable@vger.kernel.org
    Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/s390/include/asm/cio.h | 2 +-
    arch/s390/kernel/time.c | 8 ++++----
    drivers/s390/cio/chsc.c | 4 ++--
    3 files changed, 7 insertions(+), 7 deletions(-)

    --- a/arch/s390/include/asm/cio.h
    +++ b/arch/s390/include/asm/cio.h
    @@ -369,7 +369,7 @@ void cio_gp_dma_destroy(struct gen_pool
    struct gen_pool *cio_gp_dma_create(struct device *dma_dev, int nr_pages);

    /* Function from drivers/s390/cio/chsc.c */
    -int chsc_sstpc(void *page, unsigned int op, u16 ctrl, u64 *clock_delta);
    +int chsc_sstpc(void *page, unsigned int op, u16 ctrl, long *clock_delta);
    int chsc_sstpi(void *page, void *result, size_t size);
    int chsc_stzi(void *page, void *result, size_t size);
    int chsc_sgib(u32 origin);
    --- a/arch/s390/kernel/time.c
    +++ b/arch/s390/kernel/time.c
    @@ -364,7 +364,7 @@ static inline int check_sync_clock(void)
    * Apply clock delta to the global data structures.
    * This is called once on the CPU that performed the clock sync.
    */
    -static void clock_sync_global(unsigned long delta)
    +static void clock_sync_global(long delta)
    {
    unsigned long now, adj;
    struct ptff_qto qto;
    @@ -400,7 +400,7 @@ static void clock_sync_global(unsigned l
    * Apply clock delta to the per-CPU data structures of this CPU.
    * This is called for each online CPU after the call to clock_sync_global.
    */
    -static void clock_sync_local(unsigned long delta)
    +static void clock_sync_local(long delta)
    {
    /* Add the delta to the clock comparator. */
    if (S390_lowcore.clock_comparator != clock_comparator_max) {
    @@ -424,7 +424,7 @@ static void __init time_init_wq(void)
    struct clock_sync_data {
    atomic_t cpus;
    int in_sync;
    - unsigned long clock_delta;
    + long clock_delta;
    };

    /*
    @@ -544,7 +544,7 @@ static int stpinfo_valid(void)
    static int stp_sync_clock(void *data)
    {
    struct clock_sync_data *sync = data;
    - u64 clock_delta, flags;
    + long clock_delta, flags;
    static int first;
    int rc;

    --- a/drivers/s390/cio/chsc.c
    +++ b/drivers/s390/cio/chsc.c
    @@ -1255,7 +1255,7 @@ exit:
    EXPORT_SYMBOL_GPL(css_general_characteristics);
    EXPORT_SYMBOL_GPL(css_chsc_characteristics);

    -int chsc_sstpc(void *page, unsigned int op, u16 ctrl, u64 *clock_delta)
    +int chsc_sstpc(void *page, unsigned int op, u16 ctrl, long *clock_delta)
    {
    struct {
    struct chsc_header request;
    @@ -1266,7 +1266,7 @@ int chsc_sstpc(void *page, unsigned int
    unsigned int rsvd2[5];
    struct chsc_header response;
    unsigned int rsvd3[3];
    - u64 clock_delta;
    + s64 clock_delta;
    unsigned int rsvd4[2];
    } *rr;
    int rc;

    \
     
     \ /
      Last update: 2022-06-08 03:43    [W:2.096 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site