linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* PERF_EVENT_IOC_SET_FILTER has different values based on bitness
@ 2014-10-07 23:07 David Ahern
  2014-10-07 23:17 ` David Ahern
  2014-10-08  7:23 ` Peter Zijlstra
  0 siblings, 2 replies; 10+ messages in thread
From: David Ahern @ 2014-10-07 23:07 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker,
	Arnaldo Carvalho de Melo, LKML, Jiri Olsa


32-bit perf binaries are not able to set filters on 64-bit kernels.

    $ perf record -e  net:netif_receive_skb --filter 'name == "eth1"
    Error: failed to set filter with 25 (Inappropriate ioctl for device)

The reason is that the definition of PERF_EVENT_IOC_SET_FILTER contains 
a pointer:

#define PERF_EVENT_IOC_SET_FILTER       _IOW('$', 6, char *)

the size of which of course differs for 32-bit and 64-bit. This has been 
there since the original commit (6fb2915df7f07) back in 2009.

Thoughts on how to fix this? Changing the definition of SET_FILTER 
breaks existing setups so that rules it out. What about something like this:

#define PERF_EVENT_IOC_SET_FILTER_32       _IOW('$', 6, u32)

and then

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 963bf139e2b2..c805132ac1cf 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3714,6 +3714,7 @@ static long perf_ioctl(struct file *file, unsigned 
int cmd, unsigned long arg)
     }

     case PERF_EVENT_IOC_SET_FILTER:
+   case PERF_EVENT_IOC_SET_FILTER_32:
         return perf_event_set_filter(event, (void __user *)arg);

     default:

David

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-07 23:07 PERF_EVENT_IOC_SET_FILTER has different values based on bitness David Ahern
@ 2014-10-07 23:17 ` David Ahern
  2014-10-08  0:50   ` Andi Kleen
  2014-10-08  7:23 ` Peter Zijlstra
  1 sibling, 1 reply; 10+ messages in thread
From: David Ahern @ 2014-10-07 23:17 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker,
	Arnaldo Carvalho de Melo, LKML, Jiri Olsa

On 10/7/14, 5:07 PM, David Ahern wrote:
>
> 32-bit perf binaries are not able to set filters on 64-bit kernels.
>
>     $ perf record -e  net:netif_receive_skb --filter 'name == "eth1"
>     Error: failed to set filter with 25 (Inappropriate ioctl for device)
>
> The reason is that the definition of PERF_EVENT_IOC_SET_FILTER contains
> a pointer:
>
> #define PERF_EVENT_IOC_SET_FILTER       _IOW('$', 6, char *)
>
> the size of which of course differs for 32-bit and 64-bit. This has been
> there since the original commit (6fb2915df7f07) back in 2009.
>
> Thoughts on how to fix this? Changing the definition of SET_FILTER
> breaks existing setups so that rules it out. What about something like
> this:
>
> #define PERF_EVENT_IOC_SET_FILTER_32       _IOW('$', 6, u32)
>
> and then
>
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 963bf139e2b2..c805132ac1cf 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -3714,6 +3714,7 @@ static long perf_ioctl(struct file *file, unsigned
> int cmd, unsigned long arg)
>      }
>
>      case PERF_EVENT_IOC_SET_FILTER:
> +   case PERF_EVENT_IOC_SET_FILTER_32:
>          return perf_event_set_filter(event, (void __user *)arg);
>
>      default:
>

Oh, PERF_EVENT_IOC_ID has the same problem:

#define PERF_EVENT_IOC_ID               _IOR('$', 7, __u64 *)

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-07 23:17 ` David Ahern
@ 2014-10-08  0:50   ` Andi Kleen
  2014-10-08  0:53     ` David Ahern
  0 siblings, 1 reply; 10+ messages in thread
From: Andi Kleen @ 2014-10-08  0:50 UTC (permalink / raw)
  To: David Ahern
  Cc: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker,
	Arnaldo Carvalho de Melo, LKML, Jiri Olsa

David Ahern <dsahern@gmail.com> writes:
>>
>> diff --git a/kernel/events/core.c b/kernel/events/core.c
>> index 963bf139e2b2..c805132ac1cf 100644
>> --- a/kernel/events/core.c
>> +++ b/kernel/events/core.c
>> @@ -3714,6 +3714,7 @@ static long perf_ioctl(struct file *file, unsigned
>> int cmd, unsigned long arg)
>>      }
>>
>>      case PERF_EVENT_IOC_SET_FILTER:
>> +   case PERF_EVENT_IOC_SET_FILTER_32:
>>          return perf_event_set_filter(event, (void __user *)arg);
>>
>>      default:
>>
>
> Oh, PERF_EVENT_IOC_ID has the same problem:
>
> #define PERF_EVENT_IOC_ID               _IOR('$', 7, __u64 *)

