The vlog function is called for each log generated by charon.
Even if nobody is listening for these logs, vlog acquires the log
lock.

Under high load, this useless lock/unlock hogs a lot of CPU.

Avoid this useless locking by checking if somebody is listening for logs.

perf report before patch:

+  49.87%  charon  [kernel.kallsyms]                [k] do_raw_spin_lock
+  23.84%  charon  libcrypto.so.1.0.0               [.] 0xbc65e
+   2.32%  charon  libc-2.13.so                     [.] 0x7706e
+   1.59%  charon  libpthread-2.13.so               [.] pthread_rwlock_rdlock
+   1.25%  charon  libpthread-2.13.so               [.] pthread_rwlock_unlock
+   0.97%  charon  libpthread-2.13.so               [.] __lll_lock_wait
+   0.96%  charon  libcharon.so.0.0.0               [.] vlog

perf report after patch:

+  56.53%  charon  libcrypto.so.1.0.0               [.] 0xbc978
+   5.95%  charon  libc-2.13.so                     [.] 0x79939
+   1.92%  charon  [kernel.kallsyms]                [k] native_write_msr_safe
+   1.73%  charon  libc-2.13.so                     [.] malloc

Signed-off-by: Christophe Gouault <[email protected]>
---
 src/libcharon/bus/bus.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/libcharon/bus/bus.c b/src/libcharon/bus/bus.c
index b461848..5daa7fd 100644
--- a/src/libcharon/bus/bus.c
+++ b/src/libcharon/bus/bus.c
@@ -324,6 +324,10 @@ METHOD(bus_t, vlog, void,
        linked_list_t *loggers;
        log_data_t data;
 
+       if (this->max_level[group] < level &&
+               this->max_vlevel[group] < level)
+               return;
+
        this->log_lock->read_lock(this->log_lock);
        loggers = this->loggers[group];
 
-- 
1.7.10.4

_______________________________________________
Dev mailing list
[email protected]
https://lists.strongswan.org/mailman/listinfo/dev

Reply via email to