Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp1627208pxv; Sat, 10 Jul 2021 09:58:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw06omwNnwXcG65Z+Ed9HjnPGXaaF/mUNKSEP8YLd0ChX23Gsjn1NTTjqdVI8GNQHARCQwP X-Received: by 2002:a17:906:4d08:: with SMTP id r8mr11441256eju.464.1625936338687; Sat, 10 Jul 2021 09:58:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625936338; cv=none; d=google.com; s=arc-20160816; b=QIwy4skMkiFtGBU4FTYldoqDTlx+w5AVudAaol0Xaf5mUBL9d8MQZ4ol5dSfmHyobX f3r1dzBYtbR+ISqyq46x48mZWWQONBTR24/idx0ZeyVigkYi+9ojmDyfZHbi5ArNH+04 WKCbOqkZIGDAddNFahZgKuHaV2E7SPm7DUSKTJD/tLTTJt9Ean+HmaIET2P0wCnSuU4E 2Do0ivAiYnKH74oawwQNbgNj3/YpEl+hN9j70WpqpiSmOFuTq6DknBo0jDI6FJ0z65oF asth4RszRT2feVvskOZegR1EbF2VsBqBB3QLJT7XxNjTbpRwa44iXqPbRMO8vvpNShrV p4pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=wFOGf0fHXSe0uYH1tmI6V0veKuGmSA46Np9pjLsOr6k=; b=oFRsVTOpCatIGqVOJPR16zwJywqQ4KAqZ3lCkAWaoB+cjuqRg35OV9MbUqPHOCRgKc T45chPeE6TQ7wNeySxMHWbzdm7libukzghAI79GiBSfUOHtuIRWyBqehhmlba/M/ywOm 1EWO3kUIZsGM0X9bule9ZeQWEx+GB4MnLUDOmqMlcRlt4GveRsEDWgWYzmsUS+dAV+ER QVFGqb2/bpWne2CAiqIXZ20OxQbw890/ilTakYqH9e1mNGOaIcHXut+nEBMfu5cz+Fxq /knhsDMq/ZGGFimDP8m3vEgrpfWpUZMl8k/rZPib5F/bsRzPq7YQ8+ZyrQEqLeZWwbFn R7ww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=vYfZROn7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id eb9si12026171ejc.250.2021.07.10.09.58.34; Sat, 10 Jul 2021 09:58:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=vYfZROn7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230116AbhGJQ6K (ORCPT + 99 others); Sat, 10 Jul 2021 12:58:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229555AbhGJQ6K (ORCPT ); Sat, 10 Jul 2021 12:58:10 -0400 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B0A86C0613DD; Sat, 10 Jul 2021 09:55:23 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id i20so23024475ejw.4; Sat, 10 Jul 2021 09:55:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=wFOGf0fHXSe0uYH1tmI6V0veKuGmSA46Np9pjLsOr6k=; b=vYfZROn7ptBqkU3Im7OlwsNbe/A2Gh3aliTChdfXPR3HHyB3RQdZXuaH/u1YLJLAqb YZFhdLcpfF0SrC0yZ2QCXChwsYwest+lwWRQnWfLK1hB1R7198ESuok07s177eyVAdWN AGW5fYKM9GWzOi/M6+b68CPq/NCpWBe8+G9CCLimRRzulDt8pccOPon4wEwxDIorI4Pi 3SBUVyOav/Wdq+GFKw1Vryp+qtRc2JBKCSo6Zby7Y7BFx4e8GlyqwcdKi314+TOt/RNQ LuMlBhxKBGwXAMs/By/irykQ7bYBaLSLx7GrUiMZpma09hTy4LCiJGfHTgZxckWrX7bL 7KDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=wFOGf0fHXSe0uYH1tmI6V0veKuGmSA46Np9pjLsOr6k=; b=PHb6FOLLx6vAs7lv4ZRNUx7ZO0TeDOeMBsA1ZrBVWZHYpm5IMpxIoP6i06IGgfaExn /Nbhnr81r1FULAKtwxoOZ4mLO5e9m0ppV40pp/FqlJX2z6jjDjCRCAGBEcFSXjXfWcOS IbtyvOY8zmJPUj1xYjUUKE6dotEcScuxpW6pSYdWRJlKXaftuK30NtB1DmGZ5T23LX0u ZZe/83usY/26bkTx1ONejbDfdgI5vlAleSNtP4KkvhlgankB3/XqLTY925RmFiRsQAOD Cbic7yZ8AhyScv8T9WF+R0ex5onupIp4AclJ0TxU2EPkBWK6WI1LWaR00tgXmG0kK0ac ESQg== X-Gm-Message-State: AOAM530N/Rse/AkNo1qo8lUQSdo1H/MYg5wcby/ySxLipiDtwMVZGwD4 cuSXyEJtlLrzz6qs1mQDOtHaL8kREvVT1cGSzCs= X-Received: by 2002:a17:907:1ca4:: with SMTP id nb36mr43839266ejc.33.1625936122151; Sat, 10 Jul 2021 09:55:22 -0700 (PDT) MIME-Version: 1.0 References: <1625903002-31619-1-git-send-email-linyunsheng@huawei.com> <1625903002-31619-3-git-send-email-linyunsheng@huawei.com> In-Reply-To: <1625903002-31619-3-git-send-email-linyunsheng@huawei.com> From: Alexander Duyck Date: Sat, 10 Jul 2021 09:55:10 -0700 Message-ID: Subject: Re: [PATCH rfc v2 2/5] page_pool: add interface for getting and setting pagecnt_bias To: Yunsheng Lin Cc: David Miller , Jakub Kicinski , Russell King - ARM Linux , Marcin Wojtas , linuxarm@openeuler.org, yisen.zhuang@huawei.com, Salil Mehta , thomas.petazzoni@bootlin.com, hawk@kernel.org, Ilias Apalodimas , Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrew Morton , Peter Zijlstra , Will Deacon , Matthew Wilcox , Vlastimil Babka , fenghua.yu@intel.com, guro@fb.com, Peter Xu , Feng Tang , Jason Gunthorpe , Matteo Croce , Hugh Dickins , Jonathan Lemon , Alexander Lobakin , Willem de Bruijn , wenxu@ucloud.cn, Cong Wang , Kevin Hao , nogikh@google.com, Marco Elver , Netdev , LKML , bpf Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Jul 10, 2021 at 12:44 AM Yunsheng Lin wrote: > > As suggested by Alexander, "A DMA mapping should be page > aligned anyway so the lower 12 bits would be reserved 0", > so it might make more sense to repurpose the lower 12 bits > of the dma address to store the pagecnt_bias for elevated > refcnt case in page pool. > > As newly added page_pool_get_pagecnt_bias() may be called > outside of the softirq context, so annotate the access to > page->dma_addr[0] with READ_ONCE() and WRITE_ONCE(). > > Other three interfaces using page->dma_addr[0] is only called > in the softirq context during normal rx processing, hopefully > the barrier in the rx processing will ensure the correct order > between getting and setting pagecnt_bias. > > Signed-off-by: Yunsheng Lin > --- > include/net/page_pool.h | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/include/net/page_pool.h b/include/net/page_pool.h > index 8d7744d..5746f17 100644 > --- a/include/net/page_pool.h > +++ b/include/net/page_pool.h > @@ -200,7 +200,7 @@ static inline void page_pool_recycle_direct(struct page_pool *pool, > > static inline dma_addr_t page_pool_get_dma_addr(struct page *page) > { > - dma_addr_t ret = page->dma_addr[0]; > + dma_addr_t ret = READ_ONCE(page->dma_addr[0]) & PAGE_MASK; > if (sizeof(dma_addr_t) > sizeof(unsigned long)) > ret |= (dma_addr_t)page->dma_addr[1] << 16 << 16; > return ret; > @@ -208,11 +208,31 @@ static inline dma_addr_t page_pool_get_dma_addr(struct page *page) > > static inline void page_pool_set_dma_addr(struct page *page, dma_addr_t addr) > { > - page->dma_addr[0] = addr; > + unsigned long dma_addr_0 = READ_ONCE(page->dma_addr[0]); > + > + dma_addr_0 &= ~PAGE_MASK; > + dma_addr_0 |= (addr & PAGE_MASK); So rather than doing all this testing and clearing it would probably be better to add a return value to the function and do something like: if (WARN_ON(dma_addr_0 & ~PAGE_MASK)) return -1; That way you could have page_pool_dma_map unmap, free the page, and return false indicating that the DMA mapping failed with a visible error in the event that our expectionat that the dma_addr is page aligned is ever violated. > + WRITE_ONCE(page->dma_addr[0], dma_addr_0); > + > if (sizeof(dma_addr_t) > sizeof(unsigned long)) > page->dma_addr[1] = upper_32_bits(addr); > } > > +static inline int page_pool_get_pagecnt_bias(struct page *page) > +{ > + return (READ_ONCE(page->dma_addr[0]) & ~PAGE_MASK); You don't need the parenthesis around the READ_ONCE and PAGE_MASK. > +} > + > +static inline void page_pool_set_pagecnt_bias(struct page *page, int bias) > +{ > + unsigned long dma_addr_0 = READ_ONCE(page->dma_addr[0]); > + > + dma_addr_0 &= PAGE_MASK; > + dma_addr_0 |= (bias & ~PAGE_MASK); > + > + WRITE_ONCE(page->dma_addr[0], dma_addr_0); > +} > + > static inline bool is_page_pool_compiled_in(void) > { > #ifdef CONFIG_PAGE_POOL > -- > 2.7.4 >