linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Lukas Wunner <lukas@wunner.de>
Cc: linux-kernel@vger.kernel.org,
	Michael Jamet <michael.jamet@intel.com>,
	Yehezkel Bernat <YehezkelShB@gmail.com>,
	Andreas Noever <andreas.noever@gmail.com>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Christian Kellner <ckellner@redhat.com>,
	Mario.Limonciello@dell.com
Subject: Re: [PATCH v3 19/36] thunderbolt: Extend tunnel creation to more than 2 adjacent switches
Date: Mon, 8 Apr 2019 10:35:17 +0300	[thread overview]
Message-ID: <20190408073517.GA3622@lahna.fi.intel.com> (raw)
In-Reply-To: <20190407165425.2z5kqm3wcfrxvqzb@wunner.de>

On Sun, Apr 07, 2019 at 06:54:25PM +0200, Lukas Wunner wrote:
> On Thu, Mar 28, 2019 at 03:36:16PM +0300, Mika Westerberg wrote:
> > +struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
> > +			      struct tb_port *dst, int dst_hopid, int link_nr,
> > +			      const char *name)
> >  {
> [...]
> > +	in_hopid = src_hopid;
> > +	out_port = NULL;
> > +
> > +	for (i = 0; i < num_hops; i++) {
> > +		in_port = tb_next_port_on_path(src, dst, out_port);
> > +		if (!in_port)
> > +			goto err;
> > +
> > +		if (in_port->dual_link_port && in_port->link_nr != link_nr)
> > +			in_port = in_port->dual_link_port;
> > +
> > +		ret = tb_port_alloc_in_hopid(in_port, in_hopid, -1);
> > +		if (ret < 0)
> > +			goto err;
> > +		in_hopid = ret;
> > +
> > +		out_port = tb_next_port_on_path(src, dst, in_port);
> > +		if (!out_port)
> > +			goto err;
> > +
> > +		if (out_port->dual_link_port && out_port->link_nr != link_nr)
> > +			out_port = out_port->dual_link_port;
> > +
> > +		if (i == num_hops - 1)
> > +			ret = tb_port_alloc_out_hopid(out_port, dst_hopid,
> > +						      dst_hopid);
> > +		else
> > +			ret = tb_port_alloc_out_hopid(out_port, -1, -1);
> > +
> > +		if (ret < 0)
> > +			goto err;
> > +		out_hopid = ret;
> > +
> > +		path->hops[i].in_hop_index = in_hopid;
> > +		path->hops[i].in_port = in_port;
> > +		path->hops[i].in_counter_index = -1;
> > +		path->hops[i].out_port = out_port;
> > +		path->hops[i].next_hop_index = out_hopid;
> > +
> > +		in_hopid = out_hopid;
> > +	}
> 
> According to the code comment in struct tb_regs_hop (in tb_regs.h),
> the out_hopid ("next_hop" in struct tb_regs_hop) denotes the
> "hop to take after sending the packet through out_port (on the
> incoming port of the next switch)".
> 
> So intuitively, the hop config space is like a routing table and
> the entry in in_port's hop config space specifies through which
> out_port the packets shall be routed, and which entry to look up
> on the remote port reachable through out_port.
> 
> This means that the out_hopid must always be identical to the in_hopid
> of out_port->remote.  Otherwise the routing wouldn't work.
> 
> And yet, you've introduced *two* struct ida for each port in
> patch 16.  This doesn't seem to make sense:  The out_hopids ida
> of a port always has to be identical to the in_hopids ida of that
> port's remote.  But if it's identical, why does it have to exist
> twice?

The reason for two HopID allocators (struct idas) is to make it possible
to track HopIDs to each direction. The same port can be output for one
path and input for another. I'm not sure how that can be done without
having two struct idas per port.

You are right, in case of out port HopID connecter to remote in port,
they should use the same HopID.

> Also, the above algorithm fails to ensure that the two struct ida
> are always identical:  It uses the out_hopid on the previous switch
> as *minimum* for the in_hopid on the current switch.  If that hopid
> is already taken by an existing tunnel, tb_port_alloc_in_hopid()
> will allocate a *different* hopid and thereby break the routing.
> 
> So either the code comment in struct tb_regs_hop is wrong, or this
> algorithm and the duplicate struct ida in patch 16 are wrong, or I'm
> missing something.

No you are right. I think the above code should look like:

	ret = tb_port_alloc_in_hopid(in_port, in_hopid, in_hopid);

instead of

	ret = tb_port_alloc_in_hopid(in_port, in_hopid, -1);

