Refactor kernel strings - Results

Jump to: navigation, search

Final report for the task Refactor Kernel Strings



  • parsing a diff can be helpful to get an estimate of what can be achieved
  • for precise results, bloat-o-meter from the kernel scripts directory is way better
  • some patches for dealing with .rodata were needed
  • will be send out after v4.8-rc1 aiming for v4.9.
  • git:// strings/bloat-o-meter


To calculate savings for a whole patch series, a custom script (File:Ninja-measure-bloat.txt) based on the following pseudo-code was created:

for (commit_range)

    if not cached
        build objs before commit
        build objs after commit

    for (objs)
        bloat-o-meter before after

    print sum_commit

print sum_range

proper .config

  • allyesconfig difficult to use (doesn't build on ARM32; builds a lot of noise)
  • make defconfig for x86-32 with CONFIG_OLPC turned out to be a good candidate

Centralizing filesystems

Suggesting fs_err

  • we have good experiences with dev_err and friends for struct device
  • we could introduce something like fs_err for struct super_block
  • quick tests showed, it could save a few KB for some filesystems
  • found a questionable use case of dev_err while evaluating

side track: dev_err & __func__

  • looks pretty useless when the error message is unique
  • __func__ is pretty expensive
  • Removing all occurences removes easily >60K (measured by parsing the >850K diff)
  • needs to be manually reviewed, though
  • example series for the RTC subsystem (18 patches, saved 156 byte/driver average, altogether saves >2.5K (5.1%))
  • will be send out after v4.8-rc1 aiming for v4.9.
  • git:// strings/rtc-no-func
  • more promising than fs_err for now

Centralizing USB

centralizing usb_submit_urb()

  • lots of hits for this function when searching for dev_err and __func__
  • a lot of returned %d messages with little value
  • gkh says all messages can go
  • usb_submit_urb() itself prints a few error messages, yet not on all exit paths
  • this should be done first
  • then, we can save ~20K from ~120 drivers
  • preparational changes in 4.9, removals in 4.10?

-ENOMEM messages for usb_alloc_urb() already centralized

  • Some callers of usb_alloc_urb() print -ENOMEM messages which is totally unneeded and removing those saves 4K in 53 drivers.
  • (update: with an improved coccinelle script, the savings were >6KB)
  • will be send out after v4.8-rc1 aiming for v4.9.
  • git:// strings/usb_alloc_urb

fix usb-skeleton.c, too

  • template for new usb drivers
  • problems present here get copied over numerous times
  • removing aforementioned issues saves not much in byte, but scales awesomely well :)
  • will be fixed together with the series above
  • such drivers need special care

Centralizing I2C

save strings when i2c_add_adapter() returns errors

preparing the i2c core

  • 7 patches to prepare i2c_add_adapter
    • added 3 error messages
    • improved 4 error messages
    • 1 refactoring (saving bytes already)
    • 1 resource leak bugfix(!)
  • all drivers have common and precise error messages for free

fixing the drivers

  • 64 removals across the tree
  • saving around 3K of variuos permutations of registering failed
  • and more considering the future (i.e. scales well)
  • ~50 bytes/driver (half .rodata, half .text)

save strings when i2c_add_adapter returns success

  • more difficult than expected
  • drivers print various additional information
  • some of them are not available to the I2C core
  • some could be, but are not currently (e.g. bus speed)
  • would need bigger refactoring, beyond the scope of this task
  • for further activities, focus on error paths
  • interesting viewpoint nonetheless


This time...

  • about 30K of strings removed
  • tools are ready and workflow is in place
  • reference examples on the way to mainline

a LOT of work still to be done

  • help is much appreciated
  • it is not strictly janitorial, though
  • focus on removing error strings first
  • reviewing patches to improve coccinelle scripts takes most time