Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2389668imj; Mon, 11 Feb 2019 01:55:11 -0800 (PST) X-Google-Smtp-Source: AHgI3IYxByrfu1Bt2ErAO8lzoUlVdwPi8eFrTn1Njuutud0OOcUqLFuof5Nq6JXYMLEJQGLdO6eY X-Received: by 2002:a63:9b11:: with SMTP id r17mr33044116pgd.416.1549878911760; Mon, 11 Feb 2019 01:55:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549878911; cv=none; d=google.com; s=arc-20160816; b=VtTSWJ47PSOgcbH6VcazL5n/rHyDZecY2zjwTuCRoiGHa8Wpe6mdvZ7/NP8J6/IZfq GpnA1e8tIYhTn05o9czCIP+GNDSTP4cZoJGwbqJIBwkIgFLc9DzQ6QyBbO+N4hb5HidG GtWKpVhY6PA5JDKqeBY1050rMYVhINJzazBapu1Vzp6Ndfhpko8rf3gYAy5nEq5PkqAZ EyCeWYTvmwvahw1A1QDRdDvz3yiAkw/GztvO1XsoLgzbWizz36/O0lmAAcIS9N62MC94 rSEIzR3Aqw2plqd90nrl2Gq9AqiwYsJvn/PwYtBvNZexwQ3YenuPiEgjl0fMkPEBP8fU s44w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:organization:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=miIbEhS1t6Wo6Q93BSrPGYhvmBPeUHXCbhpUlSU/0s8=; b=MifAz5iQKCW2/U5uuFq1PF7sYptqLSttC65ZLN2VE7kamX30euFof0ua31SAGFFIvF CY37pB901Go4/Mh0GrakMFaSOurb4Q0/nOY7C5TlH0AzybC6rqKT3syHNW0pQuedxSvI OgbwyWbmvpPqp+3aMdAVEYVQbFx0T24b577mYt9fEYrJhT1TY2uKthsley7CzD6vex9y 18fkwxEQ7BX26FRC5gyFiLG5YyLf5J7QJ0F6Bltsiyit9r/8ZWYAydF0etIya13Z+bt6 MlXVo8Ky5f2Nxd8OwIDQz12yh3kwGnoWR1uq2SjaR8AYwLFZrI35uzCnnZ9U+Uost7AK DAHw== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n5si9399459plp.266.2019.02.11.01.54.55; Mon, 11 Feb 2019 01:55:11 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726173AbfBKJyk (ORCPT + 99 others); Mon, 11 Feb 2019 04:54:40 -0500 Received: from mga04.intel.com ([192.55.52.120]:33942 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726015AbfBKJyj (ORCPT ); Mon, 11 Feb 2019 04:54:39 -0500 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Feb 2019 01:54:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,358,1544515200"; d="scan'208";a="317990891" Received: from lahna.fi.intel.com (HELO lahna) ([10.237.72.157]) by fmsmga006.fm.intel.com with SMTP; 11 Feb 2019 01:54:36 -0800 Received: by lahna (sSMTP sendmail emulation); Mon, 11 Feb 2019 11:54:36 +0200 Date: Mon, 11 Feb 2019 11:54:36 +0200 From: Mika Westerberg To: Lukas Wunner Cc: linux-kernel@vger.kernel.org, Michael Jamet , Yehezkel Bernat , Andreas Noever , Andy Shevchenko Subject: Re: [PATCH v2 13/28] thunderbolt: Add helper function to iterate from one port to another Message-ID: <20190211095436.GW7875@lahna.fi.intel.com> References: <20190206131738.43696-1-mika.westerberg@linux.intel.com> <20190206131738.43696-14-mika.westerberg@linux.intel.com> <20190211061600.6ty733qfagk7f6fp@wunner.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190211061600.6ty733qfagk7f6fp@wunner.de> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Feb 11, 2019 at 07:16:00AM +0100, Lukas Wunner wrote: > On Wed, Feb 06, 2019 at 04:17:23PM +0300, Mika Westerberg wrote: > > We need to be able to walk from one port to another when we are creating > > paths where there are multiple switches between two ports. For this > > reason introduce a new function tb_port_get_next() and a new macro > > tb_for_each_port(). > > These names seem fairly generic, they might as well refer to the next port > on a switch or iterate over the ports on a switch. E.g. I've proposed a > tb_sw_for_each_port() macro in this patch: > > https://lore.kernel.org/patchwork/patch/983863/ > > I'd suggest renaming tb_port_get_next() to something like > tb_next_port_on_path() or tb_path_next_port() or tb_path_walk(). OK, tb_next_port_on_path() sounds good to me. > And I'd suggest dropping tb_for_each_port() because there are only > two occurrences where it's used, one calculates the path length, > and I think that's simply the route string length plus 2, and the > other one in patch 17 isn't even interested in the ports along a path, > but rather in the switches between the root switch and the end of a path. > It seems simpler to just iterate from the switch at the end upwards to > the root switch by following the parent pointer in the switch's > struct device, or alternatively by bytewise iterating over the route > string and calling get_switch_at_route() each time. OK. > > +/** > > + * tb_port_get_next() - Return next port for given port > > + * @start: Start port of the walk > > + * @end: End port of the walk > > + * @prev: Previous port (%NULL if this is the first) > > + * > > + * This function can be used to walk from one port to another if they > > + * are connected through zero or more switches. If the @prev is dual > > + * link port, the function follows that link and returns another end on > > + * that same link. > > + * > > + * If the walk cannot be continued, returns %NULL. > > This sounds as if NULL is returned if an error occurs but that doesn't > seem to be what the function does. I'd suggest: > > "If the @end port has been reached, return %NULL." It returns NULL if @end cannot be reached. So what about: "If @end cannot be reached, returns %NULL" ? > > +struct tb_port *tb_port_get_next(struct tb_port *start, struct tb_port *end, > > + struct tb_port *prev) > > +{ > > + struct tb_port *port, *next; > > + > > + if (!prev) > > + return start; > > + > > + if (prev->sw == end->sw) { > > + if (prev != end) > > + return end; > > + return NULL; > > + } > > + > > + /* Switch back to use primary links for walking */ > > "Switch back" requires that you switched to something else before, > which you didn't. I'd suggest something like: > > "use primary link to discover next port" OK. > Why is it necessary to use the primary link anyway? Is the > ->remote member not set on the secondary link port? The reason > should probably be spelled out in the code comment. IIRC it was because you may have something in the middle with only one port (the primary). I'll add a comment here explaining that. > > + if (prev->dual_link_port && prev->link_nr) > > + port = prev->dual_link_port; > > + else > > + port = prev; > > + > > + if (start->sw->config.depth < end->sw->config.depth) { > > + if (port->remote && > > + port->remote->sw->config.depth > port->sw->config.depth) > > Can we use "if (!tb_is_upstream_port(port))" for consistency with the > if-clause below? Yes, I think that should work. > > + next = port->remote; > > + else > > + next = tb_port_at(tb_route(end->sw), port->sw); > > + } else if (start->sw->config.depth > end->sw->config.depth) { > > + if (tb_is_upstream_port(port)) > > + next = port->remote; > > + else > > + next = tb_upstream_port(port->sw); > > + } else { > > + /* Must be the same switch then */ > > + if (start->sw != end->sw) > > + return NULL; > > + return end; > > + } > > The else-clause here appears to be dead code, you've already checked > further up whether prev and end are on the same switch. OK. > > + > > + /* If prev was dual link return another end of that link then */ > > *Here* a "switch back" comment would be appropriate. Nit: Please either > end code comments with a period or don't start them with an upper case > letter. That's the style I've been using in this driver and elsewhere and is my preference anyway. I'll update the comment content, though. :)