From mboxrd@z Thu Jan 1 00:00:00 1970 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F532C433F5 for ; Wed, 13 Oct 2021 19:33:03 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 16FED61163 for ; Wed, 13 Oct 2021 19:33:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 16FED61163 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=cmpxchg.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 6C5A76B006C; Wed, 13 Oct 2021 15:33:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6744F6B0071; Wed, 13 Oct 2021 15:33:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 51584900002; Wed, 13 Oct 2021 15:33:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0055.hostedemail.com [216.40.44.55]) by kanga.kvack.org (Postfix) with ESMTP id 4247B6B006C for ; Wed, 13 Oct 2021 15:33:02 -0400 (EDT) Received: from smtpin39.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id F1E643947E for ; Wed, 13 Oct 2021 19:33:01 +0000 (UTC) X-FDA: 78692412162.39.33E9816 Received: from mail-qk1-f176.google.com (mail-qk1-f176.google.com [209.85.222.176]) by imf09.hostedemail.com (Postfix) with ESMTP id 3DF513000105 for ; Wed, 13 Oct 2021 19:33:01 +0000 (UTC) Received: by mail-qk1-f176.google.com with SMTP id q125so3292792qkd.12 for ; Wed, 13 Oct 2021 12:33:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cmpxchg-org.20210112.gappssmtp.com; s=20210112; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=wCRjJ1PPa7v42X/iGBbgqz1JFtaAMtKf+gspWWexJBs=; b=ZrcBvhj5jVLF2XeVrTE0jWjbxYKwZ4hThHUdNINSy4FY70gDhf2sA3WHehI+RexRls JSPu1gAe0sJtY8D9MjrtdzFZgIqvBpDzN31PQce2i/SceCb+Ey5j2ndv114H6ySL3fqI jX8ZOT5u1d4cgKS6kUFou0Y3z40uCUWfEQJQSmDjkF5v11WHCuL8eoU8KVLg1NaiX6jh KR6iLlUIlsXsOae+UYD7gNkzGuilpAMoovz9PMREXWQU3csutfSq6Sk6eleDDYEtYuIh o3f+OAG6rNvuAnY+qDjKQCMAzwAvKnFCwkN4TkVBvKMuLszSO1HQWlc5lC2/PQL/QsL/ exTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=wCRjJ1PPa7v42X/iGBbgqz1JFtaAMtKf+gspWWexJBs=; b=4MlsQnS1xZNjC3JNGEJVx7x8rHERfTftHYuhvrC7D4uypAIEnQT68Z+Y2I/MsH8zBg Omgmkbhn7eM5N3N5LrcgTkt9D/I3NS/pcRDgHV9UpSFPyXJC6CFz3Ww1A2yrPZzm3pq0 Aq48BwQz6wug7nlV8AVefej9CP722pLNI2j0ioljEAJBfyVmfOW2k1IEyYjQnLB4Ej2G gbl1M99ty/pzSflzYgM86Ccc6w2yD6JcsyfWDbMHtglzDRyApN2HLnfa9yKefPOHhf9K AFblndaQ3YJoPwyJp06Edd2nRUXi8Q0LklCgzZdX6EkunkC8Sm2wpfWs8wU9DKxGnZT7 4n9A== X-Gm-Message-State: AOAM531hpvXeBiAH7CWtnBciYs7VmROuXh5HmXJoQVguZiMm9W55+Gug g/QJy8LCQteq9EZ9iJ+vuZtpZA== X-Google-Smtp-Source: ABdhPJynIqPB/USmQeMrvjS1kK2O8gDO0OkFlWcNGiFpu1UzNqJnaiSq4qpAim7/hAYAegqaPhZ0mQ== X-Received: by 2002:a05:620a:1a89:: with SMTP id bl9mr1097648qkb.108.1634153580511; Wed, 13 Oct 2021 12:33:00 -0700 (PDT) Received: from localhost (cpe-98-15-154-102.hvc.res.rr.com. [98.15.154.102]) by smtp.gmail.com with ESMTPSA id g11sm306652qko.31.2021.10.13.12.33.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Oct 2021 12:33:00 -0700 (PDT) Date: Wed, 13 Oct 2021 15:32:59 -0400 From: Johannes Weiner To: Matthew Wilcox Cc: linux-mm@kvack.org, Kent Overstreet , "Kirill A. Shutemov" , Vlastimil Babka , Michal Hocko , Roman Gushchin , linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH 00/11] PageSlab: eliminate unnecessary compound_head() calls Message-ID: References: <20211012180148.1669685-1-hannes@cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 3DF513000105 X-Stat-Signature: r3jxykikxou1sr6yfie5apw7qumg8u19 Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=cmpxchg-org.20210112.gappssmtp.com header.s=20210112 header.b=ZrcBvhj5; dmarc=pass (policy=none) header.from=cmpxchg.org; spf=pass (imf09.hostedemail.com: domain of hannes@cmpxchg.org designates 209.85.222.176 as permitted sender) smtp.mailfrom=hannes@cmpxchg.org X-HE-Tag: 1634153581-540445 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Wed, Oct 13, 2021 at 06:55:46PM +0100, Matthew Wilcox wrote: > On Wed, Oct 13, 2021 at 09:49:31AM -0400, Johannes Weiner wrote: > > On Wed, Oct 13, 2021 at 04:19:18AM +0100, Matthew Wilcox wrote: > > > For today, testing PageSlab on the tail page helps the test proceed > > > in parallel with the action. Looking at slub's kfree() for an example: > > > > > > page = virt_to_head_page(x); > > > if (unlikely(!PageSlab(page))) { > > > free_nonslab_page(page, object); > > > return; > > > } > > > slab_free(page->slab_cache, page, object, NULL, 1, _RET_IP_); > > > > > > Your proposal is certainly an improvement (since gcc doesn't know > > > that compound_head(compound_head(x)) == compound_head(x)), but I > > > think checking on the tail page is even better: > > > > > > page = virt_to_page(x); > > > if (unlikely(!PageSlab(page))) { > > > free_nonslab_page(compound_head(page), object); > > > return; > > > } > > > slab = page_slab(page); > > > slab_free(slab->slab_cache, slab, object, NULL, 1, _RET_IP_); > > > > > > The compound_head() parts can proceed in parallel with the check of > > > PageSlab(). > > > > > > As far as the cost of setting PageSlab, those cachelines are already > > > dirty because we set compound_head on each of those pages already > > > (or in the case of freeing, we're about to clear compound_head on > > > each of those pages). > > > > ... but this is not. I think the performance gains from this would > > have to be significant to justify complicating page flags further. > > My argument isn't really "this is more efficient", because I think > the performance gains are pretty minimal. More that I would like to > be able to write code in the style which we'll want to use when we're > using dynamically allocated memory descriptors. It's all just code, > and we can change it at any time, but better to change it to something > that continues to work well in the future. > > I don't think we end up with "virt_to_head_page()" in a dynamically > allocated memory descriptor world. The head page contains no different > information from the tail pages, and indeed the tail pages don't know > that they're tail pages, or where the head page is. Or maybe they're > all tail pages. I agree with that, but future-provisioning is a tradeoff. It'll be trivial to replace virt_to_head_page() with virt_to_page() and remove compound_head() calls when whatever is left of struct page will unconditionally point to a memory descriptor. And that can be part of the changes that make it so. But in today's codebase, maintaining type flags in the tail pages while having to go through the headpage to find the type descriptor makes things unnecessarily complicated in an area that already has accrued too much tech debt. I don't think that's a sensible thing to do as of today. > I could see a world where we had a virt_to_memdesc() which returned > a generic memory descriptor that could be cast to a struct slab if > the flags within that memdesc said it was a slab. But I think it works > out better to tag the memory descriptor pointer with a discriminator > that defines what the pointer is. Plus it saves a page flag. > > Maybe that's the best way to approach it -- how would you want to write > this part of kfree() when memory descriptors are dynamically allocated? There are still many question marks on how the split out memory descriptors actually will look like, and which state is tracked where. 'struct slab' is an excellent trial balloon. It's good to have common north stars to set the direction of where to place efforts ("small struct page, dynamically allocated descriptors etc.") but I don't think it makes sense to take on yet more tech debt in this area for a future that may not pan out the way we think now.