Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 398C6C64ED6 for ; Tue, 28 Feb 2023 07:18:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229701AbjB1HSx (ORCPT ); Tue, 28 Feb 2023 02:18:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43202 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229560AbjB1HSu (ORCPT ); Tue, 28 Feb 2023 02:18:50 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7E09C1F930 for ; Mon, 27 Feb 2023 23:18:48 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id j2so8621679wrh.9 for ; Mon, 27 Feb 2023 23:18:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=F7QCalr91Gu+O//k2T8jHNWqk9fHAxCkV2rWJc3mX7w=; b=BKPEUniu2DWkWFeSdD8cSwDs9HmeTmUGL2OwSl1vQgiSpHChoUfw3j7fTranYmIchi ORj8NCZHGwkC4Gspu3scmqUQFN+TiHoJ38ELCzTCH59K/8fuHqFQ+cDYnQWRJ4OTnLjh +TC29pOrlIPdabnrulHkXDR9ylfNebWyp0VBUI5un9qdrHjZNFaXXrB5S6/Q8+a1F/D+ 6oY/rHRB+qJmxayOgGXlwLnQ/t74EFZUTRY7Gh9xRFzOdQdU6rNk7MufqWSG94VKBCS4 Y7HUz23SxepSmxWP1h2piNWBsBRqhxXReERFBUq4YcJdA5sw7VWrnv5Cc899WU16RuCj j3/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=F7QCalr91Gu+O//k2T8jHNWqk9fHAxCkV2rWJc3mX7w=; b=XjgWtvWv4cR0dSAXz5lnwWI/Xkr4tRj9C0ndTaDFwuhgYkSMOS45YgrYxNfBlG2VWc q0DvFyHYbDbhU4bCbwtl/zx7ycEncRQ32G95aHdA3q63DyEcx6IvH8yTkY/DMn8UqpqL YXvWGNRY0HCrA0ju0/zTU4b8olIQ17hJ2gz9nx8FgXYzK0UGB+mufw2e6jN5qRlc2+cw gWpDoabxkGIVKney1FK7czcBHT/PH2X5WjMpeqBGyxE2Noeo7rPy3Gj9991mGwVXRK7v r4ljZlK/vG7rhWGtkgNtM0lUWxF8HlZRyYmvg2+nxHW2K08pn1D0tutgoUy6POEzHGPO Wz/Q== X-Gm-Message-State: AO0yUKWjjkdqT92VDQDBP0gGyadcBY97mF6EzGY2nYHijnkBSUzzqTKl ExL7dufgTMwqLxBlTcGvOjZkcHtWnX++ClhZ X-Google-Smtp-Source: AK7set/OLZm3GwMXjkvBXR46FiMX8Csqr2D7fe4SrUAsncGIN1lGAVYvHFbZyDb46n8V1jDm0GHUdQ== X-Received: by 2002:a5d:4568:0:b0:2c5:5eff:5c81 with SMTP id a8-20020a5d4568000000b002c55eff5c81mr1258957wrc.38.1677568726678; Mon, 27 Feb 2023 23:18:46 -0800 (PST) Received: from localhost (cst2-173-16.cust.vodafone.cz. [31.30.173.16]) by smtp.gmail.com with ESMTPSA id l1-20020a1ced01000000b003ea57808179sm14649183wmh.38.2023.02.27.23.18.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 23:18:46 -0800 (PST) Date: Tue, 28 Feb 2023 08:18:45 +0100 From: Andrew Jones To: JeeHeng Sia Cc: "paul.walmsley@sifive.com" , "palmer@dabbelt.com" , "aou@eecs.berkeley.edu" , "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Leyfoon Tan , Mason Huo Subject: Re: [PATCH v4 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Message-ID: <20230228071845.k6s6bcnesdsnw3jl@orel> References: <20230224095526.ctctpzw3p3csf6qj@orel> <24a6dbe6aa2043c7812bf7e258786e13@EXMBX066.cuchost.com> <20230224120715.wgqnqmkadsbqusus@orel> <180fda36f9974809b436c52e4b3eda58@EXMBX066.cuchost.com> <20230227075942.rgl4hqnwttwvoroe@orel> <178ca008701147828d2e62402ff4f78a@EXMBX066.cuchost.com> <20230227114435.eow57ax5zhysz3kv@orel> <20230228050457.zfbflfawctaccepv@orel> <803ac603023c4eeda4a0b8e414cce6f1@EXMBX066.cuchost.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <803ac603023c4eeda4a0b8e414cce6f1@EXMBX066.cuchost.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Feb 28, 2023 at 05:33:32AM +0000, JeeHeng Sia wrote: > > > > -----Original Message----- > > From: Andrew Jones > > Sent: Tuesday, 28 February, 2023 1:05 PM > > To: JeeHeng Sia > > Cc: paul.walmsley@sifive.com; palmer@dabbelt.com; aou@eecs.berkeley.edu; linux-riscv@lists.infradead.org; linux- > > kernel@vger.kernel.org; Leyfoon Tan ; Mason Huo > > Subject: Re: [PATCH v4 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk > > > > On Tue, Feb 28, 2023 at 01:32:53AM +0000, JeeHeng Sia wrote: > > > > > > > load image; > > > > > > > loop: Create pbe chain, return error if failed; > > > > > > > > > > > > This loop pseudocode is incomplete. It's > > > > > > > > > > > > loop: > > > > > > if (swsusp_page_is_forbidden(page) && swsusp_page_is_free(page)) > > > > > > return page_address(page); > > > > > > Create pbe chain, return error if failed; > > > > > > ... > > > > > > > > > > > > which I pointed out explicitly in my last reply. Also, as I asked in my > > > > > > last reply (and have been asking four times now, albeit less explicitly > > > > > > the first two times), how do we know at least one PBE will be linked? > > > > > 1 PBE correspond to 1 page, you shouldn't expect only 1 page is saved. > > > > > > > > I know PBEs correspond to pages. *Why* should I not expect only one page > > > > is saved? Or, more importantly, why should I expect more than zero pages > > > > are saved? > > > > > > > > Convincing answers might be because we *always* put the restore code in > > > > pages which get added to the PBE list or that the original page tables > > > > *always* get put in pages which get added to the PBE list. It's not very > > > > convincing to simply *assume* that at least one random page will always > > > > meet the PBE list criteria. > > > > > > > > > Hibernation core will do the calculation. If the PBEs (restore_pblist) linked successfully, the hibernated image will be restore else > > > > normal boot will take place. > > > > > > Or, even more specifically this time, where is the proof that for each > > > > > > hibernation resume, there exists some page such that > > > > > > !swsusp_page_is_forbidden(page) or !swsusp_page_is_free(page) is true? > > > > > forbidden_pages and free_pages are not contributed to the restore_pblist (as you already aware from the code). Infact, the > > > > forbidden_pages and free_pages are not save into the disk. > > > > > > > > Exactly, so those pages are *not* going to contribute to the greater than > > > > zero pages. What I've been asking for, from the beginning, is to know > > > > which page(s) are known to *always* contribute to the list. Or, IOW, how > > > > do you know the PBE list isn't empty, a.k.a restore_pblist isn't NULL? > > > Well, this is keep going around in a circle, thought the answer is in the hibernation code. restore_pblist get the pointer from the PBE, > > and the PBE already checked for validity. > > > > It keeps going around in circles because you keep avoiding my question by > > pointing out trivial linked list code. I'm not worried about the linked > > list code being correct. My concern is that you're using a linked list > > with an assumption that it is not empty. My question has been all along, > > how do you know it's not empty? > > > > I'll change the way I ask this time. Please take a look at your PBE list > > and let me know if there are PBEs on it that must be there on each > > hibernation resume, e.g. the resume code page is there or whatever. > > > > > Can I suggest you to submit a patch to the hibernation core? > > > > Why? What's wrong with it? > Kindly let me draw 2 scenarios for you. Option 1 is to add the restore_pblist checking to the hibernation core and option 2 is to add restore_pblist checking to the arch solution > Although I really don't think it is needed. But if you really wanted to add the checking, I would suggest to go with option 1. again, I really think that it is not needed! This entire email thread is because you've first coded, and now stated, that you don't think the PBE list will ever be empty. And now, below, I see you're proposing to return an error when the PBE list is empty, why? If there's nothing in the PBE list, then there's nothing to do for it. Why is that an error condition? Please explain to me why you think the PBE list *must* not be empty (which is what I've been asking for over and over). OIOW, are there any pages you have in mind which the resume kernel always uses and are also always going to end up in the suspend image? I don't know, but I assume clean, file-backed pages do not get added to the suspend image, which would rule out most kernel code pages. Also, many pages written during boot (which is where the resume kernel is at resume time) were no longer resident at hibernate time, so they won't be in the suspend image either. While it's quite likely I'm missing something obvious, I'd rather be told what that is than to assume the PBE list will never be empty. Which is why I keep asking about it... Thanks, drew > > //Option 1 > //Pseudocode to illustrate the image loading > initialize restore_pblist to null; > initialize safe_pages_list to null; > Allocate safe page list, return error if failed; > load image; > loop: Create pbe chain, return error if failed; > assign orig_addr and safe_page to pbe; > link pbe to restore_pblist; > /* Add checking here */ > return error if restore_pblist equal to null; > return pbe to handle->buffer; > check handle->buffer; > goto loop if no error else return with error; > > //option 2 > //Pseudocode to illustrate the image loading > initialize restore_pblist to null; > initialize safe_pages_list to null; > Allocate safe page list, return error if failed; > load image; > loop: Create pbe chain, return error if failed; > assign orig_addr and safe_page to pbe; > link pbe to restore_pblist; > return pbe to handle->buffer; > check handle->buffer; > goto loop if no error else return with error; > everything works correctly, continue the rest of the operation > invoke swsusp_arch_resume > > //@swsusp_arch_resume() > loop2: return error if restore_pblist is null > increment restore_pblist and goto loop2 > create temp_pg_table > continue the rest of the resume operation > > > > Thanks, > > drew