From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756002AbcIKMSa (ORCPT ); Sun, 11 Sep 2016 08:18:30 -0400 Received: from mail-db5eur01on0073.outbound.protection.outlook.com ([104.47.2.73]:59568 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755724AbcIKMS2 (ORCPT ); Sun, 11 Sep 2016 08:18:28 -0400 X-Greylist: delayed 5581 seconds by postgrey-1.27 at vger.kernel.org; Sun, 11 Sep 2016 08:18:27 EDT Authentication-Results: spf=pass (sender IP is 193.47.165.134) smtp.mailfrom=mellanox.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=pass action=none header.from=mellanox.com; From: Noam Camus To: CC: , , , , , Noam Camus Subject: [PATCH v5] lib/bitmap.c: enhance bitmap syntax Date: Sun, 11 Sep 2016 10:40:29 +0300 Message-ID: <1473579629-4283-1-git-send-email-noamca@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1473348805-7145-1-git-send-email-noamca@mellanox.com> References: <1473348805-7145-1-git-send-email-noamca@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-11.0.0.1191-8.000.1202-22520.000 X-TM-AS-Result: No--14.412700-8.000000-31 X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:193.47.165.134;IPV:NLI;CTRY:IL;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(438002)(189002)(199003)(36756003)(110136002)(49486002)(107886002)(48376002)(87936001)(92566002)(189998001)(4001430100002)(586003)(2950100001)(77096005)(86362001)(33646002)(47776003)(8676002)(626004)(50466002)(106466001)(50986999)(2351001)(19580395003)(229853001)(19580405001)(5660300001)(305945005)(81156014)(5003940100001)(81166006)(76176999)(356003)(50226002)(2906002)(4326007)(11100500001)(7846002)(8936002);DIR:OUT;SFP:1101;SCL:1;SRVR:HE1PR05MB1340;H:mtlcas13.mtl.com;FPR:;SPF:Pass;PTR:mail13.mellanox.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AM1FFO11FD006;1:WyVGqKkDb1t196F/odyMb/hcl582XtWoQ/jS0sgOtpi+rkDf2L7NPNVkt1WL8x5H15LVCd1EEOoBONrGW6aYQFeReu+CAKuh9vOvLPUrxV87md3Faq0+43DYngPN5plC5DMYlsR+pAfoLp8/kQQmX3kZWWJMrUjZrFtrCM+JFNaEAbv7y61QWpyy6ifyCc9H3EbNMHDjd536Ghb/lT/msinGQ8KGGBmMWHRM4qYQd0BNjaheVtN1HACgOgRHdbNbyU7fsyxku3QD88s6fnI92GBxnZyHFjncLSk7JvG3//FsV8GIV+8oWrQh48I24QkllC+MhXsc3fahfbg/0vQyHjsJiM/WKgKWAnpKro/JGCB47hHM2eoO4YSWbRgsM7gs6bqTqugN5hC6jJD/k7N7NPpDkZHQW/Wt9JzSn87geZhveA8qul5EiZpDFJcn/nj/diKpUmbgn0D49axK4GQ7954h9Da2vlp4IS2+XOnUQJyamQESdRQptX4+VHFdPpS66Znar5e71wX76royi9K9lxrCwB5AcXfXvP2LSx4QH5w= X-MS-Office365-Filtering-Correlation-Id: b314cfb7-bebc-4d20-9308-08d3da16f332 X-Microsoft-Exchange-Diagnostics: 1;HE1PR05MB1340;2:iDQbD+ZEjpcH7f6QjEvKrQd1Xzs6CyTJ8iid9eVteypEDcDXDSoj2FbdrxVtwsxZv4NMVSKtqo6vRCx8LGkT3k54J43yU4y0ux6EUydFAlCtH4OrfZki0K23gpcMsOMITzSkZXIaEEaSvXLTHRfA24XCqryBpUW5z9rQ3baXWQTPVZHbNBv+07iYB47WYADk;3:DQERmMmsdomV9BklKjTgUKUztjoKil1N1V8+cEgHkUoNOrCr5iYx9m2FD4HwK5482Et+pZ7Lj76aWrT2dYHzShyAXK8Ryddtv2BFoJFX6aVA4bDC6kbZgA4Sw0HVbCCOqeZ3IyHP21J4BA7xiN5ze5rZzUPAQJLrKWFEhjcid1W4i1uTgWzN5g0fadJl6liPY3SGCYEahCuzSy/aQRvY/ij3MLOyBHkXcPceUXQs1hJD7lPt6ZSkRX/P2fDkGJmViKTbZKPnvI8B0MsYk/2rvQ==;25:o+EBb2SgInXSLeA6wXyedkdGN8LhHIGYFGvW4LfTd3twkSqDk2i0AdJzauk7bRyYerCMPpGMeAOiyp9zxBSNwrf2irTYb6ntecjh0uDl9FXVAcmrWqJlsSncPXathcTyUX37DiGm52Dqap9VvpwMiAAzCFHa0tt56eNiNAgNpXtkLb86CkJB8BmKhIko0Bh3sgL9x1vljXeXx2diHCageYqsz3NtIClQJXOlUM4hZOBtHoy6qPF2gKimrqtO9yu5PZPM8iLHO6XbawYB+ug+AbcLAQ/E/96Ewqndk6+0A38TcVikE6DTr2mn9GFezUhRbG/vtmx5406Y0eq5ou7VF/2yeQsZK2G49ImDPoW8CmuScnZXL2Ze0xsviv47LXUuwaOvef48ER0U2YjPjVkSEOq/xZnrGhfiA83PZjKQzwg= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:HE1PR05MB1340; X-Microsoft-Exchange-Diagnostics: 1;HE1PR05MB1340;31:w3SS3GHCyQ/HLuzcHHJWDjelnb4lLVtfZ+U0hiQCStw1fBPnqBN9mqwqvilkCkSK1EsNHLi4PAoBbHbwp5bBYvm/WRDsPxPVUJHlyEegcUXIYoSD0uCAqtMyjYZFryT0aK1LUVzBWunBkzAplxm38iDfVPp+zCjxex2wk7aMuwp1t/r88+moFEaoriYXYfV2FUZZpZ7pZLqHniVVoozULcZ6kO7XnUAZ4t2jITIp/ew=;20:Wh2LNsYaLTpQlGBOMJBDJrH0tkHo9PdMYtClRxDvc4MmNSOJL3k/f8hpOuKY2XCuhhZOU1MNdcTUipKJ1X38HSheyD3NWrVJx3Jzc9te9h9HnjkPv16qcDLFpgcW0qPorbaS2OHHA2CUoAoN9dvemnOYm3uAjCpP/cHAXSfp+Xh9p8MQOaZ6FY90koCUS+gat6LEJvP2BEI0n1OQ258Kq8TV4GnynUXyUGZfloYdAC6mxJ0MVl1jW6EJJvCd71Y+hDToSeWOYCc3wQAVLbjCt7D974Vel/9qobM0MmQDyyldUMjSiEB/wjFsjvdgZfS1nOEEowPW0YjTBk/7WZJjyfiKU4vMrD/kDpZeIYr5n87AvnXSTZio9n6tPCs6b/vt4MNa5qmabrdbSS7FQnlEOocy4DfK233+Be9JwDyjuJyxHRtBEf5SMhAFAVvLdoYmoznlgFD6Jk9ninnBaZiFphvWL5wL+n49aFaqgArRuZpdKVOpyVoFpIooXWcO0OUd X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13016025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:HE1PR05MB1340;BCL:0;PCL:0;RULEID:;SRVR:HE1PR05MB1340; X-Microsoft-Exchange-Diagnostics: 1;HE1PR05MB1340;4:a9LGiVn9GFwOM1st+SMZ+mPj/P7oruvuwu0L17n1fcGskBDQcbXWR8TYr3hQafd2hU48uyozNQN3JAgT7YPa7OOOE+S/qJq1NSZqr/EUuJ18GuLt4OweJ4TEQ42FThlP0ss3mAa9d+WAmoenMMBRZOMTF5jERb4U4lM6p22wGPC+j9KVUyyVCNAbMD831GgqlR8wTNfl1ARPh1RInhDXPm3X4qnzPt9naQcWWjJfLOpQMvlx08fX+l3a6da4dvN/RM3cKiyRZuwBQIeW+vXmSMOo0GeOIIVAxIBUGtnyj3LMeEEMRHpg7Mq4dMOMjgfROrWDDKNNpRaMWMWdwBW/fDsC57D/jbKIIXGu0sp1VosQYAPcW5XdkjdoAGiepfvoC40YaSd+rjuIK0BOlPK5P/eh+YnwZuPF9MVtStBs94ihzENP9jHp1lAOU0OxeYwR X-Forefront-PRVS: 0062BDD52C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR05MB1340;23:kyvM1sdSx4vLo+kLrtjGs+pAdd9dIthOUux+fTriu?= =?us-ascii?Q?ty1XYdgydcIkqUzeJliVr+zJvg7TFMWzBGFQaFaMGGY7p8FY9O4iQOlQHvgU?= =?us-ascii?Q?TDPlvv9fSaRbrzKV5aiErSwLYDh6LrjbLNPRTb+stPqMrgjun3dqyqZC+6jF?= =?us-ascii?Q?HHohAiVOSSyFDMpUAKEcMN1L2uSmCf7SFZSlcRlnH2LgPiI/LT13z2H1hP8A?= =?us-ascii?Q?Ma1+Y99XyHOjHVsP252arA4JNsNgn2VDuQcNeHSG0iIffoj26LsBGXpPeLMx?= =?us-ascii?Q?ap16DBhqsk66Ole323enL3K7a0ORnBKxtf/nKuLpoWf62pB5FhxfPVPLPSfq?= =?us-ascii?Q?2bGzxZ6r0aNL1IWS4pzPZwOW17vWxxlL4hKeQiHtteY2PxfjiwlzNYNcWzQP?= =?us-ascii?Q?xCFFXc8s4XuxbY0mp+Zf2aCFQsE5OPwFZHAwfFnz+1U/eDKJt/uW3i7PMfIQ?= =?us-ascii?Q?JBNqG0S4/5fmn/ZHktUl5a9aSf1foZv/aAWgtjXeCW1MpfT64rmnEw6emrJY?= =?us-ascii?Q?5QChFX++mx5WSqHN2DPaGr2zhtNv/e+129eAj4Ejazm36VccNKgC3C5AdNpC?= =?us-ascii?Q?OWPEK4np97GxOlGtq3McWZl0SutAjQOgSimI5N0xJlpr5eVcSR+20WZnHj6i?= =?us-ascii?Q?e3W2qJrXuieIE7YyzlxrjKDlZfRO5pbCouwAgXLpAyZYwPOf6jLAIz0b7Cmw?= =?us-ascii?Q?rvz9xcBKVhDLr3uycByyVeoNhdKzqsIWcrdwwcp1fGfNzxRI9O8XkNrjgKQQ?= =?us-ascii?Q?G7OjPaTLFpEIr01bl2SRjZjZgXQmDeilopL0a94aRK/rI/+YEzPR5oyDGrzu?= =?us-ascii?Q?8DZNYEZlAjHO9URyZGNiGm/fIxHOdLgoPE8+mSPp/fNPV8EIDvB8qgteWrgd?= =?us-ascii?Q?JjSjv3EWejBcL5G5mSWG+dshxzUN+49t4rnFsz8SSqmx198hRnXFnDnt95Z/?= =?us-ascii?Q?V9JblrAHM+qVcGlKInpolaY6gYC3CE9a/qSZfTalg8/hmAEkLfjhN2Offr87?= =?us-ascii?Q?OTnZkLFFzW5eRH7Y7jK6jrt0FJwYwZHfu9/1wiMjE1TLgLYFYH2HmbJuFkrm?= =?us-ascii?Q?1pNq4aaqvCCtlzYxBT3sGolUjjCoMsVn6Ah+BKnicFCxrGwmA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR05MB1340;6:MFf0T7Fq3E2hgPqdfhyTAqP5jWkmVyYwMfTpIScuG/YObfQcJYDE4q7OT5RUEVgH87NGG5PJ65VDqYLlvJrTrRVh50CpJtEN5veQmrbt4t7I9oz3paTYBABQlNWLol9xCtlyT7C6Uw9GeG80r9+6UPE0UM36cFbLbT+itl0TiBf5PfS2BC4vEoVgLhOgDkcYVRQpZCsDBwLybSsIgVJ07+D1oHMgLbQw2SaR1m5lOlyOXwVUXG/JtcPOJTtO3a8dfjXApRgkR474sTgraNL3i7YIZRHPxLX84RI7ySOF1/VUW/yxT6wwR+sSa7xbHJxjpgAR6FGxS8qgNpNy3HgbgQ==;5:/0fjjFebX6qZt0ohFHNRq4k+KxvM726lZ/F26GzKf62TEaVDRFhi43WNMoIInznAIBiQMIVUdHfLdFmbFTWxYmcaLZhuSNU0uZde4NV8B03FyaRl0QVLy2IA48PIG6FCV3t2BMn5YP7Ws8RK+xCQKg==;24:BgYRgfa6hRc0g/VIx0jeDj6aNluFnsDJtXDJedTT2qTIdey+tg6nWrqFx6MwVpOK/3GigUU9d/SG8gxdgulLW5RqXA11Dls1HkycAsSQ3c4=;7:N0vkJUbHL9Gdteep+YcIkb3mrfmri4AoVu+O/VzeoIAtOZQRgdKZR4PCO0gdG4lqxS8b73LVejEi1ruZ8pZev7HMyoRUCHJol0dpdavAoxmjHk3Zj9v5r83OsbbzrQFUWhFSOLzP22S0H9mIKvl8Q3nM9wNLa55G22+8h3Ol0eo6Mf9j1vi4vT6bMxZMyztyT6Phv6zeudQCrmw+LiPlv9pQLVjtpQo2/6sDWzgMNCc8gZBeNNDyhC2CfNhFlkVP SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2016 07:40:49.1189 (UTC) X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=a652971c-7d2e-4d9b-a6a4-d149256f461b;Ip=[193.47.165.134];Helo=[mtlcas13.mtl.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR05MB1340 X-Microsoft-Exchange-Diagnostics: 1;HE1PR05MB1340;23:WyTNT3EmybP/DbEzOLerCOhEmtcpTRnw6xL4cIt2R2eqr5C2t7x6MjlRbbthnD++Z7eepkgNqvQjN1M5ooIIf+MpeL9wHoWWWjVDTmxjcz16rttla2BS7atMJp/aJRY++jHtw0NHkdICsjPfcWoy6hkmhQkb/1mAgpOpODpKDC51l9kHG8blQ9XACf7KXJCw X-OriginatorOrg: Mellanox.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Noam Camus Today there are platforms with many CPUs (up to 4K). Trying to boot only part of the CPUs may result in too long string. For example lets take NPS platform that is part of arch/arc. This platform have SMP system with 256 cores each with 16 HW threads (SMT machine) where HW thread appears as CPU to the kernel. In this example there is total of 4K CPUs. When one tries to boot only part of the HW threads from each core the string representing the map may be long... For example if for sake of performance we decided to boot only first half of HW threads of each core the map will look like: 0-7,16-23,32-39,...,4080-4087 This patch introduce new syntax to accommodate with such use case. I added an optional postfix to a range of CPUs which will choose according to given modulo the desired range of reminders i.e.: :sed_size/group_size For example, above map can be described in new syntax like this: 0-4095:8/16 Note that this patch is backward compatible with current syntax. Signed-off-by: Noam Camus --- Documentation/kernel-parameters.txt | 15 ++++++++++ lib/bitmap.c | 50 ++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 623502e..4f1e95b 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -33,6 +33,21 @@ can also be entered as Double-quotes can be used to protect spaces in values, e.g.: param="spaces in here" +Some of the kernel parameters takes list of CPUs as value e.g.: +isolcpus, task_isolation, nohz_full, irqaffinity, rcu_nocbs. +The format of this list is: +,..., +or +- +(must be a positive range in ascending order) +or a mixture +,...,- +Note that for special case of range one can split range into equal size of groups +and for each group to use some amount form the begin of that group. +-cpu number>:/ +For example one can add to its command line following parameter: +isolcpus=1,2,10-20,100-2000:2/25 + This document may not be entirely up to date and comprehensive. The command "modinfo -p ${modulename}" shows a current list of all parameters of a loadable module. Loadable modules, after being loaded into the running kernel, also diff --git a/lib/bitmap.c b/lib/bitmap.c index c66da50..9fb2cbc 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -496,6 +496,11 @@ EXPORT_SYMBOL(bitmap_print_to_pagebuf); * ranges. Consecutively set bits are shown as two hyphen-separated * decimal numbers, the smallest and largest bit numbers set in * the range. + * Optionally each range can be postfixed to denote that only parts of it + * should be set. The range will divided to groups of specific size. + * From each group will be used only defined amount of bits. + * Syntax: range:used_size/group_size + * Example: 0-1023:2/256 ==> 0,1,256,257,512,513,768,769 * * Returns 0 on success, -errno on invalid input strings. * Error values: @@ -507,16 +512,20 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, int is_user, unsigned long *maskp, int nmaskbits) { - unsigned a, b; + unsigned int a, b, old_a, old_b; + unsigned int group_size, used_size; int c, old_c, totaldigits, ndigits; const char __user __force *ubuf = (const char __user __force *)buf; - int at_start, in_range; + int at_start, in_range, in_partial_range; totaldigits = c = 0; + old_a = old_b = 0; + group_size = used_size = 0; bitmap_zero(maskp, nmaskbits); do { at_start = 1; in_range = 0; + in_partial_range = 0; a = b = 0; ndigits = totaldigits; @@ -547,6 +556,24 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, if ((totaldigits != ndigits) && isspace(old_c)) return -EINVAL; + if (c == '/') { + used_size = a; + at_start = 1; + in_range = 0; + a = b = 0; + continue; + } + + if (c == ':') { + old_a = a; + old_b = b; + at_start = 1; + in_range = 0; + in_partial_range = 1; + a = b = 0; + continue; + } + if (c == '-') { if (at_start || in_range) return -EINVAL; @@ -567,15 +594,30 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, } if (ndigits == totaldigits) continue; + if (in_partial_range) { + group_size = a; + a = old_a; + b = old_b; + old_a = old_b = 0; + } /* if no digit is after '-', it's wrong*/ if (at_start && in_range) return -EINVAL; - if (!(a <= b)) + if (!(a <= b) || !(used_size <= group_size)) return -EINVAL; if (b >= nmaskbits) return -ERANGE; while (a <= b) { - set_bit(a, maskp); + if (in_partial_range) { + static int pos_in_group = 1; + + if (pos_in_group <= used_size) + set_bit(a, maskp); + + if (a == b || ++pos_in_group > group_size) + pos_in_group = 1; + } else + set_bit(a, maskp); a++; } } while (buflen && c == ','); -- 1.7.1