All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Serge Semin <fancer.lancer@gmail.com>
Cc: Jose Abreu <Jose.Abreu@synopsys.com>,
	Andrew Lunn <andrew@lunn.ch>, Conor Dooley <conor+dt@kernel.org>,
	Tomer Maimon <tmaimon77@gmail.com>,
	devicetree@vger.kernel.org, netdev@vger.kernel.org,
	openbmc@lists.ozlabs.org,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Rob Herring <robh+dt@kernel.org>,
	Maxime Chevallier <maxime.chevallier@bootlin.com>,
	Eric Dumazet <edumazet@google.com>,
	Jose Abreu <joabreu@synopsys.com>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	linux-kernel@vger.kernel.org,
	Heiner Kallweit <hkallweit1@gmail.com>
Subject: Re: [PATCH net-next 09/16] net: mdio: Add Synopsys DW XPCS management interface support
Date: Thu, 7 Dec 2023 14:02:27 +0000	[thread overview]
Message-ID: <ZXHQcyZbXwesy0MV@shell.armlinux.org.uk> (raw)
In-Reply-To: <jqwhgthwxfge6y4nv5mdnojqu76m4pi2mt2x6kwqiuqntcwj67@mewh42eey5ny>

On Thu, Dec 07, 2023 at 04:35:47PM +0300, Serge Semin wrote:
> Hi Andrew
> 
> On Wed, Dec 06, 2023 at 06:01:30PM +0100, Andrew Lunn wrote:
> > The compiler does a better job at deciding what to inline than we
> > humans do. If you can show the compiler is doing it wrong, then we
> > might accept them.
> 
> In general I would have agreed with you especially if the methods were
> heavier than what they are:
> static inline ptrdiff_t dw_xpcs_mmio_addr_format(int dev, int reg)
> {               
>         return FIELD_PREP(0x1f0000, dev) | FIELD_PREP(0xffff, reg);
> }               
>         
> static inline u16 dw_xpcs_mmio_addr_page(ptrdiff_t csr)
> {       
>         return FIELD_GET(0x1fff00, csr);
> }       
> 
> static inline ptrdiff_t dw_xpcs_mmio_addr_offset(ptrdiff_t csr)
> {
>         return FIELD_GET(0xff, csr);
> }
> 
> > But in general, netdev does not like inline in .C
> > file.
> 
> I see. I'll do as you say if you don't change your mind after my
> reasoning below.

This isn't Andrew saying it - you seem to have missed the detail that
"netdev". If Andrew doesn't say it, then DaveM, Jakub or Paolo will.

Have you read the "Inline functions" section in
Documentation/process/4.Coding.rst ?

> > Also, nothing in MDIO is hot path, it spends a lot of time
> > waiting for a slow bus. So inline is likely to just bloat the code for
> > no gain.
> 
> I would have been absolutely with you in this matter, if we were talking
> about a normal MDIO bus. In this case the devices are accessed over
> the system IO-memory. So the bus isn't that slow.
> 
> Regarding the compiler knowing better when to inline the code. Here is
> what it does with the methods above. If the inline keyword is
> specified the compiler will inline all three methods. If the keyword isn't
> specified then dw_xpcs_mmio_addr_format() won't be inlined while the rest
> two functions will be. So the only part at consideration is the
> dw_xpcs_mmio_addr_format() method since the rest of the functions are
> inlined anyway.
> 
> The dw_xpcs_mmio_addr_format() function body is of the 5 asm
> instructions length (on MIPS). Since the function call in this case
> requires two jump instructions (to function and back), one instruction
> to save the previous return address on stack and two instructions for
> the function arguments, the trade-off of having non-inlined function
> are those five additional instructions on each call. There are four
> dw_xpcs_mmio_addr_format() calls. So here is what we get in both
> cases:
> inlined:     5 func ins * 4 calls = 20 ins
> non-inlined: (5 func + 1 jump) ins + (1 jump + 1 ra + 2 arg) ins * 4 calls  = 22 ins
> but seeing the return address needs to be saved anyway in the callers
> here is what we finally get:
> non-inlined: (5 func + 1 jump) ins + (1 jump + 2 arg) ins * 4 calls  = 18 ins
> 
> So unless I am mistaken in some of the aspects if we have the function
> non-inlined then we'll save 2 instructions in the object file, but
> each call would require additional _4_ instructions to execute (2
> jumps and 2 arg creations), which makes the function execution almost
> two times longer than it would have been should it was inlined.

