Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4558206imu; Tue, 29 Jan 2019 03:46:42 -0800 (PST) X-Google-Smtp-Source: ALg8bN7idzgORkp1kPFTh5Iq/9/XgfluZNReKJUHWmyi71QBldLr6FbOa4PawgC4KIM4edoqPY+j X-Received: by 2002:a63:111c:: with SMTP id g28mr23074022pgl.85.1548762402492; Tue, 29 Jan 2019 03:46:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548762402; cv=none; d=google.com; s=arc-20160816; b=is9CKZ65ZsWdvIETEqbq/DnzvLNtQ5jd+2OvYQ51e+jHAk0XeDdEbz12v3uugXa9Pd bNAMRKwwYN7Lkjmp2mF4znqzbp/P0Q4FHC7EzdgcWqsUA9VmDRgdvOnuy/7/WbLskGwM ShH7U56lSJrWBojZoMtZXyLKlcNJuPLjvudx77g8VsSZIi/U+oQPet1JzzAKwLB7PC5v huPjRlhq3JNNsKSwFgr3RLmkFrgQytJDXzvurL809IYCsauuU21I8u3JFYPc98RHkJXC dXDZV/VPCLBF95Z/bDWy7VQ8cXteg/95OOiFN0cC0OpOpINU4DM16c2zPNb+tkwcxKer HMfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Dhx9cpG0dspB7Ph9C9DoStUx7I2rUK6zPbz1gMH6M5I=; b=yHIhT6SixKpsCvRvZy6UPyraRlet2wrY4qyhoBQOI58yWyQb/lvuiTdbHVIXaBl+n+ IshD1z+OwdAVAovnqnbHRnPEsc66iGXr5EnE9JQujeDr8wv84oP7cazjHWt59dVsN8PE AEUu+x/dGC9iPIr0r771tNgdTJX48Tq31u1WteuJLlf9ugRKjG28gzYdvXyNpqqlRVEa tkYdWLLUNhvbSXRIKuwpcL2ccT5LAiInBCiVkEC0Rq6m1Q8kVdNQJLNpnMSVg1zaNTnZ iaNszfVTCKcvfoO3XnWIjlJnSS8QJ4UGf0biIhHYlulimL+tH3LfsatzcrWlDg85N61g YJJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=KOdcZn1C; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s8si27467220pgl.503.2019.01.29.03.46.26; Tue, 29 Jan 2019 03:46:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=KOdcZn1C; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730038AbfA2Log (ORCPT + 99 others); Tue, 29 Jan 2019 06:44:36 -0500 Received: from mail.kernel.org ([198.145.29.99]:34940 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730591AbfA2Loe (ORCPT ); Tue, 29 Jan 2019 06:44:34 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 863572086C; Tue, 29 Jan 2019 11:44:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548762273; bh=LkDD/kWJJqXaq3qWjUEjleK8sbRJbaM8aMSnnVzATI0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KOdcZn1CKdyIulkeulCwua3z0U+YniK3ruVJasDU/9cavbr4cgIW/TFWl60f+QhRz BThR5IyF11lHeYdvnbaH8UrATzvprdWnXTYgbWQRXXF0jW9LSZ4tO4xQaEM5ILnYbu wNq6RdBr+0YEvxWjEj+5T3nOOgwBfMy2HT9nP/eY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vitaly Kuznetsov , stable@kernel.org, Sasha Levin Subject: [PATCH 4.19 050/103] hv_balloon: avoid touching uninitialized struct page during tail onlining Date: Tue, 29 Jan 2019 12:35:27 +0100 Message-Id: <20190129113202.534197576@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190129113159.567154026@linuxfoundation.org> References: <20190129113159.567154026@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Vitaly Kuznetsov commit da8ced360ca8ad72d8f41f5c8fcd5b0e63e1555f upstream. Hyper-V memory hotplug protocol has 2M granularity and in Linux x86 we use 128M. To deal with it we implement partial section onlining by registering custom page onlining callback (hv_online_page()). Later, when more memory arrives we try to online the 'tail' (see hv_bring_pgs_online()). It was found that in some cases this 'tail' onlining causes issues: BUG: Bad page state in process kworker/0:2 pfn:109e3a page:ffffe08344278e80 count:0 mapcount:1 mapping:0000000000000000 index:0x0 flags: 0xfffff80000000() raw: 000fffff80000000 dead000000000100 dead000000000200 0000000000000000 raw: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 page dumped because: nonzero mapcount ... Workqueue: events hot_add_req [hv_balloon] Call Trace: dump_stack+0x5c/0x80 bad_page.cold.112+0x7f/0xb2 free_pcppages_bulk+0x4b8/0x690 free_unref_page+0x54/0x70 hv_page_online_one+0x5c/0x80 [hv_balloon] hot_add_req.cold.24+0x182/0x835 [hv_balloon] ... Turns out that we now have deferred struct page initialization for memory hotplug so e.g. memory_block_action() in drivers/base/memory.c does pages_correctly_probed() check and in that check it avoids inspecting struct pages and checks sections instead. But in Hyper-V balloon driver we do PageReserved(pfn_to_page()) check and this is now wrong. Switch to checking online_section_nr() instead. Signed-off-by: Vitaly Kuznetsov Cc: stable@kernel.org Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/hv/hv_balloon.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c @@ -888,12 +888,14 @@ static unsigned long handle_pg_range(uns pfn_cnt -= pgs_ol; /* * Check if the corresponding memory block is already - * online by checking its last previously backed page. - * In case it is we need to bring rest (which was not - * backed previously) online too. + * online. It is possible to observe struct pages still + * being uninitialized here so check section instead. + * In case the section is online we need to bring the + * rest of pfns (which were not backed previously) + * online too. */ if (start_pfn > has->start_pfn && - !PageReserved(pfn_to_page(start_pfn - 1))) + online_section_nr(pfn_to_section_nr(start_pfn))) hv_bring_pgs_online(has, start_pfn, pgs_ol); }