]> git.lttng.org Git - lttng-modules.git/commitdiff
Fix: f_count replaced with f_ref in Linux 6.13.0-rc1
authorKienan Stewart <kstewart@efficios.com>
Mon, 2 Dec 2024 16:02:31 +0000 (16:02 +0000)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 10 Dec 2024 19:11:41 +0000 (14:11 -0500)
See upstream commit 90ee6ed776c06435a3fe79c7f5344761f52e1760:

    commit 90ee6ed776c06435a3fe79c7f5344761f52e1760
    Author: Christian Brauner <brauner@kernel.org>
    Date:   Mon Oct 7 16:23:59 2024 +0200

        fs: port files to file_ref

        Port files to rely on file_ref reference to improve scaling and gain
        overflow protection.

        - We continue to WARN during get_file() in case a file that is already
          marked dead is revived as get_file() is only valid if the caller
          already holds a reference to the file. This hasn't changed just the
          check changes.

        - The semantics for epoll and ttm's dmabuf usage have changed. Both
          epoll and ttm synchronize with __fput() to prevent the underlying file
          from beeing freed.

Change-Id: I9f376af50835f15f74ff7fc82bdb752e09f77222
Signed-off-by: Kienan Stewart <kstewart@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/wrapper/file_ref.h [new file with mode: 0644]
src/lttng-abi.c
src/lttng-events.c

diff --git a/include/wrapper/file_ref.h b/include/wrapper/file_ref.h
new file mode 100644 (file)
index 0000000..fd2b123
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
+ * SPDX-FileCopyrightText: 2024 Kienan Stewart <kstewart@efficios.com>
+ */
+
+#ifndef LTTNG_WRAPPER_FILE_REF_H
+#define LTTNG_WRAPPER_FILE_REF_H
+
+#include <linux/file.h>
+#include <lttng/kernel-version.h>
+
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,13,0))
+#include <linux/file_ref.h>
+
+static inline __must_check
+bool lttng_file_ref_get(struct file *file)
+{
+       return file_ref_get(&file->f_ref);
+}
+
+static inline
+bool lttng_file_ref_put(struct file *file)
+{
+       /* This is __must_check */
+       return file_ref_put(&file->f_ref);
+}
+
+#else
+static inline __must_check
+bool lttng_file_ref_get(struct file *file)
+{
+       atomic_long_add_unless(&file->f_count, 1, LONG_MAX);
+       return true;
+}
+
+static inline
+bool lttng_file_ref_put(struct file *file)
+{
+       atomic_long_dec(&file->f_count);
+       return true;
+}
+#endif
+#endif /* LTTNG_WRAPPER_FILE_REF_H */
index 5a3b616fddc7d9daac92c3cf422a48cd641b9eab..da37576087940986fa17dce784b866da806d327c 100644 (file)
@@ -36,6 +36,7 @@
 #include <ringbuffer/backend.h>
 #include <ringbuffer/frontend.h>
 #include <wrapper/compiler_attributes.h>
+#include <wrapper/file_ref.h>
 #include <wrapper/poll.h>
 #include <wrapper/kref.h>
 #include <wrapper/uaccess.h>
@@ -551,7 +552,7 @@ int lttng_abi_create_channel(struct file *session_file,
                transport_name = "<unknown>";
                break;
        }
