Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear "d_subdirs"->i_private

2013-07-29 Thread Steven Rostedt
On Tue, 2013-07-30 at 10:28 +0900, Masami Hiramatsu wrote:
> (2013/07/29 23:21), Oleg Nesterov wrote:
> > On 07/29, Masami Hiramatsu wrote:
> >>
> >> (2013/07/27 2:25), Oleg Nesterov wrote:
> >>> Change remove_event_file_dir() to clear ->i_private for every
> >>> file we are going to remove.
> >>
> >> Oleg, I think this should be done first.
> >>
> >> AFAICS, your former patches depend strongly on this change.
> >> Without this, they don't work as you expected, and it may
> >> prevent git-bisect.
> > 
> > Why?
> > 
> > v2 specially does this in the last change for bisecting/etc.
> > 
> > 1-4 change f_op->read/write to check i_private != NULL but until
> > this final patch i_private == NULL is not possible.
> 
> Ah, OK. So 1-4 changes still remain refcount code, then
> it is safe, just i_private != NULL are added. I misread.

I just ran them all individually applied through my ftrace stress tests.
All passed, thus they are as bisectible as I would like them to be.

-- Steve


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear "d_subdirs"->i_private

2013-07-29 Thread Masami Hiramatsu
(2013/07/29 23:21), Oleg Nesterov wrote:
> On 07/29, Masami Hiramatsu wrote:
>>
>> (2013/07/27 2:25), Oleg Nesterov wrote:
>>> Change remove_event_file_dir() to clear ->i_private for every
>>> file we are going to remove.
>>
>> Oleg, I think this should be done first.
>>
>> AFAICS, your former patches depend strongly on this change.
>> Without this, they don't work as you expected, and it may
>> prevent git-bisect.
> 
> Why?
> 
> v2 specially does this in the last change for bisecting/etc.
> 
> 1-4 change f_op->read/write to check i_private != NULL but until
> this final patch i_private == NULL is not possible.

Ah, OK. So 1-4 changes still remain refcount code, then
it is safe, just i_private != NULL are added. I misread.


>> I see, including this patch also breaks current ftrace.
> 
> Could you clarify?

Yes, let me add reviewed-by tags ;)

Thank you,

-- 
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu...@hitachi.com


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear "d_subdirs"->i_private

2013-07-29 Thread Oleg Nesterov
On 07/29, Masami Hiramatsu wrote:
>
> (2013/07/27 2:25), Oleg Nesterov wrote:
> > Change remove_event_file_dir() to clear ->i_private for every
> > file we are going to remove.
>
> Oleg, I think this should be done first.
>
> AFAICS, your former patches depend strongly on this change.
> Without this, they don't work as you expected, and it may
> prevent git-bisect.

Why?

v2 specially does this in the last change for bisecting/etc.

1-4 change f_op->read/write to check i_private != NULL but until
this final patch i_private == NULL is not possible.

> I see, including this patch also breaks current ftrace.

Could you clarify?

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear "d_subdirs"->i_private

2013-07-29 Thread Masami Hiramatsu
(2013/07/27 2:25), Oleg Nesterov wrote:
> Change remove_event_file_dir() to clear ->i_private for every
> file we are going to remove.

Oleg, I think this should be done first.

AFAICS, your former patches depend strongly on this change.
Without this, they don't work as you expected, and it may
prevent git-bisect.

I see, including this patch also breaks current ftrace.
Thus, IMHO, it would better to make a separate patch which just
nullifies i_private with adding some NULL checks where accessing
i_private to avoid the breakages.

This looks a bit long way round, but it ensures bisecting.

Thank you,

