Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751900AbdIVIi5 (ORCPT ); Fri, 22 Sep 2017 04:38:57 -0400 Received: from mail-io0-f177.google.com ([209.85.223.177]:52319 "EHLO mail-io0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751792AbdIVIiz (ORCPT ); Fri, 22 Sep 2017 04:38:55 -0400 X-Google-Smtp-Source: AOwi7QDP6xKsN/IM0NdAXInU5O8tIE3eoM/XWrGFzzulMrcYaa/aT+txqfL83kX3F9GSfvh9666ucAUnylYdbPNu7ek= MIME-Version: 1.0 In-Reply-To: References: <1091b589bec6317ea686937060c0f9f9db10651a.1505973912.git.baolin.wang@linaro.org> From: Baolin Wang Date: Fri, 22 Sep 2017 16:38:54 +0800 Message-ID: Subject: Re: [RFC PATCH 7/7] sound: core: Avoid using timespec for struct snd_timer_tread To: Arnd Bergmann 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: 2242 Lines: 60 On 22 September 2017 at 15:57, Arnd Bergmann wrote: > 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. I understand your meaning now, thanks for explanation. > > 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(). OK. -- Baolin.wang Best Regards