diff mbox series

[v4,net-next,3/3] net: ena: Add PHC documentation

Message ID 20241114095930.200-4-darinzon@amazon.com (mailing list archive)
State Deferred
Delegated to: Netdev Maintainers
Headers show
Series PHC support in ENA driver | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 3 this patch: 3
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers warning 3 maintainers not CCed: corbet@lwn.net linux-doc@vger.kernel.org horms@kernel.org
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 3 this patch: 3
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 90 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2024-11-15--21-00 (tests: 789)

Commit Message

Arinzon, David Nov. 14, 2024, 9:59 a.m. UTC
Provide the relevant information and guidelines
about the feature support in the ENA driver.

Signed-off-by: Amit Bernstein <amitbern@amazon.com>
Signed-off-by: David Arinzon <darinzon@amazon.com>
---
 .../device_drivers/ethernet/amazon/ena.rst    | 78 +++++++++++++++++++
 1 file changed, 78 insertions(+)

Comments

Richard Cochran Nov. 17, 2024, 1:53 a.m. UTC | #1
On Thu, Nov 14, 2024 at 11:59:30AM +0200, David Arinzon wrote:

> +**phc_skp**         Number of skipped get time attempts (during block period).
> +**phc_err**         Number of failed get time attempts (entering into block state).

Just curious...  I understand that the HW can't support a very high
rate of gettime calls and that the driver will throttle them.

But why did you feel the need to document the throttling behavior in
such a overt way?  Are there user space programs out there calling
gettime excessively?

Thanks,
Richard
Richard Cochran Nov. 17, 2024, 2 a.m. UTC | #2
On Sat, Nov 16, 2024 at 05:53:26PM -0800, Richard Cochran wrote:
> On Thu, Nov 14, 2024 at 11:59:30AM +0200, David Arinzon wrote:
> 
> > +**phc_skp**         Number of skipped get time attempts (during block period).
> > +**phc_err**         Number of failed get time attempts (entering into block state).
> 
> Just curious...  I understand that the HW can't support a very high
> rate of gettime calls and that the driver will throttle them.
> 
> But why did you feel the need to document the throttling behavior in
> such a overt way?  Are there user space programs out there calling
> gettime excessively?

Answering my own question (maybe)

I see that your PHC only supports gettime(), and so I guess you must
have some atypical system setup in mind.

I didn't see any comments in the cover letter or in the patch about
why the PHC isn't adjustable or how offering gettime() only is useful?

Thanks,
Richard
Arinzon, David Nov. 19, 2024, 8:45 a.m. UTC | #3
> On Sat, Nov 16, 2024 at 05:53:26PM -0800, Richard Cochran wrote:
> > On Thu, Nov 14, 2024 at 11:59:30AM +0200, David Arinzon wrote:
> >
> > > +**phc_skp**         Number of skipped get time attempts (during block
> period).
> > > +**phc_err**         Number of failed get time attempts (entering into
> block state).
> >
> > Just curious...  I understand that the HW can't support a very high
> > rate of gettime calls and that the driver will throttle them.
> >
> > But why did you feel the need to document the throttling behavior in
> > such a overt way?  Are there user space programs out there calling
> > gettime excessively?
> 
> Answering my own question (maybe)
> 
> I see that your PHC only supports gettime(), and so I guess you must have
> some atypical system setup in mind.
> 
> I didn't see any comments in the cover letter or in the patch about why the
> PHC isn't adjustable or how offering gettime() only is useful?
> 
> Thanks,
> Richard

Hi Richard
	
Thank you for the queries.

Our device limits the number of requests per client (VM) through throttling.
To avoid reaching our device throttling limit and ensure a fail-fast mechanism,
the driver preemptively applies throttling.
In addition, AWS cannot be adjusted or controlled by the OS/User to correct any time deviations,
instead, AWS manages the synchronization and accuracy of the clock internally and provides a
pre-disciplined clock that already adheres to Coordinated Universal Time (UTC) standards.
An upcoming patch, which is a continuation of https://lore.kernel.org/netdev/4c2e99b4-b19e-41f5-a048-3bcc8c33a51c@lunn.ch/T/#m58cf9b05b34046b3952ae8bf4cc7d7f2c8b011d7,
will introduce the error bound in ENA PHC, providing internal AWS accuracy error measurements (in nanoseconds).

Thanks,
David
Richard Cochran Nov. 21, 2024, 4:58 a.m. UTC | #4
On Tue, Nov 19, 2024 at 08:45:52AM +0000, Arinzon, David wrote:
> Our device limits the number of requests per client (VM) through throttling.

So it sounds like this device provides time to VM guests?

If so, you might consider generating an interrupt to provide a
"virtual" PPS as some of the other VM solutions do.  That way, you
avoid all of those unwanted gettime() calls.

