X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-statedump-impl.c;h=b5bfa9fb033a0c6682cfbc52f35c9b970f8adbae;hb=6bcf4dc1770ccf4da479a1fd015cd474eda241eb;hp=864637dd457fc1321c9ca09fe23764704e55eb22;hpb=3bc29f0a41b3c803245b845db2e1909042e72e9c;p=lttng-modules.git diff --git a/lttng-statedump-impl.c b/lttng-statedump-impl.c index 864637dd..b5bfa9fb 100644 --- a/lttng-statedump-impl.c +++ b/lttng-statedump-impl.c @@ -1,4 +1,5 @@ -/* +/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1) + * * lttng-statedump.c * * Linux Trace Toolkit Next Generation Kernel State Dump @@ -6,20 +7,6 @@ * Copyright 2005 Jean-Hugues Deschenes * Copyright 2006-2012 Mathieu Desnoyers * - * 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 - * * Changes: * Eric Clement: Add listing of network IP interface * 2006, 2007 Mathieu Desnoyers Fix kernel threads @@ -41,21 +28,21 @@ #include #include #include -#include #include #include #include #include -#include "lttng-events.h" -#include "lttng-tracer.h" -#include "wrapper/irqdesc.h" -#include "wrapper/spinlock.h" -#include "wrapper/fdtable.h" -#include "wrapper/nsproxy.h" -#include "wrapper/irq.h" -#include "wrapper/tracepoint.h" -#include "wrapper/genhd.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef CONFIG_LTTNG_HAS_LIST_IRQ #include @@ -63,18 +50,47 @@ /* Define the tracepoints, but do not build the probes */ #define CREATE_TRACE_POINTS -#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module +#define TRACE_INCLUDE_PATH instrumentation/events/lttng-module #define TRACE_INCLUDE_FILE lttng-statedump #define LTTNG_INSTRUMENTATION -#include "instrumentation/events/lttng-module/lttng-statedump.h" +#include + +LTTNG_DEFINE_TRACE(lttng_statedump_block_device, + TP_PROTO(struct lttng_session *session, + dev_t dev, const char *diskname), + TP_ARGS(session, dev, diskname)); + +LTTNG_DEFINE_TRACE(lttng_statedump_end, + TP_PROTO(struct lttng_session *session), + TP_ARGS(session)); + +LTTNG_DEFINE_TRACE(lttng_statedump_interrupt, + TP_PROTO(struct lttng_session *session, + unsigned int irq, const char *chip_name, + struct irqaction *action), + TP_ARGS(session, irq, chip_name, action)); + +LTTNG_DEFINE_TRACE(lttng_statedump_file_descriptor, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, int fd, const char *filename, + unsigned int flags, fmode_t fmode), + TP_ARGS(session, p, fd, filename, flags, fmode)); + +LTTNG_DEFINE_TRACE(lttng_statedump_start, + TP_PROTO(struct lttng_session *session), + TP_ARGS(session)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_state, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + int type, int mode, int submode, int status, + struct pid_namespace *pid_ns), + TP_ARGS(session, p, type, mode, submode, status, pid_ns)); -DEFINE_TRACE(lttng_statedump_block_device); -DEFINE_TRACE(lttng_statedump_end); -DEFINE_TRACE(lttng_statedump_interrupt); -DEFINE_TRACE(lttng_statedump_file_descriptor); -DEFINE_TRACE(lttng_statedump_start); -DEFINE_TRACE(lttng_statedump_process_state); -DEFINE_TRACE(lttng_statedump_network_interface); +LTTNG_DEFINE_TRACE(lttng_statedump_network_interface, + TP_PROTO(struct lttng_session *session, + struct net_device *dev, struct in_ifaddr *ifa), + TP_ARGS(session, dev, ifa)); struct lttng_fd_ctx { char *page; @@ -120,6 +136,61 @@ enum lttng_process_status { LTTNG_DEAD = 7, }; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,11,0)) + +#define LTTNG_PART_STRUCT_TYPE struct block_device + +static +int lttng_get_part_name(struct gendisk *disk, struct block_device *part, char *name_buf) +{ + const char *p; + + p = bdevname(part, name_buf); + if (!p) + return -ENOSYS; + + return 0; +} + +static +dev_t lttng_get_part_devt(struct block_device *part) +{ + return part->bd_dev; +} + +#else + +#define LTTNG_PART_STRUCT_TYPE struct hd_struct + +static +int lttng_get_part_name(struct gendisk *disk, struct hd_struct *part, char *name_buf) +{ + const char *p; + struct block_device bdev; + + /* + * Create a partial 'struct blockdevice' to use + * 'bdevname()' which is a simple wrapper over + * 'disk_name()' but has the honor to be EXPORT_SYMBOL. + */ + bdev.bd_disk = disk; + bdev.bd_part = part; + + p = bdevname(&bdev, name_buf); + if (!p) + return -ENOSYS; + + return 0; +} + +static +dev_t lttng_get_part_devt(struct hd_struct *part) +{ + return part_devt(part); +} +#endif + static int lttng_enumerate_block_devices(struct lttng_session *session) { @@ -139,7 +210,7 @@ int lttng_enumerate_block_devices(struct lttng_session *session) while ((dev = class_dev_iter_next(&iter))) { struct disk_part_iter piter; struct gendisk *disk = dev_to_disk(dev); - struct hd_struct *part; + LTTNG_PART_STRUCT_TYPE *part; /* * Don't show empty devices or things that have been @@ -152,16 +223,14 @@ int lttng_enumerate_block_devices(struct lttng_session *session) disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0); while ((part = disk_part_iter_next(&piter))) { char name_buf[BDEVNAME_SIZE]; - char *p; - p = wrapper_disk_name(disk, part->partno, name_buf); - if (!p) { + if (lttng_get_part_name(disk, part, name_buf) == -ENOSYS) { disk_part_iter_exit(&piter); class_dev_iter_exit(&iter); return -ENOSYS; } trace_lttng_statedump_block_device(session, - part_devt(part), name_buf); + lttng_get_part_devt(part), name_buf); } disk_part_iter_exit(&piter); } @@ -237,7 +306,7 @@ int lttng_dump_one_fd(const void *p, struct file *file, unsigned int fd) * the lock is taken, but we are not aware whether this is * guaranteed or not, so play safe. */ - if (fd < fdt->max_fds && test_bit(fd, fdt->close_on_exec)) + if (fd < fdt->max_fds && lttng_close_on_exec(fd, fdt)) flags |= O_CLOEXEC; if (IS_ERR(s)) { struct dentry *dentry = file->f_path.dentry; @@ -315,7 +384,7 @@ void lttng_enumerate_task_vm_maps(struct lttng_session *session, down_read(&mm->mmap_sem); while (map) { if (map->vm_file) - ino = map->vm_file->f_dentry->d_inode->i_ino; + ino = map->vm_file->lttng_f_dentry->d_inode->i_ino; else ino = 0; trace_lttng_statedump_vm_map(session, p, map, ino); @@ -390,35 +459,14 @@ void lttng_statedump_process_ns(struct lttng_session *session, enum lttng_execution_submode submode, enum lttng_process_status status) { - struct nsproxy *proxy; struct pid_namespace *pid_ns; - /* - * Back and forth on locking strategy within Linux upstream for nsproxy. - * See Linux upstream commit 728dba3a39c66b3d8ac889ddbe38b5b1c264aec3 - * "namespaces: Use task_lock and not rcu to protect nsproxy" - * for details. - */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) - rcu_read_lock(); - proxy = task_nsproxy(p); -#else /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) */ - proxy = p->nsproxy; -#endif /* #else #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) */ - if (proxy) { - pid_ns = lttng_get_proxy_pid_ns(proxy); - do { - trace_lttng_statedump_process_state(session, - p, type, mode, submode, status, pid_ns); - pid_ns = pid_ns->parent; - } while (pid_ns); - } else { + pid_ns = task_active_pid_ns(p); + do { trace_lttng_statedump_process_state(session, - p, type, mode, submode, status, NULL); - } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) - rcu_read_unlock(); -#endif /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) */ + p, type, mode, submode, status, pid_ns); + pid_ns = pid_ns ? pid_ns->parent : NULL; + } while (pid_ns); } static @@ -514,6 +562,8 @@ int do_lttng_statedump(struct lttng_session *session) return ret; ret = lttng_enumerate_block_devices(session); switch (ret) { + case 0: + break; case -ENOSYS: printk(KERN_WARNING "LTTng: block device enumeration is not supported by kernel\n"); break; @@ -578,7 +628,7 @@ module_exit(lttng_statedump_exit); MODULE_LICENSE("GPL and additional rights"); MODULE_AUTHOR("Jean-Hugues Deschenes"); -MODULE_DESCRIPTION("Linux Trace Toolkit Next Generation Statedump"); +MODULE_DESCRIPTION("LTTng statedump provider"); MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." __stringify(LTTNG_MODULES_MINOR_VERSION) "." __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)