Rather than just focusing on instruction count, you also need to
consider things like branch prediction, prefetching and I-cache
usage. Modern CPUs don't execute instruction-by-instruction anymore.

It is entirely possible that the compiler is making better choices
even if it results in more jumps in the code.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

WARNING: multiple messages have this Message-ID (diff)
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Serge Semin <fancer.lancer@gmail.com>
Cc: Andrew Lunn <andrew@lunn.ch>,
	Maxime Chevallier <maxime.chevallier@bootlin.com>,
	Heiner Kallweit <hkallweit1@gmail.com>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Jose Abreu <joabreu@synopsys.com>,
	Jose Abreu <Jose.Abreu@synopsys.com>,
	Tomer Maimon <tmaimon77@gmail.com>,
	Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	openbmc@lists.ozlabs.org, netdev@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next 09/16] net: mdio: Add Synopsys DW XPCS management interface support
Date: Thu, 7 Dec 2023 14:02:27 +0000	[thread overview]
Message-ID: <ZXHQcyZbXwesy0MV@shell.armlinux.org.uk> (raw)
In-Reply-To: <jqwhgthwxfge6y4nv5mdnojqu76m4pi2mt2x6kwqiuqntcwj67@mewh42eey5ny>

On Thu, Dec 07, 2023 at 04:35:47PM +0300, Serge Semin wrote:
> Hi Andrew
> 
> On Wed, Dec 06, 2023 at 06:01:30PM +0100, Andrew Lunn wrote:
> > The compiler does a better job at deciding what to inline than we
> > humans do. If you can show the compiler is doing it wrong, then we
> > might accept them.
> 
> In general I would have agreed with you especially if the methods were
> heavier than what they are:
> static inline ptrdiff_t dw_xpcs_mmio_addr_format(int dev, int reg)
> {               
>         return FIELD_PREP(0x1f0000, dev) | FIELD_PREP(0xffff, reg);
> }               
>         
> static inline u16 dw_xpcs_mmio_addr_page(ptrdiff_t csr)
> {       
>         return FIELD_GET(0x1fff00, csr);
> }       
> 
> static inline ptrdiff_t dw_xpcs_mmio_addr_offset(ptrdiff_t csr)
> {
>         return FIELD_GET(0xff, csr);
> }
> 
> > But in general, netdev does not like inline in .C
> > file.
> 
> I see. I'll do as you say if you don't change your mind after my
> reasoning below.

This isn't Andrew saying it - you seem to have missed the detail that
"netdev". If Andrew doesn't say it, then DaveM, Jakub or Paolo will.

Have you read the "Inline functions" section in
Documentation/process/4.Coding.rst ?

> > Also, nothing in MDIO is hot path, it spends a lot of time
> > waiting for a slow bus. So inline is likely to just bloat the code for
> > no gain.
> 
> I would have been absolutely with you in this matter, if we were talking
> about a normal MDIO bus. In this case the devices are accessed over
> the system IO-memory. So the bus isn't that slow.
> 
> Regarding the compiler knowing better when to inline the code. Here is
> what it does with the methods above. If the inline keyword is
> specified the compiler will inline all three methods. If the keyword isn't
> specified then dw_xpcs_mmio_addr_format() won't be inlined while the rest
> two functions will be. So the only part at consideration is the
> dw_xpcs_mmio_addr_format() method since the rest of the functions are
> inlined anyway.
> 
> The dw_xpcs_mmio_addr_format() function body is of the 5 asm
> instructions length (on MIPS). Since the function call in this case
> requires two jump instructions (to function and back), one instruction
> to save the previous return address on stack and two instructions for
> the function arguments, the trade-off of having non-inlined function
> are those five additional instructions on each call. There are four
> dw_xpcs_mmio_addr_format() calls. So here is what we get in both
> cases:
> inlined:     5 func ins * 4 calls = 20 ins
> non-inlined: (5 func + 1 jump) ins + (1 jump + 1 ra + 2 arg) ins * 4 calls  = 22 ins
> but seeing the return address needs to be saved anyway in the callers
> here is what we finally get:
> non-inlined: (5 func + 1 jump) ins + (1 jump + 2 arg) ins * 4 calls  = 18 ins
> 
> So unless I am mistaken in some of the aspects if we have the function
> non-inlined then we'll save 2 instructions in the object file, but
> each call would require additional _4_ instructions to execute (2
> jumps and 2 arg creations), which makes the function execution almost
> two times longer than it would have been should it was inlined.

