uprobe: transmit binary file descritptor through lttng_payload
[lttng-tools.git] / src / bin / lttng-sessiond / trace-kernel.c
index 36af00b2d09a4ba3d5b97e0b74eed509fedd64c2..dfdc9fd14e96b9b2124034983dc0d1db4525633a 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C)  2011 - David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _LGPL_SOURCE
@@ -29,6 +19,7 @@
 #include <common/common.h>
 #include <common/defaults.h>
 #include <common/trace-chunk.h>
+#include <common/macros.h>
 
 #include "consumer.h"
 #include "trace-kernel.h"
@@ -39,7 +30,7 @@
  * Find the channel name for the given kernel session.
  */
 struct ltt_kernel_channel *trace_kernel_get_channel_by_name(
-               char *name, struct ltt_kernel_session *session)
+               const char *name, struct ltt_kernel_session *session)
 {
        struct ltt_kernel_channel *chan;
 
@@ -164,6 +155,30 @@ struct ltt_kernel_session *trace_kernel_create_session(void)
        lks->metadata = NULL;
        CDS_INIT_LIST_HEAD(&lks->channel_list.head);
 
+       lks->tracker_pid = process_attr_tracker_create();
+       if (!lks->tracker_pid) {
+               goto error;
+       }
+       lks->tracker_vpid = process_attr_tracker_create();
+       if (!lks->tracker_vpid) {
+               goto error;
+       }
+       lks->tracker_uid = process_attr_tracker_create();
+       if (!lks->tracker_uid) {
+               goto error;
+       }
+       lks->tracker_vuid = process_attr_tracker_create();
+       if (!lks->tracker_vuid) {
+               goto error;
+       }
+       lks->tracker_gid = process_attr_tracker_create();
+       if (!lks->tracker_gid) {
+               goto error;
+       }
+       lks->tracker_vgid = process_attr_tracker_create();
+       if (!lks->tracker_vgid) {
+               goto error;
+       }
        lks->consumer = consumer_create_output(CONSUMER_DST_LOCAL);
        if (lks->consumer == NULL) {
                goto error;
@@ -172,6 +187,12 @@ struct ltt_kernel_session *trace_kernel_create_session(void)
        return lks;
 
 error:
+       process_attr_tracker_destroy(lks->tracker_pid);
+       process_attr_tracker_destroy(lks->tracker_vpid);
+       process_attr_tracker_destroy(lks->tracker_uid);
+       process_attr_tracker_destroy(lks->tracker_vuid);
+       process_attr_tracker_destroy(lks->tracker_gid);
+       process_attr_tracker_destroy(lks->tracker_vgid);
        free(lks);
 
 alloc_error:
@@ -370,16 +391,10 @@ enum lttng_error_code trace_kernel_create_event(
 
                        /*
                         * Save a reference to the probe location used during
-                        * the listing of events. Close its FD since it won't
-                        * be needed for listing.
+                        * the listing of events.
                         */
                        userspace_probe_location =
                                        lttng_userspace_probe_location_copy(location);
-                       ret = lttng_userspace_probe_location_function_set_binary_fd(
-                                       userspace_probe_location, -1);
-                       if (ret) {
-                               goto error;
-                       }
                        break;
                case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
                        /* Get the file descriptor on the target binary. */
@@ -388,15 +403,10 @@ enum lttng_error_code trace_kernel_create_event(
 
                        /*
                         * Save a reference to the probe location used during the listing of
-                        * events. Close its FD since it won't be needed for listing.
+                        * events.
                         */
                        userspace_probe_location =
                                        lttng_userspace_probe_location_copy(location);
-                       ret = lttng_userspace_probe_location_tracepoint_set_binary_fd(
-                                       userspace_probe_location, -1);
-                       if (ret) {
-                               goto error;
-                       }
                        break;
                default:
                        DBG("Unsupported lookup method type");
@@ -465,6 +475,7 @@ error:
  */
 struct ltt_kernel_metadata *trace_kernel_create_metadata(void)
 {
+       int ret;
        struct ltt_kernel_metadata *lkm;
        struct lttng_channel *chan;
 
@@ -475,13 +486,38 @@ struct ltt_kernel_metadata *trace_kernel_create_metadata(void)
                goto error;
        }
 
+       ret = lttng_strncpy(
+                       chan->name, DEFAULT_METADATA_NAME, sizeof(chan->name));
+       if (ret) {
+               ERR("Failed to initialize metadata channel name to `%s`",
+                               DEFAULT_METADATA_NAME);
+               goto error;
+       }
+
        /* Set default attributes */
-       chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
+       chan->attr.overwrite = DEFAULT_METADATA_OVERWRITE;
        chan->attr.subbuf_size = default_get_metadata_subbuf_size();
        chan->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM;
-       chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
-       chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
-       chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
+       chan->attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER;
+       chan->attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER;;
+
+
+       /*
+        * The metadata channel of kernel sessions must use the "mmap"
+        * back-end since the consumer daemon accumulates complete
+        * metadata units before sending them to the relay daemon in
+        * live mode. The consumer daemon also needs to extract the contents
+        * of the metadata cache when computing a rotation position.
+        *
+        * In both cases, it is not possible to rely on the splice
+        * back-end as the consumer daemon may need to accumulate more
+        * content than can be backed by the ring buffer's underlying
+        * pages.
+        */
+       chan->attr.output = LTTNG_EVENT_MMAP;
+       chan->attr.tracefile_size = 0;
+       chan->attr.tracefile_count = 0;
+       chan->attr.live_timer_interval = 0;
 
        /* Init metadata */
        lkm->fd = -1;
@@ -718,5 +754,12 @@ void trace_kernel_free_session(struct ltt_kernel_session *session)
        /* Wipe consumer output object */
        consumer_output_put(session->consumer);
 
+       process_attr_tracker_destroy(session->tracker_pid);
+       process_attr_tracker_destroy(session->tracker_vpid);
+       process_attr_tracker_destroy(session->tracker_uid);
+       process_attr_tracker_destroy(session->tracker_vuid);
+       process_attr_tracker_destroy(session->tracker_gid);
+       process_attr_tracker_destroy(session->tracker_vgid);
+
        free(session);
 }
This page took 0.025091 seconds and 4 git commands to generate.