platform_system_core/logd
Mark Salyzyn 807e40ecc9 liblog: logd: Add android_lookupEventTag_len()
Allows us to mitigate the impact of MAP_PRIVATE and copy on write by
calling android_lookupEventTag_len instead of android_lookupEventTag,
and delaying the copy on write impact to the later.  We return a
string length in a supplied location along with the string pointer
with android_lookupEventTag_len(const EventTagMap* map, size_t* len,
int tag).  The string is not guaranteed to be nul terminated.  Since
android_lookupEventTag() called even once can cause the memory
impact, we will mark it as deprecated, but we currently have no
timeframe for removal since this is a very old interface.

Add an API for __android_log_is_loggable_len() that accepts the non
null terminated content and fixup callers that would gain because the
length is known prior to the call either in the compiler or at
runtime.  Tackle transition to android_lookupEventTag_len() and
fixup callers.

On any application that performs logging (eg: com.android.phone)

/proc/<pid>/smaps before:

xxxxxxxxxx-xxxxxxxxxx rw-p 00000000 fd:00 463 /system/etc/event-log-tags
Size:                 20 kB
Rss:                  20 kB
Pss:                   1 kB
Shared_Clean:          0 kB
Shared_Dirty:         20 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:            20 kB
AnonHugePages:         0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac

/proc/<pid>/smaps after:

xxxxxxxxxx-xxxxxxxxxx rw-p 00000000 fd:00 1773 /system/etc/event-log-tags
Size:                 20 kB
Rss:                  20 kB
Pss:                   1 kB
Shared_Clean:         20 kB  (was 0kB)
Shared_Dirty:          0 kB  (was 20kB)
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           20 kB  (was 0kB)
Anonymous:             0 kB  (was 20kB)
AnonHugePages:         0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac

Added liblog-unit-tests --gtest_filter=liblog.event_log_tags to
check for Shared_Clean: to not be 0 and Anonymous: to be 0 for
all processes referencing event-log-tags.  Which can include multiple
references to /system/etc/event-log-tags and future possible refs to
/data/misc/logd/event-log-tags and /dev/event-log-tags.  We want
failure messages to help point to errant code using the deprecated
interface.

This change saves 1/4MB of memory or more on a typical system.

Test: gTest liblog-unit-tests
Bug: 31456426
Change-Id: I9e08e44d9092bd96fe704b5709242e7195281d33
2016-10-03 11:08:34 -07:00
..
tests logd: logcat: Replace log/log.h with android/log.h 2016-09-30 12:47:05 -07:00
Android.mk Merge \"logd: Use Minijail for privilege dropping.\" 2016-07-20 15:07:32 +00:00
CommandListener.cpp logd: statistics per-pid filter 2015-12-18 13:17:37 -08:00
CommandListener.h Fix google-explicit-constructor warnings in logd. 2016-08-02 11:31:44 -07:00
event.logtags logd: Replace logd with chatty log tag 2016-07-15 14:57:58 -07:00
FlushCommand.cpp logd: Allow (some) headers to be individually importable 2016-02-25 12:42:31 -08:00
FlushCommand.h liblog: logd: logcat: deprecate log/log_read.h 2016-09-30 12:47:05 -07:00
libaudit.c logd: logcat: Replace log/log.h with android/log.h 2016-09-30 12:47:05 -07:00
libaudit.h logd: throttle SELinux denials to 20/sec 2014-11-19 13:35:36 -08:00
LogAudit.cpp Merge \"logd: auditd: suppress multiple identical avc: messages to kmsg\" 2016-07-20 20:37:41 +00:00
LogAudit.h Revert "logd: enforce policy integrity" 2016-06-14 11:14:51 -07:00
LogBuffer.cpp liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
LogBuffer.h logd: logcat: Replace log/log.h with android/log.h 2016-09-30 12:47:05 -07:00
LogBufferElement.cpp liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
LogBufferElement.h logd: logcat: Replace log/log.h with android/log.h 2016-09-30 12:47:05 -07:00
LogCommand.cpp logd: liblog: logcat: Add LOG_ID_SECURITY 2015-12-08 16:46:29 -08:00
LogCommand.h Fix google-explicit-constructor warnings in system/core. 2016-07-26 11:26:01 -07:00
logd.rc init.rc: too many start logd 2016-02-02 16:01:17 -08:00
LogKlog.cpp logd: klogd crash (part deux) 2016-08-11 16:13:01 -07:00
LogKlog.h liblog: logd: logcat: deprecate log/log_read.h 2016-09-30 12:47:05 -07:00
LogListener.cpp Use alignas for alignment. 2016-06-06 19:59:45 -07:00
LogListener.h logd: initial checkin. 2014-02-26 09:52:35 -08:00
LogReader.cpp logd: sock_alloc_send_pskb starves pruning 2016-02-25 12:43:12 -08:00
LogReader.h Fix google-explicit-constructor warnings in system/core. 2016-07-26 11:26:01 -07:00
LogStatistics.cpp liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
LogStatistics.h liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
LogTimes.cpp logd: clarify release_Locked() for static analyzer 2016-03-02 11:37:21 -08:00
LogTimes.h logd: logcat: Replace log/log.h with android/log.h 2016-09-30 12:47:05 -07:00
LogUtils.h liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
LogWhiteBlackList.cpp logd: Add worst pid of system filter 2015-12-29 09:32:35 -08:00
LogWhiteBlackList.h logd: Add worst pid of system filter 2015-12-29 09:32:35 -08:00
main.cpp liblog: logd: Add android_lookupEventTag_len() 2016-10-03 11:08:34 -07:00
README.auditd logd: selinux auditd initial commit 2014-04-07 10:51:00 -07:00
README.property Merge \"logcatd: trampoline persist.logd.logpersistd to logd.logpersistd\" 2016-07-13 18:02:23 +00:00