> tracing_open_generic_file() and tracing_release_generic_file()
> can go away, ftrace_enable_fops and ftrace_event_filter_fops()
> use tracing_open_generic() but only to check tracing_disabled.
> 
> This fixes all races with event_remove() or instance_delete().
> f_op->read/write/whatever can never use the freed file/call,
> all event/* files were changed to check and use ->i_private
> under event_mutex.
> 
> Note: this doesn't not fix other problems, event_remove() can
> destroy the active ftrace_event_call, we need more changes but
> those changes are completely orthogonal.
> 
> Signed-off-by: Oleg Nesterov 
> ---
>  kernel/trace/trace_events.c |   41 +
>  1 files changed, 9 insertions(+), 32 deletions(-)
> 
> diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> index 2a4f68a..1112fa0 100644
> --- a/kernel/trace/trace_events.c
> +++ b/kernel/trace/trace_events.c
> @@ -428,42 +428,20 @@ static void *event_file_data(struct file *filp)
>  
>  static void remove_event_file_dir(struct ftrace_event_file *file)
>  {
> + struct dentry *dir = file->dir;
> + struct dentry *child;
> +
> + /* ->i_mutex is not needed, nobody can create/remove a file */
> + list_for_each_entry(child, >d_subdirs, d_u.d_child)
> + child->d_inode->i_private = NULL;
> +
>   list_del(>list);
> - debugfs_remove_recursive(file->dir);
> + debugfs_remove_recursive(dir);
>   remove_subsystem(file->system);
>   kmem_cache_free(file_cachep, file);
>  }
>  
>  /*
> - * Open and update trace_array ref count.
> - * Must have the current trace_array passed to it.
> - */
> -static int tracing_open_generic_file(struct inode *inode, struct file *filp)
> -{
> - struct ftrace_event_file *file = inode->i_private;
> - struct trace_array *tr = file->tr;
> - int ret;
> -
> - if (trace_array_get(tr) < 0)
> - return -ENODEV;
> -
> - ret = tracing_open_generic(inode, filp);
> - if (ret < 0)
> - trace_array_put(tr);
> - return ret;
> -}
> -
> -static int tracing_release_generic_file(struct inode *inode, struct file 
> *filp)
> -{
> - struct ftrace_event_file *file = inode->i_private;
> - struct trace_array *tr = file->tr;
> -
> - trace_array_put(tr);
> -
> - return 0;
> -}
> -
> -/*
>   * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.
>   */
>  static int
> @@ -1277,10 +1255,9 @@ static const struct file_operations 
> ftrace_set_event_fops = {
>  };
>  
>  static const struct file_operations ftrace_enable_fops = {
> - .open = tracing_open_generic_file,
> + .open = tracing_open_generic,
>   .read = event_enable_read,
>   .write = event_enable_write,
> - .release = tracing_release_generic_file,
>   .llseek = default_llseek,
>  };
>  
> 


-- 
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu...@hitachi.com


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear d_subdirs-i_private

2013-07-29 Thread Masami Hiramatsu
(2013/07/27 2:25), Oleg Nesterov wrote:
 Change remove_event_file_dir() to clear -i_private for every
 file we are going to remove.

Oleg, I think this should be done first.

AFAICS, your former patches depend strongly on this change.
Without this, they don't work as you expected, and it may
prevent git-bisect.

I see, including this patch also breaks current ftrace.
Thus, IMHO, it would better to make a separate patch which just
nullifies i_private with adding some NULL checks where accessing
i_private to avoid the breakages.

This looks a bit long way round, but it ensures bisecting.

Thank you,

 tracing_open_generic_file() and tracing_release_generic_file()
 can go away, ftrace_enable_fops and ftrace_event_filter_fops()
 use tracing_open_generic() but only to check tracing_disabled.
 
 This fixes all races with event_remove() or instance_delete().
 f_op-read/write/whatever can never use the freed file/call,
 all event/* files were changed to check and use -i_private
 under event_mutex.
 
 Note: this doesn't not fix other problems, event_remove() can
 destroy the active ftrace_event_call, we need more changes but
 those changes are completely orthogonal.
 
 Signed-off-by: Oleg Nesterov o...@redhat.com
 ---
  kernel/trace/trace_events.c |   41 +
  1 files changed, 9 insertions(+), 32 deletions(-)
 
 diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
 index 2a4f68a..1112fa0 100644
 --- a/kernel/trace/trace_events.c
 +++ b/kernel/trace/trace_events.c
 @@ -428,42 +428,20 @@ static void *event_file_data(struct file *filp)
  
  static void remove_event_file_dir(struct ftrace_event_file *file)
  {
 + struct dentry *dir = file-dir;
 + struct dentry *child;
 +
 + /* -i_mutex is not needed, nobody can create/remove a file */
 + list_for_each_entry(child, dir-d_subdirs, d_u.d_child)
 + child-d_inode-i_private = NULL;
 +
   list_del(file-list);
 - debugfs_remove_recursive(file-dir);
 + debugfs_remove_recursive(dir);
   remove_subsystem(file-system);
   kmem_cache_free(file_cachep, file);
  }
  
  /*
 - * Open and update trace_array ref count.
 - * Must have the current trace_array passed to it.
 - */
 -static int tracing_open_generic_file(struct inode *inode, struct file *filp)
 -{
 - struct ftrace_event_file *file = inode-i_private;
 - struct trace_array *tr = file-tr;
 - int ret;
 -
 - if (trace_array_get(tr)  0)
 - return -ENODEV;
 -
 - ret = tracing_open_generic(inode, filp);
 - if (ret  0)
 - trace_array_put(tr);
 - return ret;
 -}
 -
 -static int tracing_release_generic_file(struct inode *inode, struct file 
 *filp)
 -{
 - struct ftrace_event_file *file = inode-i_private;
 - struct trace_array *tr = file-tr;
 -
 - trace_array_put(tr);
 -
 - return 0;
 -}
 -
 -/*
   * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.
   */
  static int
 @@ -1277,10 +1255,9 @@ static const struct file_operations 
 ftrace_set_event_fops = {
  };
  
  static const struct file_operations ftrace_enable_fops = {
 - .open = tracing_open_generic_file,
 + .open = tracing_open_generic,
   .read = event_enable_read,
   .write = event_enable_write,
 - .release = tracing_release_generic_file,
   .llseek = default_llseek,
  };
  
 


