• Daniel Bristot de Oliveira's avatar
    trace: Add a generic function to read/write u64 values from tracefs · bc87cf0a
    Daniel Bristot de Oliveira authored
    The hwlat detector and (in preparation for) the osnoise/timerlat tracers
    have a set of u64 parameters that the user can read/write via tracefs.
    For instance, we have hwlat_detector's window and width.
    
    To reduce the code duplication, hwlat's window and width share the same
    read function. However, they do not share the write functions because
    they do different parameter checks. For instance, the width needs to
    be smaller than the window, while the window needs to be larger
    than the window. The same pattern repeats on osnoise/timerlat, and
    a large portion of the code was devoted to the write function.
    
    Despite having different checks, the write functions have the same
    structure:
    
       read a user-space buffer
       take the lock that protects the value
       check for minimum and maximum acceptable values
          save the value
       release the lock
       return success or error
    
    To reduce the code duplication also in the write functions, this patch
    provides a generic read and write implementation for u64 values that
    need to be within some minimum and/or maximum parameters, while
    (potentially) being protected by a lock.
    
    To use this interface, the structure trace_min_max_param needs to be
    filled:
    
     struct trace_min_max_param {
             struct mutex    *lock;
             u64             *val;
             u64             *min;
             u64             *max;
     };
    
    The desired value is stored on the variable pointed by *val. If *min
    points to a minimum acceptable value, it will be checked during the
    write operation. Likewise, if *max points to a maximum allowable value,
    it will be checked during the write operation. Finally, if *lock points
    to a mutex, it will be taken at the beginning of the operation and
    released at the end.
    
    The definition of a trace_min_max_param needs to passed as the
    (private) *data for tracefs_create_file(), and the trace_min_max_fops
    (added by this patch) as the *fops file_operations.
    
    Link: https://lkml.kernel.org/r/3e35760a7c8b5c55f16ae5ad5fc54a0e71cbe647.1624372313.git.bristot@redhat.com
    
    Cc: Phil Auld <pauld@redhat.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Kate Carcia <kcarcia@redhat.com>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Alexandre Chartre <alexandre.chartre@oracle.com>
    Cc: Clark Willaims <williams@redhat.com>
    Cc: John Kacur <jkacur@redhat.com>
    Cc: Juri Lelli <juri.lelli@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: x86@kernel.org
    Cc: linux-doc@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarDaniel Bristot de Oliveira <bristot@redhat.com>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    bc87cf0a
trace.c 246 KB