The properties that logd and friends react to are:

name                       type default  description
ro.logd.auditd             bool   true   Enable selinux audit daemon
ro.logd.auditd.dmesg       bool   true   selinux audit messages duplicated and
                                         sent on to dmesg log
persist.logd.security      bool   false  Enable security buffer.
ro.device_owner            bool   false  Override persist.logd.security to false
ro.logd.kernel             bool+ svelte+ Enable klogd daemon
ro.logd.statistics         bool+ svelte+ Enable logcat -S statistics.
ro.debuggable              number        if not "1", logd.statistics &
                                         ro.logd.kernel default false.
logd.logpersistd.enable    bool   auto   Safe to start logpersist daemon service
logd.logpersistd          string persist Enable logpersist daemon, "logcatd"
                                         turns on logcat -f in logd context.
					 Responds to logcatd, clear and stop.
logd.logpersistd.buffer          persist logpersistd buffers to collect
logd.logpersistd.size            persist logpersistd size in MB
persist.logd.logpersistd   string        Enable logpersist daemon, "logcatd"
                                         turns on logcat -f in logd context.
persist.logd.logpersistd.buffer    all   logpersistd buffers to collect
persist.logd.logpersistd.size      256   logpersistd size in MB
persist.logd.size          number  ro    Global default size of the buffer for
                                         all log ids at initial startup, at
                                         runtime use: logcat -b all -G <value>
ro.logd.size               number svelte default for persist.logd.size. Larger
                                         platform default sizes than 256KB are
                                         known to not scale well under log spam
                                         pressure. Address the spam first,
                                         resist increasing the log buffer.
persist.logd.size.<buffer> number  ro    Size of the buffer for <buffer> log
ro.logd.size.<buffer>      number svelte default for persist.logd.size.<buffer>
ro.config.low_ram          bool   false  if true, logd.statistics, logd.kernel
                                         default false, logd.size 64K instead
                                         of 256K.
persist.logd.filter        string        Pruning filter to optimize content.
                                         At runtime use: logcat -P "<string>"
ro.logd.filter       string "~! ~1000/!" default for persist.logd.filter.
                                         This default means to prune the
                                         oldest entries of chattiest UID, and
                                         the chattiest PID of system
                                         (1000, or AID_SYSTEM).
persist.logd.timestamp     string  ro    The recording timestamp source.
                                         "m[onotonic]" is the only supported
                                         key character, otherwise realtime.
ro.logd.timestamp        string realtime default for persist.logd.timestamp
log.tag                   string persist The global logging level, VERBOSE,
                                         DEBUG, INFO, WARN, ERROR, ASSERT or
                                         SILENT. Only the first character is
                                         the key character.
persist.log.tag            string build  default for log.tag
log.tag.<tag>             string persist The <tag> specific logging level.
persist.log.tag.<tag>      string build  default for log.tag.<tag>

NB:
- auto - managed by /init
- bool+ - "true", "false" and comma separated list of "eng" (forced false if
  ro.debuggable is not "1") or "svelte" (forced false if ro.config.low_ram is
  true).
- svelte - see ro.config.low_ram for details.
- svelte+ - see ro.config.low_ram and ro.debuggable for details.
- ro - <base property> temporary override, ro.<base property> platform default.
- persist - <base property> override, persist.<base property> platform default.
- build - VERBOSE for native, DEBUG for jvm isLoggable, or developer option.
- number - support multipliers (K or M) for convenience. Range is limited
  to between 64K and 256M for log buffer sizes. Individual log buffer ids
  such as main, system, ... override global default.
- Pruning filter is of form of a space-separated list of [~][UID][/PID]
  references, where '~' prefix means to blacklist otherwise whitelist. For
  blacklisting, UID or PID may be a '!' to instead reference the chattiest
  client, with the restriction that the PID must be in the UID group 1000
  (system or AID_SYSTEM).