Rather than just focusing on instruction count, you also need to
consider things like branch prediction, prefetching and I-cache
usage. Modern CPUs don't execute instruction-by-instruction anymore.

It is entirely possible that the compiler is making better choices
even if it results in more jumps in the code.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

  reply	other threads:[~2023-12-07 14:04 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-05 10:35 [PATCH net-next 00/16] net: pcs: xpcs: Add memory-based management iface support Serge Semin
2023-12-05 10:35 ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 01/16] net: pcs: xpcs: Drop sentinel entry from 2500basex ifaces list Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 11:24   ` Vladimir Oltean
2023-12-05 11:24     ` Vladimir Oltean
2023-12-05 11:39     ` Serge Semin
2023-12-05 11:39       ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 02/16] net: pcs: xpcs: Drop redundant workqueue.h include directive Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 13:34   ` Andrew Lunn
2023-12-05 13:34     ` Andrew Lunn
2023-12-05 10:35 ` [PATCH net-next 03/16] net: pcs: xpcs: Return EINVAL in the internal methods Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 13:34   ` Andrew Lunn
2023-12-05 13:34     ` Andrew Lunn
2023-12-05 10:35 ` [PATCH net-next 04/16] net: pcs: xpcs: Explicitly return error on caps validation Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 05/16] net: pcs: xpcs: Move native device ID macro to linux/pcs/pcs-xpcs.h Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:45   ` Russell King (Oracle)
2023-12-05 10:45     ` Russell King (Oracle)
2023-12-05 11:14     ` Serge Semin
2023-12-05 11:14       ` Serge Semin
2023-12-05 11:22       ` Russell King (Oracle)
2023-12-05 11:22         ` Russell King (Oracle)
2023-12-05 11:48         ` Serge Semin
2023-12-05 11:48           ` Serge Semin
2023-12-05 11:27   ` Vladimir Oltean
2023-12-05 11:27     ` Vladimir Oltean
2023-12-05 11:49     ` Serge Semin
2023-12-05 11:49       ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 06/16] net: pcs: xpcs: Avoid creating dummy XPCS MDIO device Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:49   ` Russell King (Oracle)
2023-12-05 10:49     ` Russell King (Oracle)
2023-12-05 11:31     ` Serge Semin
2023-12-05 11:31       ` Serge Semin
2023-12-05 13:31       ` Russell King (Oracle)
2023-12-05 13:31         ` Russell King (Oracle)
2023-12-05 13:52       ` Andrew Lunn
2023-12-05 13:52         ` Andrew Lunn
2023-12-05 14:50         ` Russell King (Oracle)
2023-12-05 14:50           ` Russell King (Oracle)
2023-12-12 13:52           ` Serge Semin
2023-12-12 13:52             ` Serge Semin
2023-12-05 11:52   ` Vladimir Oltean
2023-12-05 11:52     ` Vladimir Oltean
2023-12-13 15:27     ` Serge Semin
2023-12-13 15:27       ` Serge Semin
2023-12-19 15:48       ` Serge Semin
2023-12-19 15:48         ` Serge Semin
2023-12-19 16:28         ` Vladimir Oltean
2023-12-19 16:28           ` Vladimir Oltean
2023-12-19 21:48           ` Serge Semin
2023-12-19 21:48             ` Serge Semin
2023-12-05 13:46   ` Russell King (Oracle)
2023-12-05 13:46     ` Russell King (Oracle)
2023-12-05 14:54     ` Russell King (Oracle)
2023-12-05 14:54       ` Russell King (Oracle)
2023-12-12 15:26       ` Serge Semin
2023-12-12 15:26         ` Serge Semin
2023-12-12 19:06         ` Russell King (Oracle)
2023-12-12 19:06           ` Russell King (Oracle)
2023-12-13 15:47           ` Serge Semin
2023-12-13 15:47             ` Serge Semin
2023-12-13  0:01     ` Serge Semin
2023-12-13  0:01       ` Serge Semin
2023-12-13 16:32       ` Russell King (Oracle)
2023-12-13 16:32         ` Russell King (Oracle)
2023-12-14 14:19         ` Serge Semin
2023-12-14 14:19           ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 07/16] net: pcs: xpcs: Split up xpcs_create() content to sub-functions Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 08/16] dt-bindings: net: Add Synopsys DW xPCS bindings Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-14 17:40   ` Rob Herring
2023-12-14 17:40     ` Rob Herring
2023-12-14 21:27     ` Serge Semin
2023-12-14 21:27       ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 09/16] net: mdio: Add Synopsys DW XPCS management interface support Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 12:32   ` Maxime Chevallier
2023-12-05 12:32     ` Maxime Chevallier
2023-12-06 16:48     ` Serge Semin
2023-12-06 16:48       ` Serge Semin
2023-12-06 17:01       ` Andrew Lunn
2023-12-06 17:01         ` Andrew Lunn
2023-12-07 13:35         ` Serge Semin
2023-12-07 13:35           ` Serge Semin
2023-12-07 14:02           ` Russell King (Oracle) [this message]
2023-12-07 14:02             ` Russell King (Oracle)
2023-12-07 14:54           ` Andrew Lunn
2023-12-07 14:54             ` Andrew Lunn
2023-12-08 16:07             ` Serge Semin
2023-12-08 16:07               ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 10/16] net: pcs: xpcs: Add generic DW XPCS MDIO-device support Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 11:13   ` Vladimir Oltean
2023-12-05 11:13     ` Vladimir Oltean
2023-12-05 11:35     ` Serge Semin
2023-12-05 11:35       ` Serge Semin
2023-12-05 12:23       ` Vladimir Oltean
2023-12-05 12:23         ` Vladimir Oltean
2023-12-08 14:11         ` Serge Semin
2023-12-08 14:11           ` Serge Semin
2023-12-08 16:33           ` Vladimir Oltean
2023-12-08 16:33             ` Vladimir Oltean
2023-12-14 11:54             ` Serge Semin
2023-12-14 11:54               ` Serge Semin
2023-12-14 12:00               ` Vladimir Oltean
2023-12-14 12:00                 ` Vladimir Oltean
2023-12-14 12:28                 ` Serge Semin
2023-12-14 12:28                   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 11/16] net: pcs: xpcs: Change xpcs_create_mdiodev() suffix to "byaddr" Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 23:03   ` kernel test robot
2023-12-05 23:03     ` kernel test robot
2023-12-05 23:03     ` kernel test robot
2023-12-07 14:37     ` Serge Semin
2023-12-07 14:37       ` Serge Semin
2023-12-07 14:37       ` Serge Semin
2023-12-06  0:29   ` kernel test robot
2023-12-06  0:29     ` kernel test robot
2023-12-06  0:29     ` kernel test robot
2023-12-05 10:35 ` [PATCH net-next 12/16] net: pcs: xpcs: Add xpcs_create_bynode() method Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 13/16] net: stmmac: intel: Register generic MDIO device Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-06  0:19   ` kernel test robot
2023-12-06  0:19     ` kernel test robot
2023-12-06  0:19     ` kernel test robot
2023-12-07 14:47     ` Serge Semin
2023-12-07 14:47       ` Serge Semin
2023-12-07 14:47       ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 14/16] net: stmmac: Pass netdev to XPCS setup function Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 15/16] net: stmmac: Add dedicated XPCS cleanup method Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35 ` [PATCH net-next 16/16] net: stmmac: Add externally detected DW XPCS support Serge Semin
2023-12-05 10:35   ` Serge Semin
2023-12-05 10:35   ` Serge Semin

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=ZXHQcyZbXwesy0MV@shell.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=Jose.Abreu@synopsys.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=andrew@lunn.ch \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=fancer.lancer@gmail.com \
    --cc=hkallweit1@gmail.com \
    --cc=joabreu@synopsys.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.chevallier@bootlin.com \
    --cc=netdev@vger.kernel.org \
    --cc=openbmc@lists.ozlabs.org \
    --cc=pabeni@redhat.com \
    --cc=robh+dt@kernel.org \
    --cc=tmaimon77@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.