Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp3811946ybc; Thu, 14 Nov 2019 15:05:44 -0800 (PST) X-Google-Smtp-Source: APXvYqzqLnTRt2FQT+X5igsoBVWIQ1Vpw5nZUWIlbiy7zcQU0pwwdxIL/6+sfl29PQUqc3mCpOjD X-Received: by 2002:adf:ec42:: with SMTP id w2mr6570131wrn.32.1573772744852; Thu, 14 Nov 2019 15:05:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573772744; cv=none; d=google.com; s=arc-20160816; b=FPi0ihdRBto7QnCkl5UyFFe/nRUEdmDsDX5O4fDlCVfTkhWvpp3bm266eOp3B+g4r3 dzSHI91XobYVTWJpP2ebEOW6xiVEHcjR8/yxIbBxsbQRW4KzpPZeaj6fncETrsSn4nKe KvxDyeYo+TdcgHYEBgQ/YRxTniBgf4OZxHA6qaK368KPoUGKXNbUsYdDd2IwQ9Of9m8+ awnV09Eg62V4vzWMvCtj/zlhg0ToceOuLzkGOpbjlM/3k9q1zjoFBCHA4TXC1jk3WAMJ xcl+1WsLlBv8szCKtxmpxgRcmCq1EyGbV7I51cOBfSrzQNE2zne6lWrBC1xAO4dj47LU uYMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=+WgT5Q3HHhQdCUcfI5uxkWBbqKa2O/MldQW0CGmuwAs=; b=YeEY9Ab+mhCoMLpe3NnZD5fUV6dH/aCCued88bsNHbvo8U2AyT3od3Sm6NcGThHsGD BwBvVp31JO/rDP+bj6X0ULHlgmqOB0irLNZmswanQPZfaD7FsEcSuN7XILKv+E7k63IP waI1UY8JVvVNWjx5TDwWHxiowD9ewoCohQveblXfqNlH/YM1Ts3LZiMymgRXtwZmhHrr zKYSAJoNjhI1zUkBInpb4ROJWjRcH4ChdElQVOvS6O06r9u6oP80lAAkBr1Qj7Z5ImRC WIFApyUTrp5sx7Vj746+tTg2HM5kfll3LHgHHt5/vgY4Tun92WDOesF+AarG6HqX+5bI pIpw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w25si4786166edl.418.2019.11.14.15.05.19; Thu, 14 Nov 2019 15:05:44 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727224AbfKNXBk (ORCPT + 99 others); Thu, 14 Nov 2019 18:01:40 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:42315 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726319AbfKNXBj (ORCPT ); Thu, 14 Nov 2019 18:01:39 -0500 Received: by mail-wr1-f67.google.com with SMTP id a15so8761065wrf.9; Thu, 14 Nov 2019 15:01:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=+WgT5Q3HHhQdCUcfI5uxkWBbqKa2O/MldQW0CGmuwAs=; b=JjXkDFEhSuIvqvjC4U1tk7VpSYQr83RQY3WAsYFaduW/u8J6LjaE8r5M5JDVxyw6eS dhu6w7LMu/9T4OH62ADHwxRROfR3fCGlBxsn5sRnJYZvvWyifpCGyXGJZUdI/rtcUgDG q617JZ0iyt4cZlwQB0kNY8uV7cmWsPrDP9LOP8KjIrah5wib+BkfXVJM/j0CcBIFhD89 wdjfzhCIdTwGI4dqHPvoXuLkjwPbwDOr+imx4de5jhTqp1u3CdRImcEBqLMCfMwAxhGv MJkBz9ppoagecmwqQyzfRWGKZrg5LSPLRUk9PTUyRWJO3s3A1FtR7Yq3zD1hZkozTQjn mtTg== X-Gm-Message-State: APjAAAWsOO9N4H32vPWqBmcsELSbjaeQNyWEpwGhCKQw9JNuXwFHqPUh 7llVVvxdOQOqL0QQerRzvKw= X-Received: by 2002:a5d:4ecd:: with SMTP id s13mr5161428wrv.216.1573772496547; Thu, 14 Nov 2019 15:01:36 -0800 (PST) Received: from ryzen.lan ([81.196.112.181]) by smtp.gmail.com with ESMTPSA id p4sm9300216wrx.71.2019.11.14.15.01.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Nov 2019 15:01:35 -0800 (PST) Date: Fri, 15 Nov 2019 01:01:27 +0200 From: Abel Vesa To: Arnd Bergmann Cc: y2038@lists.linaro.org, John Stultz , Thomas Gleixner , linux-kernel@vger.kernel.org, Stephen Boyd , David Howells , Al Viro , Deepa Dinamani , Christian Brauner , Jens Axboe , Ingo Molnar , Corey Minyard , zhengbin , Li RongQing , linux-api@vger.kernel.org Subject: Re: [PATCH 17/23] y2038: time: avoid timespec usage in settimeofday() Message-ID: <20191114230127.GA3580@ryzen.lan> References: <20191108210236.1296047-1-arnd@arndb.de> <20191108211323.1806194-8-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191108211323.1806194-8-arnd@arndb.de> User-Agent: Mutt/1.12.1 (2019-06-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 19-11-08 22:12:16, Arnd Bergmann wrote: > The compat_get_timeval() and timeval_valid() interfaces > are deprecated and getting removed along with the definition > of struct timeval itself. > > Change the two implementations of the settimeofday() > system call to open-code these helpers and completely > avoid references to timeval. > I get the following rcu stalls due to this patch on riscv64 (on qemu): [root@riscv ~]# uname -a Linux riscv 5.4.0-rc6-00018-gadde74306a4b #112 SMP Fri Nov 15 00:46:20 EET 2019 riscv64 riscv64 riscv64 GNU/Linux [root@riscv ~]# [ 420.135710] rcu: INFO: rcu_sched self-detected stall on CPU [ 420.136839] rcu: 3-....: (99702 ticks this GP) idle=482/1/0x4000000000000002 softirq=3322/3322 fqs=48784 [ 420.138917] (t=99768 jiffies g=4985 q=8343) [ 420.139772] Task dump for CPU 3: [ 420.140236] rdate R running task 0 254 1 0x00000008 [ 420.142226] Call Trace: [ 420.142791] [] walk_stackframe+0x0/0xa6 [ 420.143911] [] show_stack+0x2a/0x34 [ 420.145010] [] sched_show_task+0xf0/0x116 [ 420.145996] [] dump_cpu_task+0x3e/0x48 [ 420.147073] [] rcu_dump_cpu_stacks+0x7c/0xb4 [ 420.148243] [] rcu_sched_clock_irq+0x3d6/0x582 [ 420.149349] [] update_process_times+0x1e/0x42 [ 420.150306] [] tick_sched_handle.isra.0+0x2a/0x3a [ 420.150997] [] tick_sched_timer+0x4e/0x92 [ 420.151603] [] __hrtimer_run_queues+0xae/0x108 [ 420.152639] [] hrtimer_interrupt+0xca/0x1d4 [ 420.153629] [] riscv_timer_interrupt+0x32/0x3a [ 420.154629] [] do_IRQ+0xa4/0xb8 [ 420.155294] [] ret_from_exception+0x0/0xc [ 420.156073] [] ret_from_exception+0x0/0xc [ 451.556189] rcu: INFO: rcu_sched detected expedited stalls on CPUs/tasks: { 3-... } 100725 jiffies s: 53 root: 0x8/. [ 451.558689] rcu: blocking rcu_node structures: [ 451.559501] Task dump for CPU 3: [ 451.560518] rdate R running task 0 254 1 0x00000008 [ 451.561396] Call Trace: [ 451.561675] [] __schedule+0x158/0x36a [ 483.147733] rcu: INFO: rcu_sched self-detected stall on CPU [ 483.148723] rcu: 3-....: (115448 ticks this GP) idle=482/1/0x4000000000000002 softirq=3322/3322 fqs=56510 [ 483.150220] (t=115521 jiffies g=4985 q=8400) [ 483.150885] Task dump for CPU 3: [ 483.151392] rdate R running task 0 254 1 0x00000008 [ 483.152321] Call Trace: [ 483.152755] [] walk_stackframe+0x0/0xa6 [ 483.153600] [] show_stack+0x2a/0x34 [ 483.154428] [] sched_show_task+0xf0/0x116 [ 483.155325] [] dump_cpu_task+0x3e/0x48 [ 483.156199] [] rcu_dump_cpu_stacks+0x7c/0xb4 [ 483.157163] [] rcu_sched_clock_irq+0x3d6/0x582 [ 483.158166] [] update_process_times+0x1e/0x42 [ 483.159257] [] tick_sched_handle.isra.0+0x2a/0x3a [ 483.160240] [] tick_sched_timer+0x4e/0x92 [ 483.160992] [] __hrtimer_run_queues+0xae/0x108 [ 483.161881] [] hrtimer_interrupt+0xca/0x1d4 [ 483.162778] [] riscv_timer_interrupt+0x32/0x3a [ 483.163542] [] do_IRQ+0xa4/0xb8 [ 483.164241] [] ret_from_exception+0x0/0xc [ 483.165108] [] ret_from_exception+0x0/0xc [ 515.044254] rcu: INFO: rcu_sched detected expedited stalls on CPUs/tasks: { 3-... } 116597 jiffies s: 53 root: 0x8/. [ 515.046221] rcu: blocking rcu_node structures: [ 515.046799] Task dump for CPU 3: [ 515.047180] rdate R running task 0 254 1 0x00000008 [ 515.048476] Call Trace: [ 515.048895] [] __schedule+0x158/0x36a I will dig up some more into this tomorrow since it's way past by midnight here. > Signed-off-by: Arnd Bergmann > --- > include/linux/syscalls.h | 2 +- > kernel/time/time.c | 20 +++++++++----------- > 2 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h > index e665920fa359..d0391cc2dae9 100644 > --- a/include/linux/syscalls.h > +++ b/include/linux/syscalls.h > @@ -734,7 +734,7 @@ asmlinkage long sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct g > /* kernel/time.c */ > asmlinkage long sys_gettimeofday(struct __kernel_old_timeval __user *tv, > struct timezone __user *tz); > -asmlinkage long sys_settimeofday(struct timeval __user *tv, > +asmlinkage long sys_settimeofday(struct __kernel_old_timeval __user *tv, > struct timezone __user *tz); > asmlinkage long sys_adjtimex(struct __kernel_timex __user *txc_p); > asmlinkage long sys_adjtimex_time32(struct old_timex32 __user *txc_p); > diff --git a/kernel/time/time.c b/kernel/time/time.c > index bc114f0be8f1..6bfbe640fd3b 100644 > --- a/kernel/time/time.c > +++ b/kernel/time/time.c > @@ -196,22 +196,21 @@ int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz > return 0; > } > > -SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, > +SYSCALL_DEFINE2(settimeofday, struct __kernel_old_timeval __user *, tv, > struct timezone __user *, tz) > { > struct timespec64 new_ts; > - struct timeval user_tv; > struct timezone new_tz; > > if (tv) { > - if (copy_from_user(&user_tv, tv, sizeof(*tv))) > + if (get_user(new_ts.tv_sec, &tv->tv_sec) || > + get_user(new_ts.tv_nsec, &tv->tv_usec)) > return -EFAULT; > > - if (!timeval_valid(&user_tv)) > + if (tv->tv_usec > USEC_PER_SEC) > return -EINVAL; > > - new_ts.tv_sec = user_tv.tv_sec; > - new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; > + new_ts.tv_nsec *= NSEC_PER_USEC; > } > if (tz) { > if (copy_from_user(&new_tz, tz, sizeof(*tz))) > @@ -245,18 +244,17 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv, > struct timezone __user *, tz) > { > struct timespec64 new_ts; > - struct timeval user_tv; > struct timezone new_tz; > > if (tv) { > - if (compat_get_timeval(&user_tv, tv)) > + if (get_user(new_ts.tv_sec, &tv->tv_sec) || > + get_user(new_ts.tv_nsec, &tv->tv_usec)) > return -EFAULT; > > - if (!timeval_valid(&user_tv)) > + if (new_ts.tv_nsec > USEC_PER_SEC) > return -EINVAL; > > - new_ts.tv_sec = user_tv.tv_sec; > - new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; > + new_ts.tv_nsec *= NSEC_PER_USEC; > } > if (tz) { > if (copy_from_user(&new_tz, tz, sizeof(*tz))) > -- > 2.20.0 >