-- 
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu...@hitachi.com


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear d_subdirs-i_private

2013-07-29 Thread Oleg Nesterov
On 07/29, Masami Hiramatsu wrote:

 (2013/07/27 2:25), Oleg Nesterov wrote:
  Change remove_event_file_dir() to clear -i_private for every
  file we are going to remove.

 Oleg, I think this should be done first.

 AFAICS, your former patches depend strongly on this change.
 Without this, they don't work as you expected, and it may
 prevent git-bisect.

Why?

v2 specially does this in the last change for bisecting/etc.

1-4 change f_op-read/write to check i_private != NULL but until
this final patch i_private == NULL is not possible.

 I see, including this patch also breaks current ftrace.

Could you clarify?

Oleg.

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear d_subdirs-i_private

2013-07-29 Thread Masami Hiramatsu
(2013/07/29 23:21), Oleg Nesterov wrote:
 On 07/29, Masami Hiramatsu wrote:

 (2013/07/27 2:25), Oleg Nesterov wrote:
 Change remove_event_file_dir() to clear -i_private for every
 file we are going to remove.

 Oleg, I think this should be done first.

 AFAICS, your former patches depend strongly on this change.
 Without this, they don't work as you expected, and it may
 prevent git-bisect.
 
 Why?
 
 v2 specially does this in the last change for bisecting/etc.
 
 1-4 change f_op-read/write to check i_private != NULL but until
 this final patch i_private == NULL is not possible.

Ah, OK. So 1-4 changes still remain refcount code, then
it is safe, just i_private != NULL are added. I misread.


 I see, including this patch also breaks current ftrace.
 
 Could you clarify?

Yes, let me add reviewed-by tags ;)

Thank you,

-- 
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu...@hitachi.com


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear d_subdirs-i_private

2013-07-29 Thread Steven Rostedt
On Tue, 2013-07-30 at 10:28 +0900, Masami Hiramatsu wrote:
 (2013/07/29 23:21), Oleg Nesterov wrote:
  On 07/29, Masami Hiramatsu wrote:
 
  (2013/07/27 2:25), Oleg Nesterov wrote:
  Change remove_event_file_dir() to clear -i_private for every
  file we are going to remove.
 
  Oleg, I think this should be done first.
 
  AFAICS, your former patches depend strongly on this change.
  Without this, they don't work as you expected, and it may
  prevent git-bisect.
  
  Why?
  
  v2 specially does this in the last change for bisecting/etc.
  
  1-4 change f_op-read/write to check i_private != NULL but until
  this final patch i_private == NULL is not possible.
 
 Ah, OK. So 1-4 changes still remain refcount code, then
 it is safe, just i_private != NULL are added. I misread.

I just ran them all individually applied through my ftrace stress tests.
All passed, thus they are as bisectible as I would like them to be.

-- Steve


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear "d_subdirs"->i_private

2013-07-26 Thread Oleg Nesterov
Change remove_event_file_dir() to clear ->i_private for every
file we are going to remove.

tracing_open_generic_file() and tracing_release_generic_file()
can go away, ftrace_enable_fops and ftrace_event_filter_fops()
use tracing_open_generic() but only to check tracing_disabled.