-       if (!atomic_long_add_unless(&session_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(session_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -576,7 +577,7 @@ int lttng_abi_create_channel(struct file *session_file,
        return chan_fd;
 
 chan_error:
-       atomic_long_dec(&session_file->f_count);
+       lttng_file_ref_put(session_file);
 refcount_error:
        fput(chan_file);
 file_error:
@@ -2434,7 +2435,7 @@ int lttng_abi_open_event_notifier_group_stream(struct file *notif_file)
                return -ENOENT;
 
        /* The event_notifier notification fd holds a reference on the event_notifier group */
-       if (!atomic_long_add_unless(&notif_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(notif_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -2449,7 +2450,7 @@ int lttng_abi_open_event_notifier_group_stream(struct file *notif_file)
        return ret;
 
 fd_error:
-       atomic_long_dec(&notif_file->f_count);
+       lttng_file_ref_put(notif_file);
 refcount_error:
        event_notifier_group->ops->priv->buffer_read_close(buf);
        return ret;
@@ -2689,7 +2690,7 @@ int lttng_abi_create_event_recorder_enabler(struct file *channel_file,
                goto file_error;
        }
        /* The event holds a reference on the channel */
-       if (!atomic_long_add_unless(&channel_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(channel_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -2776,7 +2777,7 @@ int lttng_abi_create_event_recorder_enabler(struct file *channel_file,
        return event_fd;
 
 event_error:
-       atomic_long_dec(&channel_file->f_count);
+       lttng_file_ref_put(channel_file);
 refcount_error:
        fput(event_file);
 file_error:
@@ -2849,7 +2850,7 @@ int lttng_abi_create_event_counter_enabler(struct file *channel_file,
                goto file_error;
        }
        /* The event holds a reference on the channel */
-       if (!atomic_long_add_unless(&channel_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(channel_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -2936,7 +2937,7 @@ int lttng_abi_create_event_counter_enabler(struct file *channel_file,
        return event_fd;
 
 event_error:
-       atomic_long_dec(&channel_file->f_count);
+       lttng_file_ref_put(channel_file);
 refcount_error:
        fput(event_file);
 file_error:
@@ -3101,7 +3102,7 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file,
        }
 
        /* The event notifier holds a reference on the event notifier group. */
-       if (!atomic_long_add_unless(&event_notifier_group_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(event_notifier_group_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -3189,7 +3190,7 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file,
        return event_notifier_fd;
 
 event_notifier_error:
-       atomic_long_dec(&event_notifier_group_file->f_count);
+       lttng_file_ref_put(event_notifier_group_file);
 refcount_error:
        fput(event_notifier_file);
 file_error:
@@ -3241,7 +3242,7 @@ long lttng_abi_session_create_counter(
                goto file_error;
        }
 
-       if (!atomic_long_add_unless(&session->priv->file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(session->priv->file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -3265,7 +3266,7 @@ long lttng_abi_session_create_counter(
        return counter_fd;
 
 create_error:
-       atomic_long_dec(&session->priv->file->f_count);
+       lttng_file_ref_put(session->priv->file);
 refcount_error:
        fput(counter_file);
 file_error:
@@ -3331,7 +3332,7 @@ long lttng_abi_event_notifier_group_create_error_counter(
                goto file_error;
        }
 
-       if (!atomic_long_add_unless(&event_notifier_group_file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(event_notifier_group_file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -3361,7 +3362,7 @@ long lttng_abi_event_notifier_group_create_error_counter(
        return counter_fd;
 
 create_error:
-       atomic_long_dec(&event_notifier_group_file->f_count);
+      lttng_file_ref_put(event_notifier_group_file);
 refcount_error:
        fput(counter_file);
 file_error:
index 21d23d6632f9183cf5680736682f20e71bb717cd..648a6605e81eb08654b933c1e84c0a2e4efcc929 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/dmi.h>
 
 #include <wrapper/compiler_attributes.h>
+#include <wrapper/file_ref.h>
 #include <wrapper/uuid.h>
 #include <wrapper/vmalloc.h>   /* for wrapper_vmalloc_sync_mappings() */
 #include <wrapper/random.h>
@@ -2057,7 +2058,7 @@ int lttng_session_list_tracker_ids(struct lttng_kernel_session *session,
                ret = PTR_ERR(tracker_ids_list_file);
                goto file_error;
        }
-       if (!atomic_long_add_unless(&session->priv->file->f_count, 1, LONG_MAX)) {
+       if (!lttng_file_ref_get(session->priv->file)) {
                ret = -EOVERFLOW;
                goto refcount_error;
        }
@@ -2073,7 +2074,7 @@ int lttng_session_list_tracker_ids(struct lttng_kernel_session *session,
        return file_fd;
 
 open_error:
-       atomic_long_dec(&session->priv->file->f_count);
+       lttng_file_ref_put(session->priv->file);
 refcount_error:
        fput(tracker_ids_list_file);
 file_error:
This page took 0.035959 seconds and 4 git commands to generate.