X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=instrumentation%2Fevents%2Flttng-module%2Fwriteback.h;h=3327a0f6995476bd0b570423b13663d1015beb1e;hb=9f36eaed6f91d5897924b551b44d1edd8cee00e2;hp=b2148d86b5079ded37d7c60b94a1a96e6fb1e1d4;hpb=f127e61ee231d002fb9a7803643a157e06f6d2e2;p=lttng-modules.git diff --git a/instrumentation/events/lttng-module/writeback.h b/instrumentation/events/lttng-module/writeback.h index b2148d86..3327a0f6 100644 --- a/instrumentation/events/lttng-module/writeback.h +++ b/instrumentation/events/lttng-module/writeback.h @@ -1,10 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #undef TRACE_SYSTEM #define TRACE_SYSTEM writeback #if !defined(LTTNG_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) #define LTTNG_TRACE_WRITEBACK_H -#include "../../../probes/lttng-tracepoint-event.h" +#include #include #include #include @@ -13,16 +14,34 @@ #ifndef _TRACE_WRITEBACK_DEF_ #define _TRACE_WRITEBACK_DEF_ +/* + * Vanilla kernels before 4.0 do not implement inode_to_bdi + * RHEL kernels before 3.10.0-327.10.1 do not implement inode_to_bdi + * RHEL kernel 3.10.0-327.10.1 has inode_to_bdi + * RHEL kernel 3.10.0-327.13.1 includes a partial merge of upstream + * commit a212b105b07d75b48b1a166378282e8a77fbf53d which inlines + * inode_to_bdi but not sb_is_blkdev_sb making it unusable by modules. + */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)) -static inline struct backing_dev_info *inode_to_bdi(struct inode *inode) +static inline struct backing_dev_info *lttng_inode_to_bdi(struct inode *inode) { - struct super_block *sb = inode->i_sb; + struct super_block *sb; + + if (!inode) + return &noop_backing_dev_info; + + sb = inode->i_sb; if (strcmp(sb->s_type->name, "bdev") == 0) return inode->i_mapping->backing_dev_info; return sb->s_bdi; } +#else +static inline struct backing_dev_info *lttng_inode_to_bdi(struct inode *inode) +{ + return inode_to_bdi(inode); +} #endif /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)) */ #endif @@ -57,18 +76,6 @@ static inline struct backing_dev_info *inode_to_bdi(struct inode *inode) ) #endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) -#define WB_WORK_REASON \ - {WB_REASON_BACKGROUND, "background"}, \ - {WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages"}, \ - {WB_REASON_SYNC, "sync"}, \ - {WB_REASON_PERIODIC, "periodic"}, \ - {WB_REASON_LAPTOP_TIMER, "laptop_timer"}, \ - {WB_REASON_FREE_MORE_MEM, "free_more_memory"}, \ - {WB_REASON_FS_FREE_SPACE, "fs_free_space"}, \ - {WB_REASON_FORKER_THREAD, "forker_thread"} -#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) LTTNG_TRACEPOINT_EVENT(writeback_dirty_page, @@ -76,7 +83,7 @@ LTTNG_TRACEPOINT_EVENT(writeback_dirty_page, TP_ARGS(page, mapping), TP_FIELDS( ctf_array_text(char, name, - mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", 32) + mapping ? dev_name(lttng_inode_to_bdi(mapping->host)->dev) : "(unknown)", 32) ctf_integer(unsigned long, ino, mapping ? mapping->host->i_ino : 0) ctf_integer(pgoff_t, index, page->index) ) @@ -88,8 +95,8 @@ LTTNG_TRACEPOINT_EVENT_CLASS(writeback_dirty_inode_template, TP_FIELDS( /* may be called for files on pseudo FSes w/ unregistered bdi */ ctf_array_text(char, name, - inode_to_bdi(inode)->dev ? - dev_name(inode_to_bdi(inode)->dev) : "(unknown)", 32) + lttng_inode_to_bdi(inode)->dev ? + dev_name(lttng_inode_to_bdi(inode)->dev) : "(unknown)", 32) ctf_integer(unsigned long, ino, inode->i_ino) ctf_integer(unsigned long, state, inode->i_state) ctf_integer(unsigned long, flags, flags) @@ -108,7 +115,7 @@ LTTNG_TRACEPOINT_EVENT_CLASS(writeback_write_inode_template, TP_ARGS(inode, wbc), TP_FIELDS( ctf_array_text(char, name, - dev_name(inode_to_bdi(inode)->dev), 32) + dev_name(lttng_inode_to_bdi(inode)->dev), 32) ctf_integer(unsigned long, ino, inode->i_ino) ctf_integer(int, sync_mode, wbc->sync_mode) ) @@ -174,7 +181,18 @@ LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(writeback_write_inode) #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)) */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) + +LTTNG_TRACEPOINT_EVENT_CLASS(writeback_work_class, + TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), + TP_ARGS(wb, work), + TP_FIELDS( + ctf_array_text(char, name, wb->bdi->dev ? dev_name(wb->bdi->dev) : + "(unknown)", 32) + ) +) + +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) LTTNG_TRACEPOINT_EVENT_CLASS(writeback_work_class, TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), @@ -199,10 +217,22 @@ LTTNG_TRACEPOINT_EVENT_CLASS(writeback_work_class, #endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) + +#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(name) \ +LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_work_class, name, \ + TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \ + TP_ARGS(wb, work)) + +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + #define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(name) \ LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_work_class, name, \ TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), \ TP_ARGS(bdi, work)) + +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_nothread) LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_queue) LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_exec) @@ -220,7 +250,29 @@ LTTNG_TRACEPOINT_EVENT(writeback_pages_written, ) ) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) + LTTNG_TRACEPOINT_EVENT_CLASS(writeback_class, + TP_PROTO(struct bdi_writeback *wb), + TP_ARGS(wb), + TP_FIELDS( + ctf_array_text(char, name, + dev_name(wb->bdi->dev), 32) + ) +) + +#undef DEFINE_WRITEBACK_EVENT +#define DEFINE_WRITEBACK_EVENT(name) \ +LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_class, name, \ + TP_PROTO(struct bdi_writeback *wb), \ + TP_ARGS(wb)) + +#define DEFINE_WRITEBACK_EVENT_MAP(name, map) \ +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(writeback_class, name, map, \ + TP_PROTO(struct bdi_writeback *wb), \ + TP_ARGS(wb)) + +LTTNG_TRACEPOINT_EVENT(writeback_bdi_register, TP_PROTO(struct backing_dev_info *bdi), TP_ARGS(bdi), TP_FIELDS( @@ -228,6 +280,18 @@ LTTNG_TRACEPOINT_EVENT_CLASS(writeback_class, dev_name(bdi->dev), 32) ) ) + +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + +LTTNG_TRACEPOINT_EVENT_CLASS(writeback_class, + TP_PROTO(struct backing_dev_info *bdi), + TP_ARGS(bdi), + TP_FIELDS( + ctf_array_text(char, name, + dev_name(bdi->dev), 32) + ) +) + #undef DEFINE_WRITEBACK_EVENT #define DEFINE_WRITEBACK_EVENT(name) \ LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_class, name, \ @@ -239,13 +303,16 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(writeback_class, name, map, \ TP_PROTO(struct backing_dev_info *bdi), \ TP_ARGS(bdi)) +DEFINE_WRITEBACK_EVENT(writeback_bdi_register) + +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + DEFINE_WRITEBACK_EVENT(writeback_nowork) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) DEFINE_WRITEBACK_EVENT(writeback_wake_background) #endif DEFINE_WRITEBACK_EVENT(writeback_wake_thread) DEFINE_WRITEBACK_EVENT(writeback_wake_forker_thread) -DEFINE_WRITEBACK_EVENT(writeback_bdi_register) DEFINE_WRITEBACK_EVENT(writeback_bdi_unregister) DEFINE_WRITEBACK_EVENT(writeback_thread_start) DEFINE_WRITEBACK_EVENT(writeback_thread_stop) @@ -334,6 +401,31 @@ LTTNG_TRACEPOINT_EVENT(writeback_queue_io, ) ) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,14,0)) +LTTNG_TRACEPOINT_EVENT_MAP(global_dirty_state, + + writeback_global_dirty_state, + + TP_PROTO(unsigned long background_thresh, + unsigned long dirty_thresh + ), + + TP_ARGS(background_thresh, + dirty_thresh + ), + + TP_FIELDS( + ctf_integer(unsigned long, nr_dirty, global_node_page_state(NR_FILE_DIRTY)) + ctf_integer(unsigned long, nr_writeback, global_node_page_state(NR_WRITEBACK)) + ctf_integer(unsigned long, nr_unstable, global_node_page_state(NR_UNSTABLE_NFS)) + ctf_integer(unsigned long, nr_dirtied, global_node_page_state(NR_DIRTIED)) + ctf_integer(unsigned long, nr_written, global_node_page_state(NR_WRITTEN)) + ctf_integer(unsigned long, background_thresh, background_thresh) + ctf_integer(unsigned long, dirty_thresh, dirty_thresh) + ctf_integer(unsigned long, dirty_limit, global_dirty_limit) + ) +) +#else LTTNG_TRACEPOINT_EVENT_MAP(global_dirty_state, writeback_global_dirty_state, @@ -358,11 +450,62 @@ LTTNG_TRACEPOINT_EVENT_MAP(global_dirty_state, ) ) #endif +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) #define KBps(x) ((x) << (PAGE_SHIFT - 10)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) + +LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit, + + writeback_bdi_dirty_ratelimit, + + TP_PROTO(struct bdi_writeback *wb, + unsigned long dirty_rate, + unsigned long task_ratelimit), + + TP_ARGS(wb, dirty_rate, task_ratelimit), + + TP_FIELDS( + ctf_array_text(char, bdi, dev_name(wb->bdi->dev), 32) + ctf_integer(unsigned long, write_bw, KBps(wb->bdi->wb.write_bandwidth)) + ctf_integer(unsigned long, avg_write_bw, KBps(wb->bdi->wb.avg_write_bandwidth)) + ctf_integer(unsigned long, dirty_rate, KBps(dirty_rate)) + ctf_integer(unsigned long, dirty_ratelimit, KBps(wb->bdi->wb.dirty_ratelimit)) + ctf_integer(unsigned long, task_ratelimit, KBps(task_ratelimit)) + ctf_integer(unsigned long, balanced_dirty_ratelimit, + KBps(wb->bdi->wb.balanced_dirty_ratelimit)) + ) +) + +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)) + +LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit, + + writeback_bdi_dirty_ratelimit, + + TP_PROTO(struct backing_dev_info *bdi, + unsigned long dirty_rate, + unsigned long task_ratelimit), + + TP_ARGS(bdi, dirty_rate, task_ratelimit), + + TP_FIELDS( + ctf_array_text(char, bdi, dev_name(bdi->dev), 32) + ctf_integer(unsigned long, write_bw, KBps(bdi->wb.write_bandwidth)) + ctf_integer(unsigned long, avg_write_bw, KBps(bdi->wb.avg_write_bandwidth)) + ctf_integer(unsigned long, dirty_rate, KBps(dirty_rate)) + ctf_integer(unsigned long, dirty_ratelimit, KBps(bdi->wb.dirty_ratelimit)) + ctf_integer(unsigned long, task_ratelimit, KBps(task_ratelimit)) + ctf_integer(unsigned long, balanced_dirty_ratelimit, + KBps(bdi->wb.balanced_dirty_ratelimit)) + ) +) + +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)) */ + LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit, writeback_bdi_dirty_ratelimit, @@ -385,6 +528,62 @@ LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit, ) ) +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)) */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) + +LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_pages, + + writeback_balance_dirty_pages, + + TP_PROTO(struct bdi_writeback *wb, + unsigned long thresh, + unsigned long bg_thresh, + unsigned long dirty, + unsigned long bdi_thresh, + unsigned long bdi_dirty, + unsigned long dirty_ratelimit, + unsigned long task_ratelimit, + unsigned long dirtied, + unsigned long period, + long pause, + unsigned long start_time), + + TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, + dirty_ratelimit, task_ratelimit, + dirtied, period, pause, start_time + ), + + TP_FIELDS( + ctf_array_text(char, bdi, dev_name(wb->bdi->dev), 32) + ctf_integer(unsigned long, limit, global_dirty_limit) + ctf_integer(unsigned long, setpoint, + (global_dirty_limit + (thresh + bg_thresh) / 2) / 2) + ctf_integer(unsigned long, dirty, dirty) + ctf_integer(unsigned long, bdi_setpoint, + ((global_dirty_limit + (thresh + bg_thresh) / 2) / 2) * + bdi_thresh / (thresh + 1)) + ctf_integer(unsigned long, bdi_dirty, bdi_dirty) + ctf_integer(unsigned long, dirty_ratelimit, + KBps(dirty_ratelimit)) + ctf_integer(unsigned long, task_ratelimit, + KBps(task_ratelimit)) + ctf_integer(unsigned int, dirtied, dirtied) + ctf_integer(unsigned int, dirtied_pause, + current->nr_dirtied_pause) + ctf_integer(unsigned long, paused, + (jiffies - start_time) * 1000 / HZ) + ctf_integer(long, pause, pause * 1000 / HZ) + ctf_integer(unsigned long, period, + period * 1000 / HZ) + ctf_integer(long, think, + current->dirty_paused_when == 0 ? 0 : + (long)(jiffies - current->dirty_paused_when) * 1000/HZ) + ) +) + +#else /* #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_pages, writeback_balance_dirty_pages, @@ -442,7 +641,9 @@ LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_pages, #endif ) ) -#endif +#endif /* #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)) */ + +#endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)) LTTNG_TRACEPOINT_EVENT(writeback_sb_inodes_requeue, @@ -452,7 +653,7 @@ LTTNG_TRACEPOINT_EVENT(writeback_sb_inodes_requeue, TP_FIELDS( ctf_array_text(char, name, - dev_name(inode_to_bdi(inode)->dev), 32) + dev_name(lttng_inode_to_bdi(inode)->dev), 32) ctf_integer(unsigned long, ino, inode->i_ino) ctf_integer(unsigned long, state, inode->i_state) ctf_integer(unsigned long, dirtied_when, inode->dirtied_when) @@ -500,7 +701,7 @@ LTTNG_TRACEPOINT_EVENT_CLASS(writeback_single_inode_template, TP_FIELDS( ctf_array_text(char, name, - dev_name(inode_to_bdi(inode)->dev), 32) + dev_name(lttng_inode_to_bdi(inode)->dev), 32) ctf_integer(unsigned long, ino, inode->i_ino) ctf_integer(unsigned long, state, inode->i_state) ctf_integer(unsigned long, dirtied_when, inode->dirtied_when) @@ -532,4 +733,4 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_single_inode_template, writeback_singl #endif /* LTTNG_TRACE_WRITEBACK_H */ /* This part must be outside protection */ -#include "../../../probes/define_trace.h" +#include