History

/proc/module: use the same logic as /proc/kallsyms for address exposure

The (alleged) users of the module addresses are the same: kernel profiling. So just expose the same helper and format macros, and unify the logic.

Linus Torvalds committed 9 years ago

Commit 516fb7f1 parent 277642d3 files · +27 −9Browse files

Unified · Split

3 files
  1. include/linux/kallsyms.h +8 −0
  2. kernel/kallsyms.c +1 −7
  3. kernel/module.c +18 −2
include/linux/kallsyms.h+8−0
@@ -14,6 +14,14 @@ · 13 unmodified lines
1414 #define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \
1515 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1)
1616
17+/* How and when do we show kallsyms values? */
18+extern int kallsyms_show_value(void);
19+#ifndef CONFIG_64BIT
20+# define KALLSYM_FMT "%08lx"
21+#else
22+# define KALLSYM_FMT "%016lx"
23+#endif
24+
1725 struct module;
1826
1927 #ifdef CONFIG_KALLSYMS
kernel/kallsyms.c+1−7
@@ -581,12 +581,6 @@ static void s_stop(struct seq_file *m, void *p) · 580 unmodified lines
581581 {
582582 }
583583
584−#ifndef CONFIG_64BIT
585−# define KALLSYM_FMT "%08lx"
586−#else
587−# define KALLSYM_FMT "%016lx"
588−#endif
589−
590584 static int s_show(struct seq_file *m, void *p)
591585 {
592586 unsigned long value;
@@ -640,7 +634,7 @@ static inline int kallsyms_for_perf(void) · 47 unmodified lines
640634 * Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to
641635 * block even that).
642636 */
643−static int kallsyms_show_value(void)
637+int kallsyms_show_value(void)
644638 {
645639 switch (kptr_restrict) {
646640 case 0:
kernel/module.c+18−2
@@ -4147,6 +4147,7 @@ static int m_show(struct seq_file *m, void *p) · 4146 unmodified lines
41474147 {
41484148 struct module *mod = list_entry(p, struct module, list);
41494149 char buf[MODULE_FLAGS_BUF_SIZE];
4150+ unsigned long value;
41504151
41514152 /* We always ignore unformed modules. */
41524153 if (mod->state == MODULE_STATE_UNFORMED)
@@ -4162,7 +4163,8 @@ static int m_show(struct seq_file *m, void *p) · 9 unmodified lines
41624163 mod->state == MODULE_STATE_COMING ? "Loading" :
41634164 "Live");
41644165 /* Used by oprofile and other similar tools. */
4165− seq_printf(m, " 0x%pK", mod->core_layout.base);
4166+ value = m->private ? 0 : (unsigned long)mod->core_layout.base;
4167+ seq_printf(m, " 0x" KALLSYM_FMT, value);
41664168
41674169 /* Taints info */
41684170 if (mod->taints)
@@ -4184,9 +4186,23 @@ static const struct seq_operations modules_op = { · 15 unmodified lines
41844186 .show = m_show
41854187 };
41864188
4189+/*
4190+ * This also sets the "private" pointer to non-NULL if the
4191+ * kernel pointers should be hidden (so you can just test
4192+ * "m->private" to see if you should keep the values private).
4193+ *
4194+ * We use the same logic as for /proc/kallsyms.
4195+ */
41874196 static int modules_open(struct inode *inode, struct file *file)
41884197 {
4189− return seq_open(file, &modules_op);
4198+ int err = seq_open(file, &modules_op);
4199+
4200+ if (!err) {
4201+ struct seq_file *m = file->private_data;
4202+ m->private = kallsyms_show_value() ? NULL : (void *)8ul;
4203+ }
4204+
4205+ return 0;
41904206 }
41914207
41924208 static const struct file_operations proc_modules_operations = {