The right way is to add a compat_perf_ioctl() 

-Andi

-- 
ak@linux.intel.com -- Speaking for myself only

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08  0:50   ` Andi Kleen
@ 2014-10-08  0:53     ` David Ahern
  2014-10-08  0:54       ` Andi Kleen
  0 siblings, 1 reply; 10+ messages in thread
From: David Ahern @ 2014-10-08  0:53 UTC (permalink / raw)
  To: Andi Kleen
  Cc: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker,
	Arnaldo Carvalho de Melo, LKML, Jiri Olsa

On 10/7/14, 6:50 PM, Andi Kleen wrote:
> David Ahern <dsahern@gmail.com> writes:
>>>
>>> diff --git a/kernel/events/core.c b/kernel/events/core.c
>>> index 963bf139e2b2..c805132ac1cf 100644
>>> --- a/kernel/events/core.c
>>> +++ b/kernel/events/core.c
>>> @@ -3714,6 +3714,7 @@ static long perf_ioctl(struct file *file, unsigned
>>> int cmd, unsigned long arg)
>>>       }
>>>
>>>       case PERF_EVENT_IOC_SET_FILTER:
>>> +   case PERF_EVENT_IOC_SET_FILTER_32:
>>>           return perf_event_set_filter(event, (void __user *)arg);
>>>
>>>       default:
>>>
>>
>> Oh, PERF_EVENT_IOC_ID has the same problem:
>>
>> #define PERF_EVENT_IOC_ID               _IOR('$', 7, __u64 *)
>
> The right way is to add a compat_perf_ioctl()

Sure, looked into that way as well. But SET_FILTER and IOC_ID will still 
compile to the same values for a 64-bit kernel.

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08  0:53     ` David Ahern
@ 2014-10-08  0:54       ` Andi Kleen
  0 siblings, 0 replies; 10+ messages in thread
From: Andi Kleen @ 2014-10-08  0:54 UTC (permalink / raw)
  To: David Ahern
  Cc: Ingo Molnar, Peter Zijlstra, Frederic Weisbecker,
	Arnaldo Carvalho de Melo, LKML, Jiri Olsa

David Ahern <dsahern@gmail.com> writes:

> On 10/7/14, 6:50 PM, Andi Kleen wrote:
>> David Ahern <dsahern@gmail.com> writes:
>>>>
>>>> diff --git a/kernel/events/core.c b/kernel/events/core.c
>>>> index 963bf139e2b2..c805132ac1cf 100644
>>>> --- a/kernel/events/core.c
>>>> +++ b/kernel/events/core.c
>>>> @@ -3714,6 +3714,7 @@ static long perf_ioctl(struct file *file, unsigned
>>>> int cmd, unsigned long arg)
>>>>       }
>>>>
>>>>       case PERF_EVENT_IOC_SET_FILTER:
>>>> +   case PERF_EVENT_IOC_SET_FILTER_32:
>>>>           return perf_event_set_filter(event, (void __user *)arg);
>>>>
>>>>       default:
>>>>
>>>
>>> Oh, PERF_EVENT_IOC_ID has the same problem:
>>>
>>> #define PERF_EVENT_IOC_ID               _IOR('$', 7, __u64 *)
>>
>> The right way is to add a compat_perf_ioctl()
>
> Sure, looked into that way as well. But SET_FILTER and IOC_ID will
> still compile to the same values for a 64-bit kernel.

Sure you have to add/use the new defines too.

-Andi
-- 
ak@linux.intel.com -- Speaking for myself only

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-07 23:07 PERF_EVENT_IOC_SET_FILTER has different values based on bitness David Ahern
  2014-10-07 23:17 ` David Ahern
@ 2014-10-08  7:23 ` Peter Zijlstra
  2014-10-08 15:17   ` David Ahern
  1 sibling, 1 reply; 10+ messages in thread
From: Peter Zijlstra @ 2014-10-08  7:23 UTC (permalink / raw)
  To: David Ahern
  Cc: Ingo Molnar, Frederic Weisbecker, Arnaldo Carvalho de Melo, LKML,
	Jiri Olsa

