Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp138469imm; Mon, 4 Jun 2018 14:34:03 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJ4yqT6wjbu/pmHvbLwZOZ7Lz5/gvqMo54w2QC5zanF2OPAdgS9cj9NglXBIocf4S++u79H X-Received: by 2002:a62:d388:: with SMTP id z8-v6mr23125215pfk.8.1528148043220; Mon, 04 Jun 2018 14:34:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528148043; cv=none; d=google.com; s=arc-20160816; b=k/yaAqQlnqvd+smaqhqiHiBnDKL+Hvy6t7Uv6vDtj0L6q+0h+Bd4D2FYlQf2K62i5k 2F5/VLotiDw/CzxaU4+qOSIV5jgvxcWPb+rCngkCaZU1SQd/DnGgNd5naZzJr8Ynw8pl dQrvNJE1ZxM2RIpsfzlrzo3iBrRTWqvp5hTp9gsq2sfTLwdJSD/G7EB5OSXF0+eZZS59 vmGWJkY15jPStNsyfDH3G5lqNiILKhzmrx7Bs9iy9N0S+9/69rV29kpbnd59Jkk2RZRw PVXrVvRmh6Mt2pOqahj9Lg/iGJhVynYGXLOhUbRgVTPhrV8mfjyXVXDplnohz28gSmsG ZNbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=GJNLcgCyqZ3TjlcWSKdjECs+2CMbO7ycsxlSGbDZiqE=; b=LAvK4zWud/c+1eo0V5kM4zOU6EzsU1ibCoQ3+gC2FOLEYU8DaIrkJxwkUggRjod3j9 hoWT0L9fEA7rFPJYo7DnDU0L/ilz19qMPFgQ3WUwt9rI71/JnLjHuts7LRXYlG0pUFZt nBPRuqtX5eenODg4HEvjxwHWU5qXCE+edxch8MOte+LDPSC/C2mL0ae4EcLQ8wDvq3SF r4VDsBFs4ePBnufh3dy2nWZgcJEP2UYLvE3FiJe5cb+P6Ugkqokkc1U6SMOTYjC1wTjM upf6h07+AS+d9D17EQUWlX2hsULtY4nIkWzuZbIFxV8fr+Si1KJoRhtr6WjFof8N7VWI lblg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@herbertland-com.20150623.gappssmtp.com header.s=20150623 header.b=qJHZIeQL; 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 i88-v6si20269352pfa.219.2018.06.04.14.33.49; Mon, 04 Jun 2018 14:34:03 -0700 (PDT) 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=@herbertland-com.20150623.gappssmtp.com header.s=20150623 header.b=qJHZIeQL; 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 S1751406AbeFDVbF (ORCPT + 99 others); Mon, 4 Jun 2018 17:31:05 -0400 Received: from mail-qt0-f195.google.com ([209.85.216.195]:37210 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751053AbeFDVbD (ORCPT ); Mon, 4 Jun 2018 17:31:03 -0400 Received: by mail-qt0-f195.google.com with SMTP id q13-v6so207572qtp.4 for ; Mon, 04 Jun 2018 14:31:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=herbertland-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=GJNLcgCyqZ3TjlcWSKdjECs+2CMbO7ycsxlSGbDZiqE=; b=qJHZIeQLe/eHuiCXPi7jHwuLr+tglWlXOSAAt1n9WXaydy8KXX+E7xTrK7sA/JGdck LQ5de/YjUKxTcM9PJqvu6RoAn7m/UXEAAqDY3bw95ZS0VYU5urfh/Qz08kiMuCnV+pZQ MoTIBhMY+1VgfLIp0PIv0WxDJTQDzM9AH//hbZGUnI8g6G+o6R8P6Gt2i5249NFBeWio EfbMZCvcaL2Cpozh8TgGvcAlC11/lQjrPspwR/9qzHYnnmmdijz5eo0lsoRfpBy2Clco AuoOVmL3d3jveefqMAcAwBxeV9wRYtWKty6VP2siPyBqacoSGEcS/iA5Ce5HEpw3pXDK KcXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=GJNLcgCyqZ3TjlcWSKdjECs+2CMbO7ycsxlSGbDZiqE=; b=mT87TgzE2dS7PZQwO9ZtJYZoZpb7E623vew9aTf16dB0ZbeTRH60dgK4sqAcLDoxKR bT8reYcDJPe1P7eGkeEvz7RP655S4+dVBfdom1EUxT4+z8s4CEObrbZEyfKw84rcmmv8 JMCH3g1fd64N3ZjvBjlgOmTdAPUA0l4SRIltkvVtdZDMQdkb0HaKvdToENnvg+YrzL6S Q9ZcNfNWNAsMdS/HRBwyfz/NNTSGZpTi1JMO//5NMkBkeffIGOWRMeqFeHwYPtTpzugE 8U9y0IFyKreshnwoaTqp1OG1CzddnJUZ4WI5xKLHzOeTNuPMHzEq4xxa+CLeBnVFax1Y wmjA== X-Gm-Message-State: APt69E3V7fuMCJAIwRBcyE5isP5n7Bbytq+lnMdvULQ9HlUqDweSbLsO GNrRYMZKqy8ZItsXcsbbDXDXhemiJhhss/NgJzba4gI7 X-Received: by 2002:aed:24fa:: with SMTP id u55-v6mr12324496qtc.400.1528147862214; Mon, 04 Jun 2018 14:31:02 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:aed:33a2:0:0:0:0:0 with HTTP; Mon, 4 Jun 2018 14:31:01 -0700 (PDT) In-Reply-To: <87sh63pakb.fsf@notabene.neil.brown.name> References: <152782754287.30340.4395718227884933670.stgit@noble> <152782824964.30340.6329146982899668633.stgit@noble> <20180602154851.pfy4wryezuhxp76v@gondor.apana.org.au> <87y3fvpf40.fsf@notabene.neil.brown.name> <87sh63pakb.fsf@notabene.neil.brown.name> From: Tom Herbert Date: Mon, 4 Jun 2018 14:31:01 -0700 Message-ID: Subject: Re: [PATCH 10/18] rhashtable: remove rhashtable_walk_peek() To: NeilBrown Cc: Herbert Xu , Thomas Graf , Linux Kernel Network Developers , LKML , Tom Herbert Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jun 3, 2018 at 7:09 PM, NeilBrown wrote: > On Sun, Jun 03 2018, Tom Herbert wrote: > >> On Sun, Jun 3, 2018 at 5:30 PM, NeilBrown wrote: >>> On Sat, Jun 02 2018, Herbert Xu wrote: >>> >>>> On Fri, Jun 01, 2018 at 02:44:09PM +1000, NeilBrown wrote: >>>>> This function has a somewhat confused behavior that is not properly >>>>> described by the documentation. >>>>> Sometimes is returns the previous object, sometimes it returns the >>>>> next one. >>>>> Sometimes it changes the iterator, sometimes it doesn't. >>>>> >>>>> This function is not currently used and is not worth keeping, so >>>>> remove it. >>>>> >>>>> A future patch will introduce a new function with a >>>>> simpler interface which can meet the same need that >>>>> this was added for. >>>>> >>>>> Signed-off-by: NeilBrown >>>> >>>> Please keep Tom Herbert in the loop. IIRC he had an issue with >>>> this patch. >>> >>> Yes you are right - sorry for forgetting to add Tom. >>> >>> My understanding of where this issue stands is that Tom raised issue and >>> asked for clarification, I replied, nothing further happened. >>> >>> It summary, my position is that: >>> - most users of my new rhashtable_walk_prev() will use it like >>> rhasthable_talk_prev() ?: rhashtable_walk_next() >>> which is close to what rhashtable_walk_peek() does >>> - I know of no use-case that could not be solved if we only had >>> the combined operation >>> - BUT it is hard to document the combined operation, as it really >>> does two things. If it is hard to document, then it might be >>> hard to understand. >>> >>> So provide the most understandable/maintainable solution, I think >>> we should provide rhashtable_walk_prev() as a separate interface. >>> >> I'm still missing why requiring two API operations instead of one is >> simpler or easier to document. Also, I disagree that >> rhashtable_walk_peek does two things-- it just does one which is to >> return the current element in the walk without advancing to the next >> one. The fact that the iterator may or may not move is immaterial in >> the API, that is an implementation detail. In fact, it's conceivable >> that we might completely reimplement this someday such that the >> iterator works completely differently implementation semantics but the >> API doesn't change. Also the naming in your proposal is confusing, >> we'd have operations to get the previous, and the next next object-- >> so the user may ask where's the API to get the current object in the >> walk? The idea that we get it by first trying to get the previous >> object, and then if that fails getting the next object seems >> counterintuitive. > > To respond to your points out of order: > > - I accept that "rhashtable_walk_prev" is not a perfect name. It > suggests a stronger symmetry with rhasthable_walk_next than actually > exist. I cannot think of a better name, but I think the > description "Return the previously returned object if it is > still in the table" is clear and simple and explains the name. > I'm certainly open to suggestions for a better name. > > - I don't think it is meaningful to talk about a "current" element in a > table where asynchronous insert/remove is to be expected. > The best we can hope for is a "current location" is the sequence of > objects in the table - a location which is after some objects and > before all others. rhashtable_walk_next() returns the next object > after the current location, and advances the location pointer past > that object. > rhashtable_walk_prev() *doesn't* return the previous object in the > table. It returns the previously returned object. ("previous" in > time, but not in space, if you like). > > - rhashtable_walk_peek() currently does one of two different things. > It either returns the previously returned object (iter->p) if that > is still in the table, or it find the next object, steps over it, and > returns it. > > - I would like to suggest that when an API acts on a iterator object, > the question of whether or not the iterator is advanced *must* be a > fundamental question, not one that might change from time to time. > > Maybe a useful way forward would be for you to write documentation for > the rhashtable_walk_peek() interface which correctly describes what it > does and how it is used. Given that, I can implement that interface > with the stability improvements that I'm working on. > Here's how it's documented currently: "rhashtable_walk_peek - Return the next object but don't advance the iterator" I don't see what is incorrect about that. Peek returns the next object in the walk, however does not move the iterator past that object, so sucessive calls to peek return the same object. In other words it's a way to inspect the next object but not "consume" it. This is what is needed when netlink returns in the middle of a walk. The last object retrieved from the table may not have been processed completely, so it needs to be the first one processed on the next invocation to netlink. This is also easily distinguishable from "rhashtable_walk_next - Return the next object and advance the iterator" Where the only difference is that peek and walk is that, walk advances the iterator and peek does not. Hence why "peek" is a descriptive name for what is happening. Tom > Thanks, > NeilBrown