Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751962AbdIVH5E (ORCPT ); Fri, 22 Sep 2017 03:57:04 -0400 Received: from mail-io0-f195.google.com ([209.85.223.195]:37276 "EHLO mail-io0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751704AbdIVH5D (ORCPT ); Fri, 22 Sep 2017 03:57:03 -0400 X-Google-Smtp-Source: AOwi7QBufExXVIVi+4PrM9ObTltys/iW6B7l3T+tfKcLpxX/RXSUH0k2tJWiTE4R/Ui9Jd3Hh/ZGT4wLWdbgo88B7Ok= MIME-Version: 1.0 In-Reply-To: References: <1091b589bec6317ea686937060c0f9f9db10651a.1505973912.git.baolin.wang@linaro.org> From: Arnd Bergmann Date: Fri, 22 Sep 2017 09:57:02 +0200 X-Google-Sender-Auth: 1lukcQUYVomM5oFB5TLkwG3W4W8 Message-ID: Subject: Re: [RFC PATCH 7/7] sound: core: Avoid using timespec for struct snd_timer_tread To: Baolin Wang Cc: Jaroslav Kysela , Takashi Iwai , Liam Girdwood , Ingo Molnar , Takashi Sakamoto , SF Markus Elfring , Dan Carpenter , jeeja.kp@intel.com, Vinod Koul , dharageswari.r@intel.com, guneshwor.o.singh@intel.com, Bhumika Goyal , gudishax.kranthikumar@intel.com, Naveen M , hardik.t.shah@intel.com, Arvind Yadav , Fabian Frederick , Mark Brown , Deepa Dinamani , alsa-devel@alsa-project.org, Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2035 Lines: 52 On Fri, Sep 22, 2017 at 5:00 AM, Baolin Wang wrote: > On 21 September 2017 at 21:09, Arnd Bergmann wrote: >> On Thu, Sep 21, 2017 at 8:18 AM, Baolin Wang wrote: >> >>> +static int snd_timer_user_tread(void __user *argp, struct snd_timer_user *tu, >>> + unsigned int cmd) >>> +{ >>> + int __user *p = argp; >>> + int xarg, old_tread; >>> + >>> + if (tu->timeri) /* too late */ >>> + return -EBUSY; >>> + if (get_user(xarg, p)) >>> + return -EFAULT; >>> + >>> + old_tread = tu->tread; >>> +#if __BITS_PER_LONG == 64 >>> + tu->tread = xarg ? 2 : 0; >>> +#ifdef IA32_EMULATION >>> + tu->tread = xarg ? 3 : 0; >>> +#endif >>> +#else >>> + if (cmd == SNDRV_TIMER_IOCTL_TREAD64) >>> + tu->tread = xarg ? 2 : 0; >>> + else >>> + tu->tread = xarg ? 1 : 0; >>> +#endif >> >> The 64-bit case looks broken here: >> >> - The tread flag is different for compat and native mode, so you >> must pass a flag to identify whether you are called from >> __snd_timer_user_ioctl or from snd_timer_user_ioctl_compat(). > > I have some confusion here. For 64-bit, we will set tu->tread = 2 no > matter it is native mode or compat mode, only we will set tu->tread = > 3 for x86_32 in compat mode, right? > So I think we do not need to identify whether called from native mode > or compat mode. When we have a user space program with 32-bit time_t in compat mode (i.e. cmd==SNDRV_TIMER_IOCTL_TREAD) on a 64-bit kernel, we want to set tread=1, and that is different from the native mode that wants to set tread=2. For determining whether to use tread=2 or tread=3, we have to check both compat mode and x32 mode. This could be done by checking for "if (IS_ENABLED(CONFIG_IA32_EMULATION) && in_compat_syscall() && is_x32_task())", but the in_compat_syscall() check can be skipped when you know that you were called from .compat_ioct(). Arnd