On Tue, Oct 07, 2014 at 05:07:36PM -0600, David Ahern wrote:
> 
> 32-bit perf binaries are not able to set filters on 64-bit kernels.
> 
>    $ perf record -e  net:netif_receive_skb --filter 'name == "eth1"
>    Error: failed to set filter with 25 (Inappropriate ioctl for device)
> 
> The reason is that the definition of PERF_EVENT_IOC_SET_FILTER contains a
> pointer:
> 
> #define PERF_EVENT_IOC_SET_FILTER       _IOW('$', 6, char *)
> 
> the size of which of course differs for 32-bit and 64-bit. This has been
> there since the original commit (6fb2915df7f07) back in 2009.
> 

Should be fixed for a while now

---
commit b3f207855f57b9c8f43a547a801340bb5cbc59e5
Author: Pawel Moll <pawel.moll@arm.com>
Date:   Fri Jun 13 16:03:32 2014 +0100

    perf: Handle compat ioctl
    
    When running a 32-bit userspace on a 64-bit kernel (eg. i386
    application on x86_64 kernel or 32-bit arm userspace on arm64
    kernel) some of the perf ioctls must be treated with special
    care, as they have a pointer size encoded in the command.
    
    For example, PERF_EVENT_IOC_ID in 32-bit world will be encoded
    as 0x80042407, but 64-bit kernel will expect 0x80082407. In
    result the ioctl will fail returning -ENOTTY.
    
    This patch solves the problem by adding code fixing up the
    size as compat_ioctl file operation.
    
    Reported-by: Drew Richardson <drew.richardson@arm.com>
    Signed-off-by: Pawel Moll <pawel.moll@arm.com>
    Signed-off-by: Peter Zijlstra <peterz@infradead.org>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Link: http://lkml.kernel.org/r/1402671812-9078-1-git-send-email-pawel.moll@arm.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 1cf24b3e42ec..f9c1ed002dbc 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -41,6 +41,7 @@
 #include <linux/cgroup.h>
 #include <linux/module.h>
 #include <linux/mman.h>
+#include <linux/compat.h>
 
 #include "internal.h"
 
@@ -3717,6 +3718,26 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	return 0;
 }
 