to make sure out port and in port of a remote use the same HopID. Will
fix.

  reply	other threads:[~2019-04-08  7:35 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-28 12:35 [PATCH v3 00/36] thunderbolt: Software connection manager improvements Mika Westerberg
2019-03-28 12:35 ` [PATCH v3 01/36] net: thunderbolt: Unregister ThunderboltIP protocol handler when suspending Mika Westerberg
2019-03-28 12:35 ` [PATCH v3 02/36] thunderbolt: Remove unused work field in struct tb_switch Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 03/36] thunderbolt: Drop duplicated get_switch_by_route() Mika Westerberg
2019-03-30  9:56   ` Lukas Wunner
2019-03-28 12:36 ` [PATCH v3 04/36] thunderbolt: Block reads and writes if switch is unplugged Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 05/36] thunderbolt: Take domain lock in switch sysfs attribute callbacks Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 06/36] thunderbolt: Do not allocate switch if depth is greater than 6 Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 07/36] thunderbolt: Enable TMU access when accessing port space on legacy devices Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 08/36] thunderbolt: Add dummy read after port capability list walk on Light Ridge Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 09/36] thunderbolt: Move LC specific functionality into a separate file Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 10/36] thunderbolt: Configure lanes when switch is initialized Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 11/36] thunderbolt: Set sleep bit when suspending switch Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 12/36] thunderbolt: Properly disable path Mika Westerberg
2019-03-31 15:24   ` Lukas Wunner
2019-03-28 12:36 ` [PATCH v3 13/36] thunderbolt: Cache adapter specific capability offset into struct port Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 14/36] thunderbolt: Rename tunnel_pci to tunnel Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 15/36] thunderbolt: Generalize tunnel creation functionality Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 16/36] thunderbolt: Add functions for allocating and releasing HopIDs Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 17/36] thunderbolt: Assign remote for both ports in case of dual link Mika Westerberg
2019-04-04 19:28   ` Lukas Wunner
2019-03-28 12:36 ` [PATCH v3 18/36] thunderbolt: Add helper function to iterate from one port to another Mika Westerberg
2019-04-04 19:39   ` Lukas Wunner
2019-03-28 12:36 ` [PATCH v3 19/36] thunderbolt: Extend tunnel creation to more than 2 adjacent switches Mika Westerberg
2019-04-07 16:54   ` Lukas Wunner
2019-04-08  7:35     ` Mika Westerberg [this message]
2019-04-08  8:53       ` Lukas Wunner
2019-04-08  9:07         ` Mika Westerberg
2019-04-08  9:49           ` Lukas Wunner
2019-04-08 10:34             ` Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 20/36] thunderbolt: Deactivate all paths before restarting them Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 21/36] thunderbolt: Discover preboot PCIe paths the boot firmware established Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 22/36] thunderbolt: Add support for full PCIe daisy chains Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 23/36] thunderbolt: Scan only valid NULL adapter ports in hotplug Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 24/36] thunderbolt: Generalize port finding routines to support all port types Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 25/36] thunderbolt: Rework NFC credits handling Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 26/36] thunderbolt: Add support for Display Port tunnels Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 27/36] thunderbolt: Do not tear down tunnels when driver is unloaded Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 28/36] thunderbolt: Run tb_xdp_handle_request() in system workqueue Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 29/36] thunderbolt: Add XDomain UUID exchange support Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 30/36] thunderbolt: Add support for DMA tunnels Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 31/36] thunderbolt: Make tb_switch_alloc() return ERR_PTR() Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 32/36] thunderbolt: Add support for XDomain connections Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 33/36] thunderbolt: Make __TB_[SW|PORT]_PRINT take const parameters Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 34/36] thunderbolt: Make rest of the logging to happen at debug level Mika Westerberg
2019-03-28 15:39   ` Joe Perches
2019-03-28 12:36 ` [PATCH v3 35/36] thunderbolt: Reword output of tb_dump_hop() Mika Westerberg
2019-03-28 12:36 ` [PATCH v3 36/36] thunderbolt: Start firmware on Titan Ridge Apple systems Mika Westerberg
2019-03-28 15:17 ` [PATCH v3 00/36] thunderbolt: Software connection manager improvements Mario.Limonciello
2019-03-28 16:56   ` Mika Westerberg
2019-04-01  4:31     ` Lukas Wunner
2019-04-01  7:44       ` Mika Westerberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190408073517.GA3622@lahna.fi.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=Mario.Limonciello@dell.com \
    --cc=YehezkelShB@gmail.com \
    --cc=andreas.noever@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=ckellner@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=michael.jamet@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).