HTH,
Richard
Arinzon, David Nov. 21, 2024, 6:59 p.m. UTC | #5
> On Tue, Nov 19, 2024 at 08:45:52AM +0000, Arinzon, David wrote:
> > Our device limits the number of requests per client (VM) through
> throttling.
> 
> So it sounds like this device provides time to VM guests?
> 
> If so, you might consider generating an interrupt to provide a "virtual" PPS as
> some of the other VM solutions do.  That way, you avoid all of those
> unwanted gettime() calls.
> 
> HTH,
> Richard

Hi Richard,

AWS instances currently lack support for the 1PPS signal.
Currently, time information can only be accessed via the GetTime call.
Some instance families already provide this functionality,
with the solution designed to work consistently across both bare-metal and virtualized environments.

Thanks,
David
diff mbox series

Patch

diff --git a/Documentation/networking/device_drivers/ethernet/amazon/ena.rst b/Documentation/networking/device_drivers/ethernet/amazon/ena.rst
index 4561e8ab..12b13da0 100644
--- a/Documentation/networking/device_drivers/ethernet/amazon/ena.rst
+++ b/Documentation/networking/device_drivers/ethernet/amazon/ena.rst
@@ -56,6 +56,7 @@  ena_netdev.[ch]     Main Linux kernel driver.
 ena_ethtool.c       ethtool callbacks.
 ena_xdp.[ch]        XDP files
 ena_pci_id_tbl.h    Supported device IDs.
+ena_phc.[ch]        PTP hardware clock infrastructure (see `PHC`_ for more info)
 =================   ======================================================
 
 Management Interface:
@@ -221,6 +222,83 @@  descriptor it was received on would be recycled. When a packet smaller
 than RX copybreak bytes is received, it is copied into a new memory
 buffer and the RX descriptor is returned to HW.
 
+.. _`PHC`:
+
+PTP Hardware Clock (PHC)
+========================
+.. _`ptp-userspace-api`: https://docs.kernel.org/driver-api/ptp.html#ptp-hardware-clock-user-space-api
+.. _`testptp`: https://elixir.bootlin.com/linux/latest/source/tools/testing/selftests/ptp/testptp.c
+
+ENA Linux driver supports PTP hardware clock providing timestamp reference to achieve nanosecond resolution.
+
+**PHC support**
+
+PHC depends on the PTP module, which needs to be either loaded as a module or compiled into the kernel.
+
+Verify if the PTP module is present:
+
+.. code-block:: shell
+
+  grep -w '^CONFIG_PTP_1588_CLOCK=[ym]' /boot/config-`uname -r`
+
+- If no output is provided, the ENA driver cannot be loaded with PHC support.
+
+- ``CONFIG_PTP_1588_CLOCK=y``: the PTP module is already compiled and loaded inside the kernel binary file.
+
+- ``CONFIG_PTP_1588_CLOCK=m``: the PTP module needs to be loaded prior to loading the ENA driver:
+
+Load PTP module:
+
+.. code-block:: shell
+
+  sudo modprobe ptp
+
+All available PTP clock sources can be tracked here:
+
+.. code-block:: shell
+
+  ls /sys/class/ptp
+
+PHC support and capabilities can be verified using ethtool:
+
+.. code-block:: shell
+
+  ethtool -T <interface>
+
+**PHC timestamp**
+
+To retrieve PHC timestamp, use `ptp-userspace-api`_, usage example using `testptp`_:
+
+.. code-block:: shell
+
+  testptp -d /dev/ptp$(ethtool -T <interface> | awk '/PTP Hardware Clock:/ {print $NF}') -k 1
+
+PHC get time requests should be within reasonable bounds,
+avoid excessive utilization to ensure optimal performance and efficiency.
+The ENA device restricts the frequency of PHC get time requests to a maximum
+of 125 requests per second. If this limit is surpassed, the get time request
+will fail, leading to an increment in the phc_err statistic.
+
+**PHC statistics**
+
+PHC can be monitored using :code:`ethtool -S` counters:
+
+=================   ======================================================
+**phc_cnt**         Number of successful retrieved timestamps (below expire timeout).
+**phc_exp**         Number of expired retrieved timestamps (above expire timeout).
+**phc_skp**         Number of skipped get time attempts (during block period).
+**phc_err**         Number of failed get time attempts (entering into block state).
+=================   ======================================================
+
+PHC timeouts:
+
+=================   ======================================================
+**expire**          Max time for a valid timestamp retrieval, passing this threshold will fail
+                    the get time request and block new requests until block timeout.
+**block**           Blocking period starts once get time request expires or fails, all get time
+                    requests during block period will be skipped.
+=================   ======================================================
+
 Statistics
 ==========