Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752583AbdFMJqG (ORCPT ); Tue, 13 Jun 2017 05:46:06 -0400 Received: from mail-he1eur01on0121.outbound.protection.outlook.com ([104.47.0.121]:23296 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751891AbdFMJqC (ORCPT ); Tue, 13 Jun 2017 05:46:02 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: Re: [PATCH] aio: Add command to wait completion of all requests To: Cyrill Gorcunov References: <149700173837.15252.8419518498235874341.stgit@localhost.localdomain> <20170613081412.GA23987@uranus.lan> Cc: avagin@openvz.org, linux-kernel@vger.kernel.org, bcrl@kvack.org, viro@zeniv.linux.org.uk, akpm@linux-foundation.org, xemul@virtuozzo.com From: Kirill Tkhai Message-ID: <9d133393-1ea7-c370-24b0-7bb565428b7e@virtuozzo.com> Date: Tue, 13 Jun 2017 12:45:39 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170613081412.GA23987@uranus.lan> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: SG2PR01CA0017.apcprd01.prod.exchangelabs.com (2a01:111:e400:79a6::27) To HE1PR0801MB1337.eurprd08.prod.outlook.com (2603:10a6:3:39::27) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: HE1PR0801MB1337: X-MS-Office365-Filtering-Correlation-Id: cc235d19-f8b8-49ee-1ac7-08d4b240ffc7 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:HE1PR0801MB1337; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;3:FWHlHruiRAhA1Hv5rEKD5zME+nLsXmupRDERK5ACSXxul+c2BJUufqDtuPlUOwaYhZDBGUUDZcWO8LsglyKve5YnE2Zs1UKCZxs49ZpQvoVv+SbgpyLp/ieEtqxUYBEyYOR7aRsvxZmYwGrvlJfYx+HRChPfynBzS6AYOAZmrdqWIA6Cnlt2nha45C3BfSRmnE3UJyjjd8csSQLKyK7laDcuDHEb4Y6NXkGumkkRmmG6iuBFcBxD6jk0wKRaiFYG+ZlvaQ35IR6sPUvfDvIKlToM3+Bnllru9tiTog3nLX2FMyGCenHyP+ETVF39QPbJo8wl/C2wwyz/Pn7m/TfENg==;25:XDWaRFV3dSyDkwnV99Mc5ta0K86IOLQ2pt014U2ak4k9MiR37toxoMUEpf3XeW5t+COuW3VqdWqLbngGYMeKTq2CkRqNbxPJwM4SiKEeqczxD5H80QSPkr8e+PmYDd5d5TLz4CvFabiCmFfeuz6kttkXP2iwzIotivUE3uwTVrDOV0YZ27B1VvSD3An1jbHcqGPbdYQhAfTRUhhopARSKudHIf3bU3xqkPTOWE7YIkkFx5R8IP502nfZ1Qovtt7VdvwdLuQGlK3pMTaIPwHrkuvUc4Q0piqHhFXR/0idFAjOAZTFVrBBPqAu7D/ed8xGxDvIViANmcMfaPOLgWmYN6KETgdrSNTZ+1vpcFectQWH2QxZaf619FhfgAz9HuFa/dGuV4wUV4lTqmw+9tw7rwhTR1tnaCbwNMPWYAZIRWoO0eJjL3snguyqCd8tLbis6ymCGjMcTBpB+uExeRiWJYVNatQyyCy7Egx72x3bmtc= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;31:xrfuj7f+YHRULlQS6WFveKQ4SjI4asOndVklBHgoPQMiMfejajL0ba09t5Nw6cu3PN+G/Cu76qYb/0VHjlYVpfSzDBceHhKa1C+5EcDVHsxsBlzyL53RMlZun681q7k6MgRzh3MDtomD0t85MpmiBHYHKi6uo1Z+nEj0yxZVuvCzH0flRusXlhUkslZ6vSC6Lo9+lLLoZdNsUTcVtMh6jMcsZ96QWXIKct3aACSv08o=;20:gjCwjeexVDhC6U4OvGM5Hdf+aJJZE8p28Z73Cn18DqawrqprNRRre/INuPN4n3dIOxrcKfbKB+qgoVREp4TI3FQD7fAZ+gMK4TWwi1tt8ApAb1dnGl/tQaWQl0dUCpQu4lXu8DgjyNzY6kLKUVTgR76DRIaYqkmlnyvWH2X7CuUaVnNepmSjMgSugrtoys7uAjo3YtRcd6SIe2YGwVbiFFHv6x3vVj05DbFgCgESMMwoe1cLi5Fwwy3zuKpbl/XlltYSUo2Sh/4wJFsjkEWJVcmLZonYyf+4Nmb8mj+RHAjwdCY9rdTnsB6W6g2cSyZayVWH357EEuo4PJUVWOwQ8aC7unQDA4sx1NifqDQRM8YUhpS3Vkr+toRA1cgLwSzPDb1xDLLIdUx0yxm/pYslWyRh6LRleiYsTN1Kd8RuoJ0= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(20161123564025)(20161123560025)(20161123562025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:HE1PR0801MB1337;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:HE1PR0801MB1337; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;HE1PR0801MB1337;4:h7cf17OUL2rHGBZFopOZPJi6Q6z1OF/7KPrr?= =?Windows-1252?Q?Rs/BJVyMijAe7wdZwddar9TB2BVVL50GrlBEPBHOgon/pWIJcYr16IrH?= =?Windows-1252?Q?wYy3KnNaxF6hZM4p6D8D/KP64BcXn/XIJTgPCIPBGOQnRr9tLrlqVlHj?= =?Windows-1252?Q?N09Re5oCaaPFM6ZE7lETiOe4BZ87hx1Mh0mEaTG02r/XvTZPyfVFwfWS?= =?Windows-1252?Q?rvs1q3xrnZ64SPx6x2O3zDrJtbitXT1pvjQgry0wNJZyIranrRCUx/+5?= =?Windows-1252?Q?Jyd3UFHyQHd+G6JAsKzrq2nbJyAcBIkx0neFY8u4mhd9CeqFQGD7Qcsu?= =?Windows-1252?Q?TdotiYaL0ikmTuT+/XZLtS6hcI5ycMziXrzW7I0Xm/DHnZ0weeMrIU0+?= =?Windows-1252?Q?OcmoNrbKzYLOvXRnNvohXsdBXkmTlFduxP/v9kc+T4B4hE7LhARMSJ8f?= =?Windows-1252?Q?k7A6hSkRMcgqmSibFz1r6ku/MmI/A6XYvxS2jRD41UJ/UpvblWm4Yhrm?= =?Windows-1252?Q?U/eCvup22BaW7bGfQlnHie4JJYeNTTI1w48C/Ss7rdmfYWEv8eDwdgCu?= =?Windows-1252?Q?C5fdS+IX++36GhkLokUrnr0SK7eFD2qPH73iXqC4D4ROn7lH12UKMks0?= =?Windows-1252?Q?xeMziBulbII8G5fSGHtjSHUJvbnY6EtFxVAZ7fivyyyTl8h1UIAzDI5x?= =?Windows-1252?Q?VR+wl5c8lebKbdwIV0tw72qEFWFhCR26jyRrAOEWt42nPfJirKibuTdC?= =?Windows-1252?Q?navUqVW+lfxowgXzynWXOGvvyF/D3WYdfifmyASmaDsbE+sVBV3IxLco?= =?Windows-1252?Q?aF4SkRMIM17CvvlmoEcyuHBaoQgPEQMqPbCjJcXgLFT374rD7lERQW59?= =?Windows-1252?Q?GsiTnTZ6sGV+RPTI2o+R66XzFEieZt2E6V6h+h58eLYy/PTWsqgxqPHg?= =?Windows-1252?Q?byqO/LcZJtxewM113dh9wyrGlA29AZoVqKkMJ0lONMn3WBFa8Yhc9d6f?= =?Windows-1252?Q?CF3jvagI+zrcpPnOuOCRKNcvxzvZSFdxxYhoIDZVgCXuypzr4NE1xU1F?= =?Windows-1252?Q?4vG0hlMG/vrkKJla1QBO4ROVjlapMbmOoVE98IuetsAkUcziqAHmPrTf?= =?Windows-1252?Q?yCmKmFTilQy2eJwNoQMq4gcFWKReoD3elmIpUwQHCPNag7rT2wpcamcW?= =?Windows-1252?Q?m0rUDotfx54Xo6trk1X3cmHbcSRwMUzFt5MX2o8j9qcDulBDlkP8?= X-Forefront-PRVS: 0337AFFE9A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(39450400003)(39410400002)(39400400002)(39830400002)(24454002)(199003)(189002)(86362001)(64126003)(42186005)(50466002)(36756003)(23746002)(31686004)(81156014)(106356001)(105586002)(8676002)(229853002)(4326008)(6666003)(81166006)(2906002)(3846002)(65806001)(25786009)(53546009)(31696002)(6116002)(83506001)(6916009)(2950100002)(101416001)(68736007)(478600001)(6246003)(110136004)(38730400002)(76176999)(50986999)(54356999)(53936002)(230700001)(6486002)(66066001)(97736004)(4001350100001)(5660300001)(33646002)(65956001)(1411001)(189998001)(65826007)(7736002)(305945005)(47776003)(77096006)(107886003);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1337;H:[172.16.24.149];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;HE1PR0801MB1337;23:i/yIBauqUTsrl4E/8NGzAjsebWssn1r+C2Y?= =?Windows-1252?Q?X+VDAbI3NakBXLrODLoTUmPtADaZN2lTpMFDJhXfACH1odcsiLscLYuh?= =?Windows-1252?Q?zXpECYihAbwo447AuPgkbwFOrrazygQtjpHUGWrwoFx88hMZYYpN7DVN?= =?Windows-1252?Q?OKHMqIvrJsucfTFUMsFJgm8nEjk9xX9UN1XdOgT17EgTU2koiDyJ+jGs?= =?Windows-1252?Q?7gz0zEXD2ana83I78ODQSbq2BCNpvul6TKLitOQUe5iPedSFiVyWX70P?= =?Windows-1252?Q?2fpY8fxnTWJXXYQPP0Na/bw+ExLR+mpLy87Irg7B3eTJN1x+EMQxCvHI?= =?Windows-1252?Q?VzEZc9oyNYsLDnxt7GxiKLMTRB6godbY1TtY4iFS4nBNNYPi8zHNZqXG?= =?Windows-1252?Q?j7lZUW2q1DZU3uFaYnVK7+1pbo5Bc7b56pu7UUCPzCx4pVTwPcd10Zv/?= =?Windows-1252?Q?kKSO8g7bxiI2YyctnR78gR5cs5NydhEPrXQ31A16bS/Yb1++6Rq4WEpG?= =?Windows-1252?Q?xpMvszzTVCOpvB/pm/poCyuwbOZADsagHsvKtaIkXy1Ao1kFeq0UuXQW?= =?Windows-1252?Q?pjKXCDdzoFwhB2o4fBhSGclmFT/ct7NC5tMv5ZjxR1L7asIxkHQkY8RI?= =?Windows-1252?Q?AQFdRlNJ1s+Le4nxdmkKmrNb8G6l2dVGPNjfk/WibH3ihpdKF7LojT71?= =?Windows-1252?Q?Ex5lZILAhR/uBXpCX99r2njRO1L6d/NotbRPSLZGU0MUZk5i20A9eE1K?= =?Windows-1252?Q?9NV/oTbIxTFnsUv7SD0D7wEZzSGTUj1TAxrAOGEH/b4lymciFGfqLbcb?= =?Windows-1252?Q?DpT03Pje3pm8IiG7c07cuiJK1mg+PEzK7ii6ZEWUdCA0n87dl58GFpnS?= =?Windows-1252?Q?f7YIixKN+T8Az3FdMMsZ8q2UUnI47POylFHoNSc5DTdurhsFcbEDtBqF?= =?Windows-1252?Q?M55FKYiY8BWdtQLiQsblsbHueNCO91bM4xyxFHlIDcEiIBbmTJvqHr4F?= =?Windows-1252?Q?CpAPy+PmyloVBz76NMnqHbZcwqERI6EZK3CYSpM60VvuCviJLc00cQMm?= =?Windows-1252?Q?sj2PBA1vSimkJlEYITXFuaMALhTZoh0woU09jhdCjQkv63fZUf0hLCup?= =?Windows-1252?Q?+0LlsBmgBIZejJnT9mv+Tf9lhLceJV/QJKXwK7/5vWSckEA+Hr/9J4ur?= =?Windows-1252?Q?yMkzI9zmNuLKwrpeDpcDTuxZmMk29rveGYddWS9BTrc27DJUMklkZvOd?= =?Windows-1252?Q?b2KHJvfUnAIURJI5Fc3qPnFyu+DsBjBPjUKx4mdAMMKqkySVT4eys4xx?= =?Windows-1252?Q?zOfWQkTQQJVzmyzj65UnHJQzxcSKeptRdXcJBcPsCO6R5Jt8I7IYSPFQ?= =?Windows-1252?Q?b7yYMVk6+gXyoCdHKd8FMWCPIhUwTrsCMmK74Gps7tg37qq9Q8iyHYoQ?= =?Windows-1252?Q?6H1rt0cRSDHEJBCjZsGe11VCjkUyQpatvLGZMu+4VCkP0DJOzX4SCoDN?= =?Windows-1252?Q?sLM2nEtdf0wOK+yymuv0VIpOluqvB79o83B/hlzZBHR+aUtYYlqXh3kw?= =?Windows-1252?Q?nLjPp8eR/IWBFXYstXsAWikewIevK5jegYwgS?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;6:zboRm6YNBgT8/fHqa8Wd8w/PiZW37yjDj8Zmw19kVi4cEpWNGit2vCt672JE9Yr2WqJEu3ENO39LQPG1ytdI7aSIt71z+VcRxMl6NJ5pZa03BXuT65XE820BWWh9QzFxoJ9Poq5UZOKL4gREjRTETVjYa/XcDUxki6tmmkP6z8NDDSXOIwEbfR6N7lCFSfaTAnWJ1P2Lqy20sbOnbh5Xgt2Uk9WsNO40EyGl7HG/XrsEPXdlD9PsngXOyjfpIXqW8NI83PcMGuBB91/8Z5i5JgurcJgnoZ28JFg2Ism+C+bybuY2kqwCxTbBx0dh0akH/a76HvdWQvvrqTfNYMSnrdhRFGmD+v6iUCrRxbLNxtMH/A4k7/HMYil2DeU/FhAe9EL6n6CvoFHjTWO4iptPCBYyA6dPgzRvAlLlf/nEEeTNzPqFuIv7FYFqc7p70dRBVlB2BNe46HYz6YkwmSHNBuw8t1IKRIHfG6UeTMh5w3o/AFrybsaqfURk0aGNiAoNgYU8NISwWnmZxxV19dMdtg== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;5:zP+KGCsJAHd2TdRdHeaqU6ZTDGbu8frnMqJ57S9pQDARMtC9FoHz54A9g61ZNuwLezN2p2bmaZfISjXE03s8BY36EF/AQAm3drtdztVA7rcRjaQQCeaHnvfHRRCiVljTwvpl+YyeqTC44m3RHUu5cyOTrIuyu2tmjix/onfKzcJgSkVGI3k0MgNUk2RyI3r9JwaIGVxXFcSyPely0RaElqdz1cgf0JTWIVtBbUwHOUA+tFXLJo5Eyh32W3xj4ApCrATs3GRcKsSO+cvrUPw7Rch6OnvygDUp3an7SkGYBqsoAyP74oLIJySTLudgyb/cLsR3joc15SVrKrY+66PmlfMG78y2/zh6buE9Wm2tFPzhi9+6LS/9K2N2YbhBFw9dmksW6820Yl4pXiwHAsh1QtVLNkjf8xIxw8E6h6okmi1iIOMYGTt2bIFy84r/yOLz71GAB4io/n7rcPByv30xtIL6kWs+XIIwMa6OoSSfcRX67BBli1nyZo/lvN4npJJn;24:dwfuhInSdGEIMJ0DWMA2VKHOto6IwK5NYyyfEPoIXX2Ut2Cfo2mVGAoX+SpCHxN2Z4DuFrxHaKGF5bXMbkNdDofOIdqG5nWb+N2tW42/mL4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1337;7:APJUp7ijhoVpuEuSPK+XKcbvvh+6d4vI38MusElpSS9UC7291z5vJqLvbgPuxsTuNrWOXq3astrViYpBKXMqVPx3LC68bPczlXLlGvDnJpxaXDM1GIzGuQriFfcvVjuoyfc64j7zcwdsZ/4zVAYViY8WcjHRSCsfYCZJhshqmXqhOsp9KpD8Xct5HRiaNZsG1/SwVLa64z/9AT7VveBcJpIVwrNtcdE8/pZDu2mvGYLM6QnNxUzxULGilIA9iyvhb/SRPcoiZsE/yXgdafYXXYStFEO8vyRqY0K/M4QjrZ31hnsIDy0pTQKkYPq8cfl48zXxYAsAwrITulISpn1LXw==;20:ykBLawgraUjKB4cKLTANF6F/edBu/3KhNFQwWerEgMZ9mg2ylJxbZLdvPCtPYXp7UFMAV/kVF2/h9PG7+iqy5s4X0bAY6f1fyOb6PwnBBUWpmi5Srng/haDX6Gty2XBGnGrTZnvCeAg9+O+isIK2dvB9MuATw2LJO7IohDjVQVg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jun 2017 09:45:55.9657 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1337 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1603 Lines: 54 On 13.06.2017 11:14, Cyrill Gorcunov wrote: > On Fri, Jun 09, 2017 at 12:49:34PM +0300, Kirill Tkhai wrote: > ... >> +static int aio_wait_all(struct kioctx *ctx) >> +{ >> + unsigned users, reqs = 0; >> + struct kioctx_cpu *kcpu; >> + int cpu, ret; >> + >> + if (atomic_xchg(&ctx->dead, 1)) >> + return -EBUSY; >> + >> + users = atomic_read(¤t->mm->mm_users); >> + if (users > 1) { >> + /* >> + * Wait till concurrent threads and aio_complete() see >> + * dead flag. Implies full memory barrier on all cpus. >> + */ >> + synchronize_sched(); >> + } else { >> + /* >> + * Sync with aio_complete() to be sure it puts reqs_available, >> + * when dead flag is already seen. >> + */ >> + spin_lock_irq(&ctx->completion_lock); >> + } >> + >> + for_each_possible_cpu(cpu) { >> + kcpu = per_cpu_ptr(ctx->cpu, cpu); >> + reqs += kcpu->reqs_available; > > I'm not that familiar with AIO internals but this snippet worries me: > the reqs_available is unsigned int, reqs is unsigned it as well but > used as an accumulator over ALL cpus, can't it get overflow and > gives modulo result, should not it be unsigned long or something? All available reqs are initially contain in kioctx::reqs_available, which is atomic_t, and then they are distributed over percpu counters. So, this is OK. >> + kcpu->reqs_available = 0; >> + } >> + >> + if (users == 1) >> + spin_unlock_irq(&ctx->completion_lock); >> + >> + atomic_add(reqs, &ctx->reqs_available); >> + >> + ret = wait_event_interruptible(ctx->wait, reqs_completed(ctx)); >> + >> + atomic_set(&ctx->dead, 0); >> + >> + return ret; >> +}