2011-03-17 21:29:38

by Vaibhav Nagarnaik

[permalink] [raw]
Subject: [RFC] tracing: a proc file to automatically release ring buffer memory

All

The current way to release memory from ftrace ring buffer is to:
echo 0 > /sys/kernel/debug/tracing/buffer_size_kb

Consider a scenario where ftrace is handled by a user space
process. Normally, this tracing is done as a low priority task on the
system. Under memory pressure for high priority tasks, tracing should
be turned off and the trace ring buffer memory released. The buffer
allocated is kernel memory and under OOM condition if the user space
process is oom-killed, there is no way to release the ring buffer
memory.

The proposal is to add a proc entry
/sys/kernel/debug/tracing/buffer_free. Its .release() fileops function
executes tracing_stop() and then resizes the global trace buffer to
minimum size (2*BUF_PAGE_SIZE). The user space process opens this file
and keeps it open. When the process gets killed, the fd gets closed
and .release() is called. This automatically stops the tracing and
frees up the ring buffer memory.

It is optional to use this functionality, since it won't affect
tracing for current programs. But it provides a way to automatically
free up memory, if needed. It can also be used on the command line to
stop tracing and free up memory as a single operation as:
echo > /sys/kernel/debug/tracing/buffer_free


Vaibhav Nagarnaik


2011-03-17 21:36:24

by Steven Rostedt

[permalink] [raw]
Subject: Re: [RFC] tracing: a proc file to automatically release ring buffer memory

On Thu, 2011-03-17 at 14:29 -0700, Vaibhav Nagarnaik wrote:
> All
>
> The current way to release memory from ftrace ring buffer is to:
> echo 0 > /sys/kernel/debug/tracing/buffer_size_kb
>
> Consider a scenario where ftrace is handled by a user space
> process. Normally, this tracing is done as a low priority task on the
> system. Under memory pressure for high priority tasks, tracing should
> be turned off and the trace ring buffer memory released. The buffer
> allocated is kernel memory and under OOM condition if the user space
> process is oom-killed, there is no way to release the ring buffer
> memory.
>
> The proposal is to add a proc entry
> /sys/kernel/debug/tracing/buffer_free. Its .release() fileops function
> executes tracing_stop() and then resizes the global trace buffer to
> minimum size (2*BUF_PAGE_SIZE). The user space process opens this file
> and keeps it open. When the process gets killed, the fd gets closed
> and .release() is called. This automatically stops the tracing and
> frees up the ring buffer memory.
>
> It is optional to use this functionality, since it won't affect
> tracing for current programs. But it provides a way to automatically
> free up memory, if needed. It can also be used on the command line to
> stop tracing and free up memory as a single operation as:
> echo > /sys/kernel/debug/tracing/buffer_free

I don't like adding new files to debug/tracing. If we do add this
feature, I rather have it done with the buffer_size_kb directly. Perhaps
add an ioctl() to the file that will do this.

You can open it and then ioctl(RINGBUF_FREE_ON_CLOSE);

If the process dies, it closes the buffer_size_kb and frees the memory.

-- Steve

2011-03-18 23:00:20

by David Sharp

[permalink] [raw]
Subject: Re: [RFC] tracing: a proc file to automatically release ring buffer memory

On Thu, Mar 17, 2011 at 2:36 PM, Steven Rostedt <[email protected]> wrote:
> On Thu, 2011-03-17 at 14:29 -0700, Vaibhav Nagarnaik wrote:
>> All
>>
>> The current way to release memory from ftrace ring buffer is to:
>> echo 0 > /sys/kernel/debug/tracing/buffer_size_kb
>>
>> Consider a scenario where ftrace is handled by a user space
>> process. Normally, this tracing is done as a low priority task on the
>> system. Under memory pressure for high priority tasks, tracing should
>> be turned off and the trace ring buffer memory released. The buffer
>> allocated is kernel memory and under OOM condition if the user space
>> process is oom-killed, there is no way to release the ring buffer
>> memory.
>>
>> The proposal is to add a proc entry
>> /sys/kernel/debug/tracing/buffer_free. Its .release() fileops function
>> executes tracing_stop() and then resizes the global trace buffer to
>> minimum size (2*BUF_PAGE_SIZE). The user space process opens this file
>> and keeps it open. When the process gets killed, the fd gets closed
>> and .release() is called. This automatically stops the tracing and
>> frees up the ring buffer memory.
>>
>> It is optional to use this functionality, since it won't affect
>> tracing for current programs. But it provides a way to automatically
>> free up memory, if needed. It can also be used on the command line to
>> stop tracing and free up memory as a single operation as:
>> echo > /sys/kernel/debug/tracing/buffer_free
>
> I don't like adding new files to debug/tracing. If we do add this
> feature, I rather have it done with the buffer_size_kb directly. Perhaps
> add an ioctl() to the file that will do this.
>
> You can open it and then ioctl(RINGBUF_FREE_ON_CLOSE);
>
> If the process dies, it closes the buffer_size_kb and frees the memory.

Thanks for the feedback Steve. An ioctl on buffer_size_kb sounds fine to me.