This fixes all races with event_remove() or instance_delete().
f_op->read/write/whatever can never use the freed file/call,
all event/* files were changed to check and use ->i_private
under event_mutex.

Note: this doesn't not fix other problems, event_remove() can
destroy the active ftrace_event_call, we need more changes but
those changes are completely orthogonal.

Signed-off-by: Oleg Nesterov 
---
 kernel/trace/trace_events.c |   41 +
 1 files changed, 9 insertions(+), 32 deletions(-)

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 2a4f68a..1112fa0 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -428,42 +428,20 @@ static void *event_file_data(struct file *filp)
 
 static void remove_event_file_dir(struct ftrace_event_file *file)
 {
+   struct dentry *dir = file->dir;
+   struct dentry *child;
+
+   /* ->i_mutex is not needed, nobody can create/remove a file */
+   list_for_each_entry(child, >d_subdirs, d_u.d_child)
+   child->d_inode->i_private = NULL;
+
list_del(>list);
-   debugfs_remove_recursive(file->dir);
+   debugfs_remove_recursive(dir);
remove_subsystem(file->system);
kmem_cache_free(file_cachep, file);
 }
 
 /*
- * Open and update trace_array ref count.
- * Must have the current trace_array passed to it.
- */
-static int tracing_open_generic_file(struct inode *inode, struct file *filp)
-{
-   struct ftrace_event_file *file = inode->i_private;
-   struct trace_array *tr = file->tr;
-   int ret;
-
-   if (trace_array_get(tr) < 0)
-   return -ENODEV;
-
-   ret = tracing_open_generic(inode, filp);
-   if (ret < 0)
-   trace_array_put(tr);
-   return ret;
-}
-
-static int tracing_release_generic_file(struct inode *inode, struct file *filp)
-{
-   struct ftrace_event_file *file = inode->i_private;
-   struct trace_array *tr = file->tr;
-
-   trace_array_put(tr);
-
-   return 0;
-}
-
-/*
  * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.
  */
 static int
@@ -1277,10 +1255,9 @@ static const struct file_operations 
ftrace_set_event_fops = {
 };
 
 static const struct file_operations ftrace_enable_fops = {
-   .open = tracing_open_generic_file,
+   .open = tracing_open_generic,
.read = event_enable_read,
.write = event_enable_write,
-   .release = tracing_release_generic_file,
.llseek = default_llseek,
 };
 
-- 
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 6/6] tracing: Change remove_event_file_dir() to clear d_subdirs-i_private

2013-07-26 Thread Oleg Nesterov
Change remove_event_file_dir() to clear -i_private for every
file we are going to remove.

tracing_open_generic_file() and tracing_release_generic_file()
can go away, ftrace_enable_fops and ftrace_event_filter_fops()
use tracing_open_generic() but only to check tracing_disabled.

This fixes all races with event_remove() or instance_delete().
f_op-read/write/whatever can never use the freed file/call,
all event/* files were changed to check and use -i_private
under event_mutex.

Note: this doesn't not fix other problems, event_remove() can
destroy the active ftrace_event_call, we need more changes but
those changes are completely orthogonal.

Signed-off-by: Oleg Nesterov o...@redhat.com
---
 kernel/trace/trace_events.c |   41 +
 1 files changed, 9 insertions(+), 32 deletions(-)

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 2a4f68a..1112fa0 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -428,42 +428,20 @@ static void *event_file_data(struct file *filp)
 
 static void remove_event_file_dir(struct ftrace_event_file *file)
 {
+   struct dentry *dir = file-dir;
+   struct dentry *child;
+
+   /* -i_mutex is not needed, nobody can create/remove a file */
+   list_for_each_entry(child, dir-d_subdirs, d_u.d_child)
+   child-d_inode-i_private = NULL;
+
list_del(file-list);
-   debugfs_remove_recursive(file-dir);
+   debugfs_remove_recursive(dir);
remove_subsystem(file-system);
kmem_cache_free(file_cachep, file);
 }
 
 /*
- * Open and update trace_array ref count.
- * Must have the current trace_array passed to it.
- */
-static int tracing_open_generic_file(struct inode *inode, struct file *filp)
-{
-   struct ftrace_event_file *file = inode-i_private;
-   struct trace_array *tr = file-tr;
-   int ret;
-
-   if (trace_array_get(tr)  0)
-   return -ENODEV;
-
-   ret = tracing_open_generic(inode, filp);
-   if (ret  0)
-   trace_array_put(tr);
-   return ret;
-}
-
-static int tracing_release_generic_file(struct inode *inode, struct file *filp)
-{
-   struct ftrace_event_file *file = inode-i_private;
-   struct trace_array *tr = file-tr;
-
-   trace_array_put(tr);
-
-   return 0;
-}
-
-/*
  * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.
  */
 static int
@@ -1277,10 +1255,9 @@ static const struct file_operations 
ftrace_set_event_fops = {
 };
 
 static const struct file_operations ftrace_enable_fops = {
-   .open = tracing_open_generic_file,
+   .open = tracing_open_generic,
.read = event_enable_read,
.write = event_enable_write,
-   .release = tracing_release_generic_file,
.llseek = default_llseek,
 };
 
-- 
1.5.5.1

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/