On Fri, 10 Nov 2017 00:20:10 +0100, Arnd Bergmann wrote:
On Thu, Nov 9, 2017 at 7:11 PM, Takashi Iwai tiwai@suse.de wrote:
On Thu, 09 Nov 2017 18:01:47 +0100, Arnd Bergmann wrote:
On Thu, Nov 9, 2017 at 5:52 PM, Takashi Iwai tiwai@suse.de wrote:
IOW, is there any macro indicating the 64bit user time_t?
There is a macro defined by the C library, but so far we have not started relying on it in kernel headers, because there is no guarantee that this symbol is visible before sys/time.h has been included, and there are some cases where it's possible to include a kernel header before sys/time.h.
In case of sound/asound.h, that should be no problem since we rely on having seen the definition on 'struct timeval' already today, and that must come from sys/time.h. Then we just need to make sure that all C libraries define the same macro.
Are you sure about the switch()/case problem? I thought that worked in C99, the only problem would be using the macro outside of a function, e.g. as initalizer for a variable
Hmm, OK it seems working.
But, honestly speaking, it's too scaring. I'm OK if it were only in the kernel local code. But it's the API/ABI definition, which is referred by user-space...
A more solid condition would be really appreciated.
I understand your concern here and agree it's really ugly. It did take us many attempts to come up with this trick for other cases, so my initial reaction would be to use the same thing everywhere since I know it works, but we can use #ifdef instead if you prefer that. I think we can use a single #ifdef variant to cover all cases, but I'd have to think about the x32 and x86-32 some more here. With this trick, we can make user space with new glibc use data structures that are compatible with 64-bit kernels and avoid the additional translation helpers:
enum { SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000, SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000, #if (__BITS_PER_LONG == 64) || !defined(__USE_TIME_BITS64)
Yeah, it's definitely better, more understandable!
thanks,
Takashi