Fix: signal: Remove SEND_SIG_FORCED (v4.20)
[lttng-modules.git] / lttng-abi.c
index ab1e832b6ca6d2688a7cace9667615f33d4fe304..0534472ad8c1a1189495fd73e5ccbbdf05477a82 100644 (file)
@@ -1,25 +1,11 @@
-/*
+/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
+ *
  * lttng-abi.c
  *
  * LTTng ABI
  *
  * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; only
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *
  * Mimic system calls for:
  * - session creation, returns a file descriptor or failure.
  *   - channel creation, returns a file descriptor or failure.
@@ -56,6 +42,7 @@
 #include <lttng-abi-old.h>
 #include <lttng-events.h>
 #include <lttng-tracer.h>
+#include <lttng-tp-mempool.h>
 #include <lib/ringbuffer/frontend_types.h>
 
 /*
@@ -246,6 +233,9 @@ long lttng_abi_add_context(struct file *file,
                return lttng_add_preemptible_to_ctx(ctx);
        case LTTNG_KERNEL_CONTEXT_MIGRATABLE:
                return lttng_add_migratable_to_ctx(ctx);
+       case LTTNG_KERNEL_CONTEXT_CALLSTACK_KERNEL:
+       case LTTNG_KERNEL_CONTEXT_CALLSTACK_USER:
+               return lttng_add_callstack_to_ctx(ctx, context_param->ctx);
        default:
                return -EINVAL;
        }
@@ -654,6 +644,38 @@ void lttng_metadata_ring_buffer_ioctl_put_next_subbuf(struct file *filp,
        stream->metadata_out = stream->metadata_in;
 }
 
+/*
+ * Reset the counter of how much metadata has been consumed to 0. That way,
+ * the consumer receives the content of the metadata cache unchanged. This is
+ * different from the metadata_regenerate where the offset from epoch is
+ * resampled, here we want the exact same content as the last time the metadata
+ * was generated. This command is only possible if all the metadata written
+ * in the cache has been output to the metadata stream to avoid corrupting the
+ * metadata file.
+ *
+ * Return 0 on success, a negative value on error.
+ */
+static
+int lttng_metadata_cache_dump(struct lttng_metadata_stream *stream)
+{
+       int ret;
+       struct lttng_metadata_cache *cache = stream->metadata_cache;
+
+       mutex_lock(&cache->lock);
+       if (stream->metadata_out != cache->metadata_written) {
+               ret = -EBUSY;
+               goto end;
+       }
+       stream->metadata_out = 0;
+       stream->metadata_in = 0;
+       wake_up_interruptible(&stream->read_wait);
+       ret = 0;
+
+end:
+       mutex_unlock(&cache->lock);
+       return ret;
+}
+
 static
 long lttng_metadata_ring_buffer_ioctl(struct file *filp,
                unsigned int cmd, unsigned long arg)
@@ -684,6 +706,7 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp,
                 */
                return -ENOSYS;
        }
+       case RING_BUFFER_FLUSH_EMPTY:   /* Fall-through. */
        case RING_BUFFER_FLUSH:
        {
                struct lttng_metadata_stream *stream = filp->private_data;
@@ -705,6 +728,12 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp,
 
                return put_u64(stream->version, arg);
        }
+       case RING_BUFFER_METADATA_CACHE_DUMP:
+       {
+               struct lttng_metadata_stream *stream = filp->private_data;
+
+               return lttng_metadata_cache_dump(stream);
+       }
        default:
                break;
        }
@@ -760,6 +789,7 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp,
                 */
                return -ENOSYS;
        }
+       case RING_BUFFER_FLUSH_EMPTY:   /* Fall-through. */
        case RING_BUFFER_FLUSH:
        {
                struct lttng_metadata_stream *stream = filp->private_data;
@@ -781,6 +811,12 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp,
 
                return put_u64(stream->version, arg);
        }
+       case RING_BUFFER_METADATA_CACHE_DUMP:
+       {
+               struct lttng_metadata_stream *stream = filp->private_data;
+
+               return lttng_metadata_cache_dump(stream);
+       }
        default:
                break;
        }
@@ -1270,7 +1306,6 @@ old_ctx_end:
        default:
                return -ENOIOCTLCMD;
        }
-
 }
 
 /**
@@ -1437,7 +1472,18 @@ long lttng_event_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                        return lttng_enabler_attach_bytecode(enabler,
                                (struct lttng_kernel_filter_bytecode __user *) arg);
                }
-
+               default:
+                       WARN_ON_ONCE(1);
+                       return -ENOSYS;
+               }
+       case LTTNG_KERNEL_ADD_CALLSITE:
+               switch (*evtype) {
+               case LTTNG_TYPE_EVENT:
+                       event = file->private_data;
+                       return lttng_event_add_callsite(event,
+                               (struct lttng_kernel_event_callsite __user *) arg);
+               case LTTNG_TYPE_ENABLER:
+                       return -EINVAL;
                }
        default:
                return -ENOIOCTLCMD;
@@ -1725,6 +1771,12 @@ int __init lttng_abi_init(void)
 
        wrapper_vmalloc_sync_all();
        lttng_clock_ref();
+
+       ret = lttng_tp_mempool_init();
+       if (ret) {
+               goto error;
+       }
+
        lttng_proc_dentry = proc_create_data("lttng", S_IRUSR | S_IWUSR, NULL,
                                        &lttng_fops, NULL);
 
@@ -1737,6 +1789,7 @@ int __init lttng_abi_init(void)
        return 0;
 
 error:
+       lttng_tp_mempool_destroy();
        lttng_clock_unref();
        return ret;
 }
@@ -1744,6 +1797,7 @@ error:
 /* No __exit annotation because used by init error path too. */
 void lttng_abi_exit(void)
 {
+       lttng_tp_mempool_destroy();
        lttng_clock_unref();
        if (lttng_proc_dentry)
                remove_proc_entry("lttng", NULL);
This page took 0.035348 seconds and 4 git commands to generate.