Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750991AbbGLOFk (ORCPT ); Sun, 12 Jul 2015 10:05:40 -0400 Received: from mail-qk0-f170.google.com ([209.85.220.170]:36091 "EHLO mail-qk0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750736AbbGLOFi (ORCPT ); Sun, 12 Jul 2015 10:05:38 -0400 MIME-Version: 1.0 From: Denys Vlasenko Date: Sun, 12 Jul 2015 16:05:18 +0200 Message-ID: Subject: Automated search for inline bloat To: Linux Kernel Mailing List , Andrew Morton Content-Type: multipart/mixed; boundary=001a11474bac81ebb0051aae1919 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 12797 Lines: 237 --001a11474bac81ebb0051aae1919 Content-Type: text/plain; charset=UTF-8 The scripts are in attached tarball. Is there interest in putting them in, say, scripts/inline_bloat/ in the kernel tree? ============================================ Inline hunting. There are outrageously big inlines in kernel. Finding them by hand is inefficient, if you want to handle the worst of them first. Let's automate it. Inline hunting in header files is done by replacing "inline" with "noinline", rebuilding vmlinux, and seeing how much smaller it becomes. (The accounting is more complex than simple comparison of "size vmlinux" before and after, since deinlined function body is repeated in each object file it is called from). HOWTO. * Find a machine with lots of CPUs. * Start with an empty work directory. * Copy these scripts into it. * git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git * cd linux && make oldconfig && make -j99 && cp vmlinux vmlinux.original * Edit conf.py - this is crucial to optimally parallelize the next step, which consumes most of the time (usually a day or more). * Run ./1start. Now parallel build jobs are running in linux.N/ dirs. N = conf.py::dir_count. * Run ./2merge_and_sort_results: ... Total inlines to measure:22640, processed:15883 Total inlines to measure:22640, processed:15889 (after 60 seconds) ... (This script generates the final result, inlines.log.measured.sorted, every minute. When all inlines are processed, it will stop) Result files are: inlines_err.log - error messages from inline finding script linux.N/inlines_err.log - each parallel job's stderr inlines.log - all inlines inlines.log.sorted - sorted by line count inlines.log.filtered - selected for measurement (via conf.py::min_lines) inlines.log.measured - measured code size change inlines.log.measured.sorted - sorted, format is: drivers/gpu/drm/radeon/radeon.h:2696:radeon_ring_write:7:46196:73 filename:lineno^^^^^^^^^^^^^^^^^^^^^|inline_name^^^^^^|^|saved|size_of_deinlined_fn !lines_of_source_code IOW: Deinlining radeon_ring_write() shrinks kernel by 46196 bytes. Deinlined function body is 73 bytes of code. Which config to use? Well, we want to look at *all* code, so allyesconfig is a natural choice. However, some options are clearly "heavy debugging" stuff. IOW: many developers run their work machines with lock debugging and such, but only few would *constantly* use something which slows kernel down by a factor of 3. We don't care if inlined function is "too big" only when this sort of config option is in effect. So, CONFIG_KASAN is off. CONFIG_STAGING is also off: we probably don't bother covering semi-broken drivers. CONFIG_CC_OPTIMIZE_FOR_SIZE=y (iow: -Os build) is useful because it eliminates code padding and thus reduces random jitter in code sizes. However, gcc has a problem where it spuriously deinlines functions marked "inline", and it's much more pronounced wit -Os: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66122 Therefore, CONFIG_OPTIMIZE_INLINING needs to be disabled with -Os. It's a good idea anyway: when it's off, build system turns "inline" into "__always_inline", making deinlining code size change much more robust. And we do want to find bad inlines - for that, we should prevent gcc from hiding them! Nevertheless. CONFIG_OPTIMIZE_INLINING=y build is also useful: after it, nm --size-sort vmlinux \ | grep -iF ' t ' \ | uniq -c | grep -v '^ *1 ' | sort -rn nicely shows duplicate same-sized functions, most of them are bogus deinlines by gcc. If you plan to create a patch which forces their inlining (or you work on fixing gcc!), this list is useful. CONFIG_CMDLINE_BOOL should be disabled, otherwise test boots in e.g. qemu may fail. [What else to disable?] [CONFIG_FRAME_POINTER?] What do we miss? Macros. (They are also "inlines" of sorts). Some macros even define inline functions (!). Example: #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ static inline notrace int ftrace_get_offsets_##call( \ struct ftrace_data_offsets_##call *__data_offsets, proto) \ { \ int __data_size = 0; \ int __maybe_unused __item_length; \ struct ftrace_raw_##call __maybe_unused *entry; \ \ tstruct; \ \ return __data_size; \ } Bad coding practice of this type: Fourteen separate *.c files with #include "echoaudio.c" // contains static functions, they get duplicated... --001a11474bac81ebb0051aae1919 Content-Type: application/x-gzip; name="inline_hunting_v1.tar.gz" Content-Disposition: attachment; filename="inline_hunting_v1.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ic0jwnka0 H4sIAC1zolUCA+08a3PbOJL5av4KhHKNJI9EifJro6wzl81jxnWbZCqPm6pzEg1FQhJjktAQpGXF 8f326wZAChQp2cklmZ09ohKbBoFGo19oNBr0o8CP6GiWRokfTUcXdu/OVy99KMeHh+I3lPXf4tke HB72D47tg/3Bnb69bx8f3yGHd75DSXnixITciRlLtrW76f1ftPgl/g9CGk/pyIm8EWdxMoopT4OE f0P+Hx0e5PwfHEA74P4R8L9f8/+bl8bd3tiPenxmGAnlCelOiAkSkV5adk/KBrcCNrVC6vA0pp5J Pn0i9NJPyO5PhrGY+QElSZzS+8Rjxo7rJET23qvsTT4RlCn4lUb+H+RBVRtjRzTpJkPSPT8k3Tgi laAqO1vYF2AYOw3yBLFkUbAk/oQsKJnHzKWcQ1cnCDKY9wkNOCUBY3NjZ3Ly+8Il3YD8XYc98YOE AuzfjZ2wskE2ODSg7owR8zVLnHwEkjCiWgx3J50VGsPd0DR2BNUvzd2JSU7wd2iSH34g45g650CJ gNI5OeobHouo8X30v29PfNB9hf23t/82GIB91P/B4GDQ3z9G+394PNiv9f876X/KY2ED5stkxiLD D+eof4xnT3zJDcOjEyLkAqWihT8i1oGagHbIgsUebw8NAsWdgRiLirP+O/gnKqWZsGULLNgf2mF3 CyTdE0Db+WvQ14gJS0JXfbDENEnBHjwHbeiInwWIESM/nhBbB4PVgAW5ewKYFWG5DEU+XYFYAEbY 3uLzwE+K6CwIrIdkgaD8SM5vSBqAT8guwKCY+DagUWvRJieAgknGPZcwOT4n5jUhvT0YMQxplJC9 nlnARCq7Nr+MvAuN7kofW0izyAmpondjHvsAMqs1NFqckL74E9/BH2wO+OW9vy5fVjNY58WKukiz TRRukDc8Bau87BAT9DHxXWU9TeLEsMDMKOAUg6EUUCyt3+kk62ESn0fNRDbsoMFPJUwBAgz8ORg4 AguUA+/82COh48ZMh/ULW9ALGndgPJ8DNMIpxcVHjL/wA2816QbQIXZcSgrYkvTogFxMacIj3kK2 7IXMo+0tvRIyGjnBwllyxWBYRsHjcoLED2mLw8rqJgSf+Zy6ZC/hRakUNBWSqTQOpc9Uo5hFHnk0 yJvdAAS0JSPqTTojJEjqQ6HlQjMDhRdCmRDLjMEsVhVrlCi8UcvUqKJyDcWyOG6bPIpzBfbZPEEo InopJd7QJGXCUqBXJqqWZWXiuoItEVYKJTVijWr2GsVE5QaEbqGcNyrpZupsMqC30t0SJYE+lE1u wZRtMmK2TGFp/zzmIlcnaeS24GHFV6ypZmqDvH7x+MUQsAHfb+EnM2JiY1LujwYYp342XFhg2ull C2bbfqdB0mAgGu4MXJS9MjJSZDKQFnoyCcduLXPPbBdnrQ2cPZ7Zw+KgCQVrE6Ur71jhcEWuheKZ V/B7zDwf3jBpFjmCFARxeA64DHTC4oUDNlfBHWbqTyat9n3zZnOS2SngcGGaVzBN5CNwGq0mGHt6 6cB4oZO4M6DVLaQHhe2+mS/rMAJChOdznu8e/KRZnrFFHoGk4Nbg0gnnAR2COCU9f35x0IMHuWvo RZNR5CQjHoXz0djhvmu5w2HoRNMAttieB5trXqHDt5fx28r3Ts4KRy58/kfwW5BhiQ8Ta/EUPDdg IbKv0RgJ+9I2dpQW5SIW03kAS0vLHJmwVDtm2/K5E0Rp2Gp/jpLlDo4yLJs8yzNgcEeI3btKLyRi wKt1YwP+KsiIR+PYWsR+Ashe9a+HVzb8H1wPietILwF0XEjS28i0QDxBYnLvqJOreSeferu9xeMR gMomQZNasWRdSTVqCU9ROM3kAbG1tdeW7a7XlbchJA80b4luSVEfgXsOeCpzJ3YSKZhF8VYLEXgy mUOIBXe9xTFuz5Nr5Mn1fZ0nt+HL5/GGRt6XcWajlhdYAegPPwM7Mmec+2OwBmM2TdEzDH2XBSyq xFGSYA2vAiNki65NulJ2jDUUWJpUEehq/7pyQM3bWNGlow0JuBjQi3h+LF+pB97Jtw4cTSDj1sIJ zltNq6lEMGsoIivKVOVd9EqgsGpbsNBWTxdm1QIooJ7OBrAGSaCAXgYYUckHGer6lNVaIB/ZCLPS WqdvmGBKcyeZWR+YH7Xy+ecbofZqdJ6OM/xg/GzimtMv91rVAFedV2yfO5xL8A3y0LtwIhdsbsqd qVI9cJQ8H+MuQr2b2YhNEA/c6/iwEPOEzXOutMkkZiGsdG4ac+wG6DDsG1Mr40HTmsJqtWECsLtA BZsy2dOJlgSbY1NYGlgMC7u1zituyV1uS0JuG3fq8u8c/4eVe2LNl9/v/GdgD9T5z2Affh7c6dsH B8cHdfzvz4n/GQ3y28OXz0+f/3yXvMZAiIgfCWPkBJyRMbjALI3RlI2XhM8oWik39ucJv2tgIIdK t5kvo8S5RJcePEsAM2awlZBjdIXLw2ddl4VgSmFdpXdx3F/Ygoz9aRZNiSj1RPgchpQ/ncgJluC4 /kSegYGzO+DKXpJ7FnRtvcHAPrSil26QeogD7SKUWMY20L9tG6EfiUWSn9g43iuBPIbloAknrSxg NAU3t60wl8ZPWyVldQhyI9ydMQVAfiQG9aRZVeiroL8I+cV0nPoBhq4UfiMEyE/Mt2BucTjSvSDN 9wljAe81yVvjk1arqFuuF9uOcv1j5qY4qoOufemtF/sXQJUeyP0UVF68L7ZwYnfWO3t/+W69q3hx efb+bxve/O3s/dGmV0c9a2+0P3hrzYbYwgSqvX//Xu6oKNgcD7qwdI5BUxM7c4znEews+CfI18Uo mD/x3UxYQlzB0PMNAtgfKSKTD2zMYaUjS5aShRMlP6F8vGIhTWa4aAb+OSW7j35986pn98ErTAPh fp+TBUoDuGXpFEQFVr+Ri/u7E/te9XAovMDEWDhO1AFEYWAc6zlLMGbpgKswScDdE/gA6hgjZgnH KWJID7vhKh7QbjLDDRduyHyQcPQOzzuGcPqXUvNQ0vDUisNiDd3M0IE5dD/84/Tn52+emSuckKkU 9eEh7IEZxkE5hR4JaoaYcnc3n5iFwVOkkXQKZs4Fqlkk8Hv58Bn4iNQFtDjAw+FGF6E42hu5oXdi Rr4LEi6xuHePqHdm7Rz85dd/4Tw7acJGHpVvvW+c/2HvH63lfxzbdr9e/7/z+X8Ukm6X+x9pVxzA K5XWrLn/lDRJQqSBFwf4XZfopp7s2fBWnfF346i2Bn9B/e/vq3X0q6UA3HD+f3wkz//B/x8cHNhH oP9HB4eDWv//hc7/s8ckBinJ/0rHKpnFyKpw81jyFsiJqLfW6+XpNoZAhDdcCqCNYA3Ctyq6M3bc 83Q+yg4xslDRj8S05Ct5jsAwYIFvNHhaVxmdSeLlKiyiH5BrLTvEjM1VMCeii6qTdGi10FqVQ4iP wIcSMZ6rvh6801Fqrx+d65HaysPCW5wFbj0HLAdIN53/NaqDolmY98q+JopNGKHcEg4tcbWErkLh 7slayzL6ihcKIWxdjgGXzqpFRI7l55jo57RKh85FOLgaYnvg9w0tAX2E/XfSL2NbMWh+nl3Guzjm hoZfNNwtB/u/DHWrgT57mC1xee3EoCnhNm8fki+ai4LqFxNlCqpTMEOFJKTN2rVNi3BvNsfzymET ptREMqAqkat9+H+wWaWsGM3xvGVCi3YHu8n6M3h6t3oEA4nEf9eupLd8CWRHzghFEtvtzHLoACyf 8zke/rX/HTmk6PGA9EsE6Nr/b+a+MetEJtINJTVwzQUKqTgXGMYEBHGcJmCnWq2IuQEM226b0GxN hobvSvDF4T0dYjAoL12RgCUjb3jujrm71IWlAFZRWA4TKngh0yISxu4WgJZPNtensRUfLWnw5AR2 M83qJBodnl0BRr03q6lEKshkfM4CV5Y5MYg6nveG6Gzkcia6twvujgWD88xjoJcunSfkP+lyzJzY O8Wchjida+vurcUwdnwuZyIsHiaKt/ptPbdRA6D8v0vqAlFaTjzNkkgb5CWVR1LEj+YpRq+YjOJi DO3Ji6fED0No4SQUUwY/YCzWj0DbeJ7lDR6eL3OvpxQ8VSbCbQDK2GCNcfRh0UMD6yqRUrRDyMDS lddr/So8QWzTAdcYxPNEf3n66xNRzdKksh5G1+tfvX784s1rOZTslbWCQbGRhYFq2Ha7MO2WmMyJ aRZom3UTrWWdy7winUcsHnl+gdxil9cRWf3YHIYr8CQ7Wczfg4OmGYoyLeGRxSROo6js9sodhDw7 1YlbCUkgVnwvJCrDpL2eNKsSlVG1R2z8Qewq4LeeL0veiJNTE9uYZIHB3xCMOwahMVzOZXgYnCF6 OUqccaBy+mQ61Mk6Fc8kHNgEdB+Kn134qUZU6RFZT3lfQGTPyYNpxeo0XGXqAtmEHvtqOsObU29L bq4yYMVDeJV6bLa/pLNHx+l09EV9xU2IUjZLOclBzCuzhLi8oE+zfbjCFk5Q8iMQ0o+kvcvSFM9s LUtFGbr/coKUPkEhvWFGyBvYEPGPxga0E5yewBuNBTRvF3DP1DINpVzqG+DMkyhMw6MXIv1O7THN HlT0sMa8cZv5UgZtULbVCJZlFai4Wc1BimdCel2zQ9Z36cXMqw1GYKshKGFWYu5Nmq8Rs9/R9sYZ mmp3UdB7MzuT0NPMTXF1qW+SMXWdFJYLEbwURyzijS0VTQU6uMwFLVKw0gisyGduCKOqOGkT7eFu 8z5RiOS+YJbM9K5dGm6D5dC2VX1dZEflyhJn8tC+gMCHGpG2GCFNy4ebdnhrCmgSs2O3wZvqEPuo fQvfueC5IMwKrzif5I+S52WnsgxXuHtra1ERegPnJpJpmpyETNw7cCLhfq7I5bI5XlIA/wxk6ONp 6Ez1bFfwWullEjt4io3poTH6MDK/B0/Al+g8YG6+qMtn0TWKeX5odthEnPcVBkaHhjuR8IitMse7 a8SooK20V2tUUP23LcSmrm2kgpS6ImqACvqJ+KmxtowElP2SkcqAWOxPR1sA6e9L0By81QNWeL0N 6RbmtGV4AWKd1FinDZOtD1jdWTHvZn985WbrVtFoiMWkoTz28Bx86JYpQguUg4Y3FOAXr9Ti11gl qTW2rQ5TP0HL5vmTCSZ9NtbXAaJMBlcgy9SQSWaTibqjw2dsIW7jEDegoGNJTKlYFBoFP89uG0aZ BRvsvIUt8fjcVLmOmRFT2PjRytvNglZ6BKWQ2bgKWlZlUxavQphDIM5+u3j1KjODsKs3NP/txvTF gg9SpiPeFgXCDde8am2HVwwAbA6u52hpHYZbnCuU0dF4maCQKEoobhS9mqp1fXM26/DqAP4fbo8b V7GgsxGj9kYUJkHKZ2sYoixrkMoxECGRW7VDqAUu/2m+A6jcJauVfWcFtUSeCren1LJyFjf5d0qD cRsgn7oONztlGFkxu6FIvMcYZbYGEeCbJDvB8KSg14YEbZUSu6JrBbrvKuq2O5iN7RE3gkZGzpBM HD9IY1ohVu32LWFu4sWGAK9+BcjxPPKaDckMk3piXtmQIWEvfJei7fuPiymNrXMaRzQAOzbd1EPo WFe2+7w+Cz+mAeX883qx0JnftsfYwQw8FhFh7AM2JU9P//nEyjME3j9MkxmY5eInAEQGQZYvYH6R UEsGd8U6J0Sb4c9s2YPHX548fPw/tvltBE4f/U8Su1vQKKacSr3vzsCl+OZUEeN9X3Lc7DUVPSd1 UQATPm/ax76EVZfF5WDWhtl8VtAeXH6Gd6/w7TqUVNwCXplWDOd/5fz7ivyPgfjsy3f7/kPfto/t LP/j2D44xvwPqK3zP75z/pdFrCz5HxNen2FUfUyJbVn3DPWVkjx/Wn6sRHyqRMZNtM/H7NrFj8Ro n3M5EJ9z6XZlowfwU32wxRRp53j7XbjJokv+4RWZoKEiNphtneBGG68I4VXPicOhFUb6YbMtU3KJ XK3IYga+Om6jXdjITynHlFomL3AKkOLbAoC2SNwmnP6R0sgV6bNPYaFS1zo7aA4xTVbqqcNDoFjC 5tyadQA4ZtkS/GzAUmYX4+3/FSYeAvsN0UAIMbZLRGpwR5xnSJA8T03Gs6vOFmiY2Pvzw9PnFvkH TdSsy2iR5/KTATgph8Rs0ZGRDFUt8tWhM5/Df5nFzzDsIWjC7xoyn4+S5vDM7t57d9bPfuztNrHe HJ7tXuWScA0v3u6aOVNhNZ/hqm7uFjLdFbczltaJwv+y+X+2iN9/zTFusP/7dp7/t2/bffz+18H+ /mFt//9M+39FMnsudgI9C9/4UzT4xRfr0Zf75Bqt/1X2LaxidxmWqegGlh8MFtp+WDd4YkJ3ua5c K3v0B3n/6MXzp6c/j178+vr02el/PxmdPv/nKd5TOlmWkczG78J+5K3xmxNHImyyCYT82ktA3QRN 9tR1MXWD8Hka+yzlwXK1CVZ+UQdMc0Rjmdkn7oV46TwQZ7NGdqteGOAsAonmPnTEN2h8vGwRe9qH wbIrQ+OAOYlFXlFq7MySZM6HvR4gY02jFLdevXE6/egHgdPDANoI/rLcqf+T750cHdmDgWFWUOvR o9Vsn754OXoFDyWCaQyrJlgVFKSZWKxzuj0M/Gkk7jvNYQsssjXwZEVcExGbCREx0u9F4ZYUL62M A1h2EX3DkGLz1I8QQEe4AiJUGAk/AFYPefFVHo5gnE/FxEyjZbgeUactnzK/JJNWJdmax+LOiZVL PLEM+KP47bPCJ+bE64JrrH+WzohDbRCjTQYPfrBhLUwoJV0naznCPQW2LqpQ1cfmKnSostlmtQkv yuD3YJqGIW/Abf/UnWyz25IbsF5+aYj8SGzY7ki8nkl5Xl0pyk4pWDa1jrwYJT4jslugmnBdKKKM m9VqNEQYV3yB6XdwzoitjfS7+uDgHMkreS4Nym6kMX8HP9HlePKjIKDFpnJelfDgZWoRGTZ2pNqE 4LaoJhY4LBnEStKbGXcew65smI9uym/1yVcvaej4IgtiEoMkiLSlIbSYkO5MsEI2ezV3FpEUa1/Y AU1PsFpcIJPHcfhpRfNmurSANF4lRWBfzn2PiPtbKNLr2f7VnCAPKj+3CGL+YE22yQ/GTntlSyyd HEip2vOrS13qUpe61KUudalLXepSl7rUpS51qUtd6lKXutSlLnWpS13qUpe61KUudfmq5X8B4QTF yAB4AAA= --001a11474bac81ebb0051aae1919-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/