Thread (48 messages) 48 messages, 5 authors, 2025-09-05

Re: [PATCH net-next v15 03/15] net: homa: create shared Homa header files

From: Paolo Abeni <pabeni@redhat.com>
Date: 2025-08-27 07:21:24

On 8/27/25 1:10 AM, John Ousterhout wrote:
On Tue, Aug 26, 2025 at 2:06 AM Paolo Abeni [off-list ref] wrote:
quoted
On 8/18/25 10:55 PM, John Ousterhout wrote:
quoted
+/**
+ * struct homa_net - Contains Homa information that is specific to a
+ * particular network namespace.
+ */
+struct homa_net {
+     /** @net: Network namespace corresponding to this structure. */
+     struct net *net;
+
+     /** @homa: Global Homa information. */
+     struct homa *homa;
It's not clear why the above 2 fields are needed. You could access
directly the global struct homa instance, and 'struct net' is usually
available when struct home_net is avail.
I have eliminated net but would like to retain homa. I have tried very
hard to avoid global variables in Homa, both for general pedagogical
reasons and because it simplifies unit testing. Right now there is no
need for a global homa except a couple of places in homa_plumbing.c,
and I'd like to maintain that encapsulation.
Note that there is no kernel convention against global per protocol
variables, when that does not prevent scaling.
quoted
quoted
+/**
+ * homa_clock() - Return a fine-grain clock value that is monotonic and
+ * consistent across cores.
+ * Return: see above.
+ */
+static inline u64 homa_clock(void)
+{
+     /* As of May 2025 there does not appear to be a portable API that
+      * meets Homa's needs:
+      * - The Intel X86 TSC works well but is not portable.
+      * - sched_clock() does not guarantee monotonicity or consistency.
+      * - ktime_get_mono_fast_ns and ktime_get_raw_fast_ns are very slow
+      *   (27 ns to read, vs 8 ns for TSC)
+      * Thus we use a hybrid approach that uses TSC (via get_cycles) where
+      * available (which should be just about everywhere Homa runs).
+      */
+#ifdef CONFIG_X86_TSC
+     return get_cycles();
+#else
+     return ktime_get_mono_fast_ns();
+#endif /* CONFIG_X86_TSC */
+}
ktime_get*() variant are fast enough to allow e.g. pktgen deals with
millions of packets x seconds. Both tsc() and ktime_get_mono_fast_ns()
suffer of various inconsistencies which will cause the most unexpected
issues in the most dangerous situation. I strongly advice against this
early optimization.
Which ktime_get variant do you recommend instead of ktime_get_mono_fast_ns?

I feel pretty strongly about retaining the use of TSC on Intel
platforms. As I have said before, Homa is attempting to operate in a
much more aggressive latency domain than Linux is used to, and
nanoseconds matter. I have been using TSC on Intel and AMD platforms
for more than 15 years and I have never had any problems. Is there a
specific inconsistency you know of that will cause "unexpected issues
in the most dangerous situations"? 
The TSC raw value depends on the current CPU. According to the relevant
documentation ktime_get_mono_fast_ns() is allowed to jump under certain
conditions: with either of them you can get sudden/unexpected tick
increases.
If not, I would prefer to retain
the use of TSC until someone can identify a real problem. Note that
the choice of clock is now well encapsulated, so if a change should
become necessary it will be very easy to make.
AFAICS, in the current revision there are several points that could
cause much greater latency - i.e. the long loops under BH lock with no
reschedule. I'm surprised they don't show as ms-latency bottle-necks
under stress test.

I suggest removing such issues before doing micro optimization that at
very least use APIs that are explicitly discouraged.

/P
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help