+#ifdef CONFIG_COMPAT
+static long perf_compat_ioctl(struct file *file, unsigned int cmd,
+				unsigned long arg)
+{
+	switch (_IOC_NR(cmd)) {
+	case _IOC_NR(PERF_EVENT_IOC_SET_FILTER):
+	case _IOC_NR(PERF_EVENT_IOC_ID):
+		/* Fix up pointer size (usually 4 -> 8 in 32-on-64-bit case */
+		if (_IOC_SIZE(cmd) == sizeof(compat_uptr_t)) {
+			cmd &= ~IOCSIZE_MASK;
+			cmd |= sizeof(void *) << IOCSIZE_SHIFT;
+		}
+		break;
+	}
+	return perf_ioctl(file, cmd, arg);
+}
+#else
+# define perf_compat_ioctl NULL
+#endif
+
 int perf_event_task_enable(void)
 {
 	struct perf_event *event;
@@ -4222,7 +4243,7 @@ static const struct file_operations perf_fops = {
 	.read			= perf_read,
 	.poll			= perf_poll,
 	.unlocked_ioctl		= perf_ioctl,
-	.compat_ioctl		= perf_ioctl,
+	.compat_ioctl		= perf_compat_ioctl,
 	.mmap			= perf_mmap,
 	.fasync			= perf_fasync,
 };

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08  7:23 ` Peter Zijlstra
@ 2014-10-08 15:17   ` David Ahern
  2014-10-08 15:22     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 10+ messages in thread
From: David Ahern @ 2014-10-08 15:17 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Ingo Molnar, Frederic Weisbecker, Arnaldo Carvalho de Melo, LKML,
	Jiri Olsa

On 10/8/14, 1:23 AM, Peter Zijlstra wrote:
> Should be fixed for a while now
>
> ---
> commit b3f207855f57b9c8f43a547a801340bb5cbc59e5
> Author: Pawel Moll <pawel.moll@arm.com>
> Date:   Fri Jun 13 16:03:32 2014 +0100
>
>      perf: Handle compat ioctl
>

that works. Can we get this queued to the stable releases (at least as 
far back as v3.4)?

Thanks,
David

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08 15:17   ` David Ahern
@ 2014-10-08 15:22     ` Arnaldo Carvalho de Melo
  2014-10-08 15:25       ` David Ahern
  0 siblings, 1 reply; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2014-10-08 15:22 UTC (permalink / raw)
  To: David Ahern
  Cc: Peter Zijlstra, Ingo Molnar, Frederic Weisbecker, LKML, Jiri Olsa

Em Wed, Oct 08, 2014 at 09:17:38AM -0600, David Ahern escreveu:
> On 10/8/14, 1:23 AM, Peter Zijlstra wrote:
> >Should be fixed for a while now
> >
> >---
> >commit b3f207855f57b9c8f43a547a801340bb5cbc59e5
> >Author: Pawel Moll <pawel.moll@arm.com>
> >Date:   Fri Jun 13 16:03:32 2014 +0100
> >
> >     perf: Handle compat ioctl
> >
> 
> that works. Can we get this queued to the stable releases (at least as far
> back as v3.4)?

I wonder how that works best, being on the receiving side of such requests
from time to time.

I guess that to scale, that would be better done by:

1. Reporter tests if the patch applies (and works) on the desired
targets.

2. Reporter sends the request, with the above test results, to
stable@kernel.org, following whatever conventions are to get the
attention of the stable release maintainers.

- Arnaldo

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08 15:22     ` Arnaldo Carvalho de Melo
@ 2014-10-08 15:25       ` David Ahern
  2014-10-09  6:54         ` Ingo Molnar
  0 siblings, 1 reply; 10+ messages in thread
From: David Ahern @ 2014-10-08 15:25 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Ingo Molnar, Frederic Weisbecker, LKML, Jiri Olsa

On 10/8/14, 9:22 AM, Arnaldo Carvalho de Melo wrote:
> I wonder how that works best, being on the receiving side of such requests
> from time to time.
>
> I guess that to scale, that would be better done by:
>
> 1. Reporter tests if the patch applies (and works) on the desired
> targets.
>
> 2. Reporter sends the request, with the above test results, to
> stable@kernel.org, following whatever conventions are to get the
> attention of the stable release maintainers.

My understanding is that subsystem maintainers do the stable requests.

A patch adjustment is needed for v3.4 and v3.10. I am willing to do the 
necessary patch mods for 3.4, 3.10, and 3.14.

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: PERF_EVENT_IOC_SET_FILTER has different values based on bitness
  2014-10-08 15:25       ` David Ahern
@ 2014-10-09  6:54         ` Ingo Molnar
  0 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2014-10-09  6:54 UTC (permalink / raw)
  To: David Ahern
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Frederic Weisbecker,
	LKML, Jiri Olsa


* David Ahern <dsahern@gmail.com> wrote:

> On 10/8/14, 9:22 AM, Arnaldo Carvalho de Melo wrote:
> >I wonder how that works best, being on the receiving side of such requests
> >from time to time.
> >
> >I guess that to scale, that would be better done by:
> >
> >1. Reporter tests if the patch applies (and works) on the desired
> >targets.
> >
> >2. Reporter sends the request, with the above test results, to
> >stable@kernel.org, following whatever conventions are to get the
> >attention of the stable release maintainers.
> 
> My understanding is that subsystem maintainers do the stable 
> requests.

At least for perf bits, the usual workflow is that pretty much 
anyone can make requests for backports that we maintainers 
missed, and subsystem maintainers look over them and object if 
they don't like the suggestion. (Obviously you need to Cc: 
maintainers.)

In other words, feel free to forward (tested!) backport commit 
IDs to -stable, with maintainers Cc:-ed, and feel free to provide 
conflict resolution as well, in cases where they don't apply 
cleanly.

> A patch adjustment is needed for v3.4 and v3.10. I am willing 
> to do the necessary patch mods for 3.4, 3.10, and 3.14.

That would be useful.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-10-09  6:54 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-07 23:07 PERF_EVENT_IOC_SET_FILTER has different values based on bitness David Ahern
2014-10-07 23:17 ` David Ahern
2014-10-08  0:50   ` Andi Kleen
2014-10-08  0:53     ` David Ahern
2014-10-08  0:54       ` Andi Kleen
2014-10-08  7:23 ` Peter Zijlstra
2014-10-08 15:17   ` David Ahern
2014-10-08 15:22     ` Arnaldo Carvalho de Melo
2014-10-08 15:25       ` David Ahern
2014-10-09  6:54         ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).