Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752733AbdGFNFQ (ORCPT ); Thu, 6 Jul 2017 09:05:16 -0400 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:38631 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752219AbdGFNFN (ORCPT ); Thu, 6 Jul 2017 09:05:13 -0400 Authentication-Results: kvack.org; dkim=none (message not signed) header.d=none;kvack.org; dmarc=none action=none header.from=fb.com; From: Roman Gushchin To: CC: Roman Gushchin , Andrew Morton , Mel Gorman , Johannes Weiner , Michal Hocko , Vladimir Davydov , Rik van Riel , , Subject: [PATCH] mm: make allocation counters per-order Date: Thu, 6 Jul 2017 14:04:31 +0100 Message-ID: <1499346271-15653-1-git-send-email-guro@fb.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [2620:10d:c092:200::1:c422] X-ClientProxiedBy: AM4PR0202CA0020.eurprd02.prod.outlook.com (10.171.80.30) To SN2PR15MB1088.namprd15.prod.outlook.com (10.169.192.138) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5af63c05-74d4-4d6d-d699-08d4c46f95e1 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:SN2PR15MB1088; X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;3:TeUC0Q8S2u/X+/eGvlrYvarre0ZW1vSLDxkwdngJ0FAhGqWBz59DXMhtu9nMRFEnZfXoEsBieaLUQWvS+r7rLVQavChvlUp9cVOPjGMBJoM2x2+38ICNuXpL6RO/OVG4iYKi0Di8+p3rkNdVkKRbo6KNj3UfE+0VIRsIUm3aBHhrHFHbxL0sRBVNmN0XBf+BlCKH9xLxJd4JIpH46tnyqsL21DSygJ6Q5rDhKDDDYygQzLylKFWbYIEjT0cQGE8DVdywhi2m0DY2MrFah/yfZhWZlLU1q0y4XG0PEh7UcCAitKbjushQWUpouufdy8s559kTRAzlnJ4tQWgZMpG1OlMINFDbAsCRkheiTit4+o6NqVUDxG182ZybT2i1oHG01pH9rPPTqh3UX6AtGW6I2QIZgcvS0w6Lsb71+Bqi1O3ncX5Jox2n6iYMEytxjthp2ekU6R/I4TccDACEXmU6vNxYObxi7TervECOc2TWeyIhPEMT/KwLgWTvoegtImnKLp1eMBgOnO42uSEFlTE1UlepkxenZdwOMx3C3yl5RzttZzFuNG54yzTmn7m6MGD803iMqW7tUNPKYm3ofWgKq9UyaOD4JHjAwQR706OIBIAP8rTg7S0zMIHD2eNDoJdKFAdmsE+mTFPUvr2WRTk0Kc1hfvqlrXidepMq6aZMnrz39OAbUqMvbOpls041cZHPgBFCJ16tyGtLh4rVoh7Gren8MoJoosH+4G4BnY98PaCIQtvbfH4Dl/zwTlitpzE5 X-MS-TrafficTypeDiagnostic: SN2PR15MB1088: X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;25:NraaNpZVgV92+HS7peD9dNf4YxBR2ssli/CCT9HCmr1lWlcwHt1EzfwCbYGL14Z9lpn0/pwA57ekn4ZQC2Of3ymlyzpacWhqPZowCM1Iv6iuYfH8CFRfCpy8eIufmdKL+stnZePn7VerKId0E8EC6g9tJCXFuJQPLebt6qDRY+zMKvcf1adEuZ0rW9rozmUlnMnbzw+xhtUJ0U9rKI0GLhWI3puFoip9JIn/GzNkFlksEynfURwvkJC2h0tpRckhZISFEPEFb3cSLzvNSoUU67Rp5X6JuyR0NUWI+LHyfXdSUqqQBHA7w1l2prdbXqIJjfGB/DueqzOYJejJRYIAka/cV/VQlMAlre31svU2ILoaL2jDU4htn92NVogiYVv7+JPwKOYa8PBQ0U4YVOX+x7i7mBnMTjE45NBQxRTaUncLKVI4mcSddRNfvkQA3vjvGrcSsT0k1tQRANyRiAa8cPj0lgAwbM4gOKPIsqLWr4Rmi9r+3Ll+ewWAdmNEp6LZIRlx6CriQt8O3Io8yfLf4kwVUvHZFDS1DvOPe8ydnWjXBZREZlS69iv7REqtToe94szGtTG7YzfEcnvQnDtRiuce+hhgCQEvAx1SfiNiwC5KEOHC6l2wZV6Vx+WKCCdrY3aoXwvmZNlLYmBE49dSAXHdu/EtdKylXltS9PcHDN5QvvtbTPAWayIuldJQB22s5qVs9sIEwbCMmuUQcAZQJKxbnohnWwi/gyzJGI0bVpQZIpuHohrsyfadz/SqWJ5nE39NkxEVxsPKu28nIOI3N9f9Yxl18WmaFv2trYYpO/80XOIfWFCP89IaG37kNBpEvq2wZTYMEj1IHlfoic9NM/tmOhqXX9UUx+BcvNg3Od3y6IBqxZfi2nmye8Xf5bSq/j4lgZNTCVrhxLZRFNLHuxhtYcgk75ifnQ47Ujr0Sas= X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;31:wGxotRYy1kpG/p98Wj/aTMKKp/I7mpI0GBrUaGhxgMnfbQp8c1TlCxsnJwcoeI67lxJQJS9HloFRNnHvjPoBx+qT3i+14H6BGJedPT+CA7ve/4cl+Po0am+J1S5wvLV6BLckIAPDEAY/l9zGogfj9hYDK5AivxNYgBgrRCtH0DMc5VNKUsUw0/UZ1yst5FMYsWy4xPS9T4S4ONxno4TsSkqXVY8CVoCYrvWXOFHqdomrMHhzeuZW4Uqb/C0mo1j/7NuoshTb1CLXA0bTNRdUs2YmlhGeYXjiMAO1yUqm7MUsj6jLON7pzPKtIWXPheos/v195G8R1Ok072jH29lcOhlRDTSgFUgU7Az01ktxax9472VRB6nV1suxPVNKJlCFRctVeOxj4sSCoM3iLc5yUrcyQHwjZHi40s2vvas1/iT+nj3w0RDaEbto1xtAN5pWfXUa+f0CFObq+R/PybivpzzRcuFGZGaKHbXx4gdKhThxORljgxYNBfYlP6BSpRMA4lr+iYMJoguvcp4jGsbRGAOEOwXafPLgZnYpsuJNJqPPWtlcA017JLWee86KwmfUIrbliBs5HqbDCTRRYCQpXL6e0E9Mx0zMpHy6JzBqH5JoekUYDJbZ/aXXT7wBTDpM13IolLZ/azrZDd4+nNWodotZ3ALsPunhpG+R2mHP2Fo= X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;20:uV+l5ZjBtxYOfSbFzlMv25cwboYYouW5Cds4ioM08epCo9NqUwZF+qBcyBHVl69l6miZ28wEShaqTsgO4dj+pxFBBA2BlZtdKYqGdEXIlA7ttPqwYiN4+x/dpIlUocO4Rf/v0ZOCMp6gtpv+uNkIl0xjSbKzMVIq0dJyAdk/xvAIoTIXvOm7XJCbTiDFk4akRrF65jpuETwDY/xTee+vvOiXqTAnTlhQ8+VjAzpuim9JK91KjwU8QIcdp9WXh88elS7WXtxO6XoldWHKLeixHYfI91IG1G2t9U+fMw1p/NjWacpf5ZiRkfwyST1cD0hZSo77sDyrEC4dRcAq7o7NfLzQHr2l3Cg4P+Be7kQdDuQryjAxqiy9GZDoztfrslGG2HevWc6es7beh4lakzZjAhNY0auBWBQfzpFMSaAqTPsQVDmeyIEPSwC9/kLU3FEqHOSJAFZUe831UUnUVhmMz8PfPW4k/h9EZlbmkEtM/wG0ghHWdYlLEUHft99zL+z1 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(236129657087228)(9452136761055)(67672495146484)(148574349560750); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(6041248)(20161123562025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN2PR15MB1088;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN2PR15MB1088; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR15MB1088;4:ywyZAMrK1NV6Tt2U4Z4+7S5s6rZ49MaDL/Lnhu6nzX?= =?us-ascii?Q?V+bLDTWmJqMd6xw96j65xAPL5KmUkEV/tCFSLripIawPHCVsgZ1gM2aTnc6v?= =?us-ascii?Q?Yh7nwNy1rGWVJlL+4MpphRbU2l45qKx/LDsnQxV+pUGpvB5jwAiH9gS58040?= =?us-ascii?Q?dmOI20UNyLjpEQ4rr6mkzClzcT9AtW8KouowMzjia2PDc3To/oeE3pnU+vzI?= =?us-ascii?Q?K8/1+O1bYxsgZK7JICP98jb8W1Btn2BpOi+h/CTItmXmjGHSF1Nnl6aFOXMy?= =?us-ascii?Q?UPaK5SmS6SE29CwBP9wsojFzzH0iJ3SOMMbjhvrSOCu8yjlGOrbaSuvubVGH?= =?us-ascii?Q?/0KlKFYbBuXmuOPWR17uhvx86tbL3g3mXfyqLwDbIgM9aiqqqeswlqVIA98U?= =?us-ascii?Q?jCuSuam+fDU0mrsd9at9DD7eOcA/PHHExYmjUC807da0XM4RfmQRYWnwEsKi?= =?us-ascii?Q?YL5gcwnu/OC6WDweHDkOr/lXx+SuvNqqWx8n27N8NrB6plsdexWsaOQYy9Dn?= =?us-ascii?Q?pGkZpKVMU4+J1aI4KtWSDy+usiTIGbWCPPc9/D0Xri3F6xOBfLjE4yhybr7h?= =?us-ascii?Q?iHQq3tNIkaTXWv2qk1v0i8ZZNJfiOc5id/x5T5cReBjOQ9yE3WCq0n0rMI2q?= =?us-ascii?Q?miS2oL9b2w4S3g/v00W9vfQueX4lEzUBfBm6aj9N/bF98hKp7h71sUtAW7C2?= =?us-ascii?Q?pyQJIvarEYY2B87kupscSRapS3Dd/32fVyy5kUmHCgGBYbOqqaQkldhqLo4f?= =?us-ascii?Q?CwFduUVyQibJ3bARvrXgINfIcgGIejfiuwlTUPdLQLEtiIsE1ybgJL5fRp16?= =?us-ascii?Q?FomLgxngOQ5MQDBe9Qu35iAaLFPBLibYkVFCNz+DkGzh6ynXJ90SJktArPki?= =?us-ascii?Q?F4z9P6VmfHYeIN5Bsls7W4lo4qkIkOJB1EGaPqGlNt3FO/v50Hhhu1ayXdVO?= =?us-ascii?Q?YN0kxIick6ya6+4l8S6ZmHGtAdGESp6Ka0nOXPHIAulueObAcFloo6VDGUDt?= =?us-ascii?Q?lHjkCyPZuSo8cAzi+ojRaRvRM6bNd3wksQATj/R9udrrM7/k8urQz6JmfQ4j?= =?us-ascii?Q?gq9LeX75AmTwMJ8cgYQ8qNgbLQBTXq8o8YO5PB6h2AoWgL9GIoeVl1pQxMXb?= =?us-ascii?Q?04zdJpTbIqxLej2tzuuAlrp3dV4UEGdpQ2niYAOmKGFJ4C6plNxZ7+SpK0IS?= =?us-ascii?Q?6jGyj3yp/nMpzC7004XAEQCqLtuB4fxUQMyP1fBY0paAH7szmvme3lk6FnoP?= =?us-ascii?Q?PSv4mv6iI7hEIix4fyJBH7u+6o6qld28pI624VPEldP1hZe3SPtec4+jgouQ?= =?us-ascii?Q?=3D=3D?= X-Forefront-PRVS: 03607C04F0 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(979002)(6009001)(39450400003)(39400400002)(39410400002)(39850400002)(39840400002)(5003940100001)(53936002)(8676002)(42186005)(5660300001)(110136004)(38730400002)(50226002)(81166006)(6512007)(33646002)(6116002)(86362001)(54906002)(7736002)(478600001)(25786009)(2361001)(47776003)(4326008)(6506006)(305945005)(189998001)(36756003)(2906002)(6666003)(48376002)(2351001)(53416004)(50466002)(6486002)(6916009)(50986999)(42262002)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1102;SCL:1;SRVR:SN2PR15MB1088;H:castle.thefacebook.com;FPR:;SPF:None;MLV:ovrnspm;PTR:InfoNoRecords;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR15MB1088;23:Z++sVoH9paeHbeSW/cYNWDIpsGi5kwZ72lgMTYSwu?= =?us-ascii?Q?DiHCD2U8aHH4OgXyYC/3Z5DA0NdqDvrFC4TkhkahUrBfyk1AIYxKr2f0LAYZ?= =?us-ascii?Q?dlwqQTNRsOE8dYWqus6/UHslM+yDZGYhJUpQYfE4ldCSOKlI5m1vJGwxRjiv?= =?us-ascii?Q?Rk0lk0nrzak+0ZfmCgoxZvV0LCUB+GnuAEO42Nic7ygSKL7/hp16lBv8r2hj?= =?us-ascii?Q?FggBd47BLFWcLBDghLHeyf2tDZfcGW5RBn0XbxF6KpEFScpmp3PNC+lh07Sj?= =?us-ascii?Q?mlEK8qtZygkWC481byCOZvW8gtt9GL4B6JkJ5GQcS6VQlkgn5C87HVx59q+5?= =?us-ascii?Q?17voSpquGVOOgk0V3OvG4FwQ18U38sM04Q9nKWiJRKnoCdxdrp+Zr/wcHKBi?= =?us-ascii?Q?Zyt6ZMhAc2IoYqB+e/Z1Q6YuYqVpENTW5kt1Q3C+OCgGh/2wHqSbPgE8e55b?= =?us-ascii?Q?/mUwu8h8bqNEWnRjBi4KTXnumTBS8WVFidCm8HW2daAAJnwEe5YDQq1kT7XG?= =?us-ascii?Q?lUTFoYIFHChcuKzQO1VB0PBQnV2gk9mcalatOEgdFapfy6QohNyPixboyE5V?= =?us-ascii?Q?BsV8eEP/koKNRtBe/F5/RNg9zWS5lekpvYnHhHaLOUGb2RgJ58klbBBFLxNo?= =?us-ascii?Q?9Os2CxfZpEg21NJ8M1Q1NWI4GbuDNAPFgUpsMWXR4nNELMCrLoTHwqAS6Sc3?= =?us-ascii?Q?RDE+J5V8ytdziPlsLGo5vD7rJwon4SJCz5nRiYEkTpfE8pCixmato4NGM89K?= =?us-ascii?Q?LDBcLhs6AMPpwVcdDcvUIXJcEb26oTAwe6Q6X4JE2QAhHGOCtdlYXvFTlvSm?= =?us-ascii?Q?XO58fAbMRe/p5vEfVznhkIq18OiqVvgc9qqCOB4uubKNBjR4K3up5l3bBgPl?= =?us-ascii?Q?97dBKLIG4hDZuXACxn/7Kvqu1hLudbx9PV0isdO3fr9pQDbRocnq1FxZF8xm?= =?us-ascii?Q?X9EnvEatwo5bFBNa3f6+hDe2cV36cUGgygpARv0zA6SCiRMigY+M+zxnLqbJ?= =?us-ascii?Q?FQ0xiKoCO8rffbAtze8rUI0KUypMV/Y9pW4FR/Qicu2sPOuUXsWwx2k/cIeV?= =?us-ascii?Q?46SfyRDocwVvrw+6aDgBOnQcfr1ptiSPrBDMN+kuNzXSXqjdj5B8AR3Q547G?= =?us-ascii?Q?aG4GOuOvRtSSZKr64BjdGxG2Dv3WyYj?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR15MB1088;6:vusXc0C7RVhXPCmc1XO8Lqfz+u4/ZAhYOk+2StFc8Q?= =?us-ascii?Q?pus7ZtPAISO59CDXQ5BAT4JpgvNcM0MiRylIm+/WoMJkpQFioD7uvEGMdDez?= =?us-ascii?Q?hoP+YZ18Y92F3dMMKlSwj2aJf2VMAF6lellUJxffrzxUXXXcIFtknmq6u5sk?= =?us-ascii?Q?1q9rAC8FlzXmniG4BUFw9nUgwCTr+ZEZ+bWIudquHE0yQhr68nJ9kvawFK49?= =?us-ascii?Q?YEo51XBE2hKYpzhtAX/lb5jyVi+DOEk+bo3xs0HXFzkJWZymrr2JLTNPgHyL?= =?us-ascii?Q?CzER7oDBZGF/t1IwnjP/1x0lYvXzObyca00EImG6ErLdI/+7s/IYgEUGo44p?= =?us-ascii?Q?57pJd8Bq7mtneErn7ZmCDoLcx3BVvlcD/Fn1xE+025OOT+XSl4ruinDZAdfx?= =?us-ascii?Q?qoUlse85PmFuMmFb0/sRR+s8rptDxVQwtW6ivdcEVgFW1NpLMOkqDXPtM2p8?= =?us-ascii?Q?cVfRdKZlNRnhPYF3wqVgBDeBSMtiuWFju07Cp4L3N+FoCW+yjwVwlfRLYwwv?= =?us-ascii?Q?3YgI+oailZ2bwSRgwZeykZRBQ9s0v+PHd5l3z8lIO00VsoILvYpdRJvE+SRN?= =?us-ascii?Q?VuvAkev58Bg1911pQiP6AwxCmZDmFHQIXaeFq+krKofesgbkl52h8oxGAAkm?= =?us-ascii?Q?HDuBX4CuIWQlIM1/Jw2d6v6svmM7OQrxRtNrttun9GeWJlPyuXb24Gc3L6vW?= =?us-ascii?Q?ypKP6p8KWRACsR9B5ZecFzOCUsGTlOwfBDzPQkv7xf0D/JHkJFkqt9RwutgJ?= =?us-ascii?Q?hY2Lk9n2NzIm3WYXENsZxQha4fTuXQ7TVkurU3CwTNy+rABKyBQnZfWSgZKB?= =?us-ascii?Q?CZh+kL3fo+BhRCqKDTlLasZEqW1lArliZNQZC7T8J+uCVwi9VrkLVH2Jliby?= =?us-ascii?Q?OkRpI/rICoZ8NJT1HCtIIbmisc5XG2lxKUC4vqKKnYo/Xh1CGCL+XBYurywR?= =?us-ascii?Q?bQrmIwV5/wplYl8NygH5fVLwPqc0KR468ff9rJp6R1i01x2JpCKU8t98mMW+?= =?us-ascii?Q?w=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;5:r9Uab0ndGR8SLEkAVpw8qe3KmBAZZI6OB+6LqtlHrSN1gjqO2JKYIwCA7Z5MSDH5zaMSA3P/l36lGIqiJKkY1VcF+ruupEX0cFFi/fGmna74tXqAMm9U7tQ5AGrvK9cQmhT48pf0+iFEy6Wsw3ffrGpci1faUzqEDLT6vekjfn3IpdqAL1uwTiMvM9MIOnXtRPIEjA7iIcRjFurSMN0NG8hR63vZpP02YkpvkSXPlY/SYdSJ9SJAoboYxea/tqZxWUP94YAOfppo93MXGxBHo4F5+Enu1MCiNaxD2qZtnH2PTmd8TpJ6NOcQhwZerYjJjM5PC+eens51rmTTA0DhifEim5zaqws+NRuX/0LY3vuI0gqCXNctrojgbCew31/GaTbl5evQ6sgKN3jyJoxi3ppYkEauLSy4QRqqlp6VohWbseyyJ+dGLCF5vVpUYxhc87IWOnBudwzrBemFcHboJcqY8VRkFm5CJLmg5RvRKcuE+z4p4u+MIPtGyvLrxolJ;24:Keq+ave+A2oD90DZIW8ELPAcwUX79Xb46TDJxDc7x4FT+gc7ei4U8vx/VEsrbl1ygC5g9IRM0Vmcmzcq9nyDU/T+4wHICR1Tnq3gDk9qww8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;7:7Vez0xvT0kuaE8Y8ejXOuWQ7UxYjNa0St+Eib7qgDOWWcj+fqH4zRM8UpIT3UyoJc2/2dRQWxRH+P2YtIMk7n3CjE6VMrYiudrTtVlWTHIOQtKXlITOv895LBNjIhXwH/p6B72QNQ8K8YvCoOJQSo0IAZI4eLQh4HMuX7pcBVld7b44ECKLdmXzKqUpbK2EUA6kmVcInfHYSdwYavNjtSp/DjsCggP3CHyWgakIrGEUwdWJiG80dk4QUGa1RdcBoIXWdnVeaqnCn/tUWhzBogRjVnzB0Kjm6bFO8/owtx8Efpyto7xA6OAG4tqGN6E5Jo6WWLDs19VhyuouzaVZ7yRsJv5Fx1EJxuA8UhmcYtJSMmoeHiGCn00X7b2CTZOL6odz3Yuhbeu+5VRkiXW4U2n+4kOQ6Y+rb5k4FVz2Dm5GfPlEwMWtN64duR3BI7iB0/YqQKyyYi0zT6V6qgoM/YT+W0dGU4NMyNVBV7fi2EZXsJehCQJ+EMz1yNSC3kOScK0cBP3EwKnnP4wYdgZhZp38nqcrIFYnODqPwMRr541cLYlU3AYOS1QHkMlUp/xM4U0sF2SQGZgAvFW65qU2NvaESGDKQsfpWNK2Lquo/H8e2pMjO3Tz0c5JRODtiSM/9P7cKsIR403U7MLFsjxAKP/nohl/fnieh53X0vyaxA96VUBmAbtJNCcOGMsHY2WXCGc41Y5A2nU5WaCtBFgKX3Mpf94ZZA0hIJ5FNJZ52uu3bqfWYdm7TSqjGLSITxYyPXO2UFLtsvwT2dnAgMkiJ7ZfhOT9l5RNj1PeVo87XAVY= X-Microsoft-Exchange-Diagnostics: 1;SN2PR15MB1088;20:7g/6eeYXgH2w2xiijNF+LXHqOqR28d02xJ/lZ0CqnH37ILOiVSeC0haEpfjqGOJGCqdt8q898TTI1BCIeDqQ9MfAUNF+xT1G4vMW8ZR8fiDLKF/df89aEzwLyFp2TfpOTMxk+OUCHADtQu481IWTRjDwH4W+LZ82GXxXnXrRMMY= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Jul 2017 13:04:47.9851 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR15MB1088 X-OriginatorOrg: fb.com X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-07-06_08:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 12106 Lines: 388 High-order allocations are obviously more costly, and it's very useful to know how many of them happens, if there are any issues (or suspicions) with memory fragmentation. This commit changes existing per-zone allocation counters to be per-zone per-order. These counters are displayed using a new procfs interface (similar to /proc/buddyinfo): $ cat /proc/allocinfo DMA 0 0 0 0 0 \ 0 0 0 0 0 0 DMA32 3 0 1 0 0 \ 0 0 0 0 0 0 Normal 4997056 23594 10902 23686 931 \ 23 122 786 17 1 0 Movable 0 0 0 0 0 \ 0 0 0 0 0 0 Device 0 0 0 0 0 \ 0 0 0 0 0 0 The existing vmstat interface remains untouched*, and still shows the total number of single page allocations, so high-order allocations are represented as a corresponding number of order-0 allocations. $ cat /proc/vmstat | grep alloc pgalloc_dma 0 pgalloc_dma32 7 pgalloc_normal 5461660 pgalloc_movable 0 pgalloc_device 0 * I've added device zone for consistency with other zones, and to avoid messy exclusion of this zone in the code. Signed-off-by: Roman Gushchin Suggested-by: Johannes Weiner Cc: Andrew Morton Cc: Mel Gorman Cc: Johannes Weiner Cc: Michal Hocko Cc: Vladimir Davydov Cc: Rik van Riel Cc: kernel-team@fb.com Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org --- arch/s390/appldata/appldata_mem.c | 7 +++ include/linux/mmzone.h | 2 + include/linux/vm_event_item.h | 19 ++++-- include/linux/vmstat.h | 13 +++++ mm/page_alloc.c | 11 +++- mm/vmstat.c | 120 +++++++++++++++++++++++++++++++++++--- 6 files changed, 158 insertions(+), 14 deletions(-) diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c index 598df57..06216ff0 100644 --- a/arch/s390/appldata/appldata_mem.c +++ b/arch/s390/appldata/appldata_mem.c @@ -81,6 +81,7 @@ static void appldata_get_mem_data(void *data) static struct sysinfo val; unsigned long ev[NR_VM_EVENT_ITEMS]; struct appldata_mem_data *mem_data; + int order; mem_data = data; mem_data->sync_count_1++; @@ -92,6 +93,12 @@ static void appldata_get_mem_data(void *data) mem_data->pswpout = ev[PSWPOUT]; mem_data->pgalloc = ev[PGALLOC_NORMAL]; mem_data->pgalloc += ev[PGALLOC_DMA]; + for (order = 1; order < MAX_ORDER; ++order) { + mem_data->pgalloc += + ev[PGALLOC_NORMAL + order * MAX_NR_ZONES] << order; + mem_data->pgalloc += + ev[PGALLOC_DMA + order * MAX_NR_ZONES] << order; + } mem_data->pgfault = ev[PGFAULT]; mem_data->pgmajfault = ev[PGMAJFAULT]; diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 16532fa..6598285 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -66,6 +66,8 @@ enum migratetype { /* In mm/page_alloc.c; keep in sync also with show_migration_types() there */ extern char * const migratetype_names[MIGRATE_TYPES]; +extern const char *zone_name(int idx); + #ifdef CONFIG_CMA # define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA) # define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA) diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 37e8d31..75bbac8 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -19,12 +19,23 @@ #define HIGHMEM_ZONE(xx) #endif -#define FOR_ALL_ZONES(xx) DMA_ZONE(xx) DMA32_ZONE(xx) xx##_NORMAL, HIGHMEM_ZONE(xx) xx##_MOVABLE +#ifdef CONFIG_ZONE_DEVICE +#define DEVICE_ZONE(xx) xx##__DEVICE, +#else +#define DEVICE_ZONE(xx) +#endif + +#define FOR_ALL_ZONES(xx) DMA_ZONE(xx) DMA32_ZONE(xx) xx##_NORMAL, HIGHMEM_ZONE(xx) xx##_MOVABLE, DEVICE_ZONE(xx) + +#define PGALLOC_EVENTS_SIZE (MAX_NR_ZONES * MAX_ORDER) +#define PGALLOC_EVENTS_CUT_SIZE (MAX_NR_ZONES * (MAX_ORDER - 1)) +#define PGALLOC_FIRST_ZONE (PGALLOC_NORMAL - ZONE_NORMAL) enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, - FOR_ALL_ZONES(PGALLOC), - FOR_ALL_ZONES(ALLOCSTALL), - FOR_ALL_ZONES(PGSCAN_SKIP), + FOR_ALL_ZONES(PGALLOC) + __PGALLOC_LAST = PGALLOC_FIRST_ZONE + PGALLOC_EVENTS_SIZE - 1, + FOR_ALL_ZONES(ALLOCSTALL) + FOR_ALL_ZONES(PGSCAN_SKIP) PGFREE, PGACTIVATE, PGDEACTIVATE, PGLAZYFREE, PGFAULT, PGMAJFAULT, PGLAZYFREED, diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index b3d85f3..ec30215 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -103,6 +103,19 @@ static inline void vm_events_fold_cpu(int cpu) #define __count_zid_vm_events(item, zid, delta) \ __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta) +static inline void __count_alloc_event(enum zone_type zid, unsigned int order) +{ + enum vm_event_item item; + + if (unlikely(order >= MAX_ORDER)) { + WARN_ON_ONCE(1); + return; + } + + item = PGALLOC_FIRST_ZONE + order * MAX_NR_ZONES + zid; + __count_vm_events(item, 1); +} + /* * Zone and node-based page accounting with per cpu differentials. */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 80e4adb..e74b327 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -233,6 +233,13 @@ static char * const zone_names[MAX_NR_ZONES] = { #endif }; +const char *zone_name(int zid) +{ + if (zid < MAX_NR_ZONES) + return zone_names[zid]; + return NULL; +} + char * const migratetype_names[MIGRATE_TYPES] = { "Unmovable", "Movable", @@ -2779,7 +2786,7 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone, list = &pcp->lists[migratetype]; page = __rmqueue_pcplist(zone, migratetype, cold, pcp, list); if (page) { - __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); + __count_alloc_event(page_zonenum(page), order); zone_statistics(preferred_zone, zone); } local_irq_restore(flags); @@ -2827,7 +2834,7 @@ struct page *rmqueue(struct zone *preferred_zone, __mod_zone_freepage_state(zone, -(1 << order), get_pcppage_migratetype(page)); - __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); + __count_alloc_event(page_zonenum(page), order); zone_statistics(preferred_zone, zone); local_irq_restore(flags); diff --git a/mm/vmstat.c b/mm/vmstat.c index 9a4441b..cd465f6 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "internal.h" @@ -34,18 +35,18 @@ DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}}; EXPORT_PER_CPU_SYMBOL(vm_event_states); -static void sum_vm_events(unsigned long *ret) +static void sum_vm_events(unsigned long *ret, int off, size_t nr_events) { int cpu; int i; - memset(ret, 0, NR_VM_EVENT_ITEMS * sizeof(unsigned long)); + memset(ret, 0, nr_events * sizeof(unsigned long)); for_each_online_cpu(cpu) { struct vm_event_state *this = &per_cpu(vm_event_states, cpu); - for (i = 0; i < NR_VM_EVENT_ITEMS; i++) - ret[i] += this->event[i]; + for (i = 0; i < nr_events; i++) + ret[i] += this->event[off + i]; } } @@ -57,7 +58,7 @@ static void sum_vm_events(unsigned long *ret) void all_vm_events(unsigned long *ret) { get_online_cpus(); - sum_vm_events(ret); + sum_vm_events(ret, 0, NR_VM_EVENT_ITEMS); put_online_cpus(); } EXPORT_SYMBOL_GPL(all_vm_events); @@ -915,8 +916,15 @@ int fragmentation_index(struct zone *zone, unsigned int order) #define TEXT_FOR_HIGHMEM(xx) #endif +#ifdef CONFIG_ZONE_DEVICE +#define TEXT_FOR_DEVICE(xx) xx "_device", +#else +#define TEXT_FOR_DEVICE(xx) +#endif + #define TEXTS_FOR_ZONES(xx) TEXT_FOR_DMA(xx) TEXT_FOR_DMA32(xx) xx "_normal", \ - TEXT_FOR_HIGHMEM(xx) xx "_movable", + TEXT_FOR_HIGHMEM(xx) xx "_movable", \ + TEXT_FOR_DEVICE(xx) const char * const vmstat_text[] = { /* enum zone_stat_item countes */ @@ -1480,12 +1488,86 @@ enum writeback_stat_item { NR_VM_WRITEBACK_STAT_ITEMS, }; +static void sum_alloc_events(unsigned long *v) +{ + int zid, order, index; + + for (zid = 0; zid < MAX_NR_ZONES; ++zid) { + for (order = 1; order < MAX_ORDER; order++) { + index = PGALLOC_FIRST_ZONE + zid; + v[index] += v[index + order * MAX_NR_ZONES] << order; + } + } +} + +static int allocinfo_show(struct seq_file *m, void *arg) +{ + unsigned long allocs[PGALLOC_EVENTS_SIZE]; + unsigned int order; + int zid; + + if (arg != SEQ_START_TOKEN) + return 0; + + get_online_cpus(); + sum_vm_events(allocs, PGALLOC_FIRST_ZONE, PGALLOC_EVENTS_SIZE); + put_online_cpus(); + + for (zid = 0; zid < MAX_NR_ZONES; ++zid) { + seq_printf(m, "%8s ", zone_name(zid)); + + for (order = 0; order < MAX_ORDER; order++) + seq_printf(m, "%10lu ", + allocs[zid + order * MAX_NR_ZONES]); + + seq_putc(m, '\n'); + } + + return 0; +} + +static void *allocinfo_start(struct seq_file *m, loff_t *pos) +{ + if (*pos) + return NULL; + return SEQ_START_TOKEN; +} + +static void *allocinfo_next(struct seq_file *m, void *arg, loff_t *pos) +{ + ++*pos; + return NULL; +} + +static void allocinfo_stop(struct seq_file *m, void *arg) +{ +} + +static const struct seq_operations allocinfo_op = { + .start = allocinfo_start, + .next = allocinfo_next, + .stop = allocinfo_stop, + .show = allocinfo_show, +}; + +static int allocinfo_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &allocinfo_op); +} + +static const struct file_operations allocinfo_file_operations = { + .open = allocinfo_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + static void *vmstat_start(struct seq_file *m, loff_t *pos) { unsigned long *v; int i, stat_items_size; - if (*pos >= ARRAY_SIZE(vmstat_text)) + if (*pos >= ARRAY_SIZE(vmstat_text) + PGALLOC_EVENTS_CUT_SIZE) return NULL; stat_items_size = NR_VM_ZONE_STAT_ITEMS * sizeof(unsigned long) + NR_VM_NODE_STAT_ITEMS * sizeof(unsigned long) + @@ -1513,6 +1595,7 @@ static void *vmstat_start(struct seq_file *m, loff_t *pos) #ifdef CONFIG_VM_EVENT_COUNTERS all_vm_events(v); + sum_alloc_events(v); v[PGPGIN] /= 2; /* sectors -> kbytes */ v[PGPGOUT] /= 2; #endif @@ -1521,8 +1604,16 @@ static void *vmstat_start(struct seq_file *m, loff_t *pos) static void *vmstat_next(struct seq_file *m, void *arg, loff_t *pos) { + int alloc_event_start = NR_VM_ZONE_STAT_ITEMS + + NR_VM_NODE_STAT_ITEMS + + NR_VM_WRITEBACK_STAT_ITEMS + + PGALLOC_FIRST_ZONE; + (*pos)++; - if (*pos >= ARRAY_SIZE(vmstat_text)) + if (*pos == alloc_event_start + MAX_NR_ZONES) + *(pos) += PGALLOC_EVENTS_CUT_SIZE; + + if (*pos >= ARRAY_SIZE(vmstat_text) + PGALLOC_EVENTS_CUT_SIZE) return NULL; return (unsigned long *)m->private + *pos; } @@ -1531,6 +1622,18 @@ static int vmstat_show(struct seq_file *m, void *arg) { unsigned long *l = arg; unsigned long off = l - (unsigned long *)m->private; + int alloc_event_start = NR_VM_ZONE_STAT_ITEMS + + NR_VM_NODE_STAT_ITEMS + + NR_VM_WRITEBACK_STAT_ITEMS + + PGALLOC_FIRST_ZONE; + + if (off >= alloc_event_start + PGALLOC_EVENTS_SIZE) + off -= PGALLOC_EVENTS_CUT_SIZE; + + if (unlikely(off >= sizeof(vmstat_text))) { + WARN_ON_ONCE(1); + return 0; + } seq_puts(m, vmstat_text[off]); seq_put_decimal_ull(m, " ", *l); @@ -1790,6 +1893,7 @@ void __init init_mm_internals(void) #endif #ifdef CONFIG_PROC_FS proc_create("buddyinfo", 0444, NULL, &buddyinfo_file_operations); + proc_create("allocinfo", 0444, NULL, &allocinfo_file_operations); proc_create("pagetypeinfo", 0444, NULL, &pagetypeinfo_file_operations); proc_create("vmstat", 0444, NULL, &vmstat_file_operations); proc_create("zoneinfo", 0444, NULL, &zoneinfo_file_operations); -- 2.7.4