Commit 7c2bd2f9 authored by Joe Perches's avatar Joe Perches Committed by Linus Torvalds

ocfs2: reduce object size of mlog uses

Using a function for __mlog_printk instead of a macro reduces the object
size of built-in.o by about 190KB, or ~18% overall (x86-64 defconfig
with all ocfs2 options)

  $ size fs/ocfs2/built-in.o*
     text    data     bss     dec     hex filename
   870954  118471  134408 1123833  1125f9 fs/ocfs2/built-in.o,new
  1064081  118071  134408 1316560  1416d0 fs/ocfs2/built-in.o.old

Miscellanea:

 - Move the used-once __mlog_cpu_guess statement expression macro to the
   masklog.c file above the use in __mlog_printk function

 - Simplify the mlog macro moving the and/or logic and level code into
   __mlog_printk

[akpm@linux-foundation.org: export __mlog_printk() to other ocfs2 modules]
Signed-off-by: default avatarJoe Perches <joe@perches.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5286d20c
...@@ -64,6 +64,53 @@ static ssize_t mlog_mask_store(u64 mask, const char *buf, size_t count) ...@@ -64,6 +64,53 @@ static ssize_t mlog_mask_store(u64 mask, const char *buf, size_t count)
return count; return count;
} }
/*
* smp_processor_id() "helpfully" screams when called outside preemptible
* regions in current kernels. sles doesn't have the variants that don't
* scream. just do this instead of trying to guess which we're building
* against.. *sigh*.
*/
#define __mlog_cpu_guess \
({ \
unsigned long _cpu = get_cpu(); \
put_cpu(); \
_cpu; \
})
void __mlog_printk(const u64 *mask, const char *func, int line,
const char *fmt, ...)
{
struct va_format vaf;
va_list args;
const char *level;
const char *prefix = "";
if (!__mlog_test_u64(*mask, mlog_and_bits) ||
__mlog_test_u64(*mask, mlog_not_bits))
return;
if (*mask & ML_ERROR) {
level = KERN_ERR;
prefix = "ERROR: ";
} else if (*mask & ML_NOTICE) {
level = KERN_NOTICE;
} else {
level = KERN_INFO;
}
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
printk("%s(%s,%u,%lu):%s:%d %s%pV",
level, current->comm, task_pid_nr(current), __mlog_cpu_guess,
func, line, prefix, &vaf);
va_end(args);
}
EXPORT_SYMBOL_GPL(__mlog_printk);
struct mlog_attribute { struct mlog_attribute {
struct attribute attr; struct attribute attr;
u64 mask; u64 mask;
......
...@@ -162,38 +162,20 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; ...@@ -162,38 +162,20 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits;
#endif #endif
/* __printf(4, 5)
* smp_processor_id() "helpfully" screams when called outside preemptible void __mlog_printk(const u64 *m, const char *func, int line,
* regions in current kernels. sles doesn't have the variants that don't const char *fmt, ...);
* scream. just do this instead of trying to guess which we're building
* against.. *sigh*.
*/
#define __mlog_cpu_guess ({ \
unsigned long _cpu = get_cpu(); \
put_cpu(); \
_cpu; \
})
/* In the following two macros, the whitespace after the ',' just /*
* before ##args is intentional. Otherwise, gcc 2.95 will eat the * Testing before the __mlog_printk call lets the compiler eliminate the
* previous token if args expands to nothing. * call completely when (m & ML_ALLOWED_BITS) is 0.
*/ */
#define __mlog_printk(level, fmt, args...) \ #define mlog(mask, fmt, ...) \
printk(level "(%s,%u,%lu):%s:%d " fmt, current->comm, \ do { \
task_pid_nr(current), __mlog_cpu_guess, \ u64 _m = MLOG_MASK_PREFIX | (mask); \
__PRETTY_FUNCTION__, __LINE__ , ##args) if (_m & ML_ALLOWED_BITS) \
__mlog_printk(&_m, __func__, __LINE__, fmt, \
#define mlog(mask, fmt, args...) do { \ ##__VA_ARGS__); \
u64 __m = MLOG_MASK_PREFIX | (mask); \
if ((__m & ML_ALLOWED_BITS) && \
__mlog_test_u64(__m, mlog_and_bits) && \
!__mlog_test_u64(__m, mlog_not_bits)) { \
if (__m & ML_ERROR) \
__mlog_printk(KERN_ERR, "ERROR: "fmt , ##args); \
else if (__m & ML_NOTICE) \
__mlog_printk(KERN_NOTICE, fmt , ##args); \
else __mlog_printk(KERN_INFO, fmt , ##args); \
} \
} while (0) } while (0)
#define mlog_errno(st) ({ \ #define mlog_errno(st) ({ \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment