binder: convert logging macros into functions
authorCarlos Llamas <cmllamas@google.com>
Fri, 29 Apr 2022 23:56:43 +0000 (23:56 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 May 2022 13:43:24 +0000 (15:43 +0200)
Converting binder_debug() and binder_user_error() macros into functions
reduces the overall object size by 16936 bytes when cross-compiled with
aarch64-linux-gnu-gcc 11.2.0:

$ size drivers/android/binder.o.{old,new}
   text    data     bss     dec     hex filename
  77935    6168   20264  104367   197af drivers/android/binder.o.old
  65551    1616   20264   87431   15587 drivers/android/binder.o.new

This is particularly beneficial to functions binder_transaction() and
binder_thread_write() which repeatedly use these macros and are both
part of the critical path for all binder transactions.

$ nm --size vmlinux.{old,new} |grep ' binder_transaction$'
0000000000002f60 t binder_transaction
0000000000002358 t binder_transaction

$ nm --size vmlinux.{old,new} |grep binder_thread_write
0000000000001c54 t binder_thread_write
00000000000014a8 t binder_thread_write

Acked-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Acked-by: Todd Kjos <tkjos@google.com>
Signed-off-by: Carlos Llamas <cmllamas@google.com>
Link: https://lore.kernel.org/r/20220429235644.697372-5-cmllamas@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/android/binder.c

index 4c2caf3..88f5028 100644 (file)
@@ -133,19 +133,36 @@ static int binder_set_stop_on_user_error(const char *val,
 module_param_call(stop_on_user_error, binder_set_stop_on_user_error,
        param_get_int, &binder_stop_on_user_error, 0644);
 
-#define binder_debug(mask, x...) \
-       do { \
-               if (binder_debug_mask & mask) \
-                       pr_info_ratelimited(x); \
-       } while (0)
+static __printf(2, 3) void binder_debug(int mask, const char *format, ...)
+{
+       struct va_format vaf;
+       va_list args;
 
-#define binder_user_error(x...) \
-       do { \
-               if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) \
-                       pr_info_ratelimited(x); \
-               if (binder_stop_on_user_error) \
-                       binder_stop_on_user_error = 2; \
-       } while (0)
+       if (binder_debug_mask & mask) {
+               va_start(args, format);
+               vaf.va = &args;
+               vaf.fmt = format;
+               pr_info_ratelimited("%pV", &vaf);
+               va_end(args);
+       }
+}
+
+static __printf(1, 2) void binder_user_error(const char *format, ...)
+{
+       struct va_format vaf;
+       va_list args;
+
+       if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) {
+               va_start(args, format);
+               vaf.va = &args;
+               vaf.fmt = format;
+               pr_info_ratelimited("%pV", &vaf);
+               va_end(args);
+       }
+
+       if (binder_stop_on_user_error)
+               binder_stop_on_user_error = 2;
+}
 
 #define binder_set_extended_error(ee, _id, _command, _param) \
        do { \