<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-toradex.git/tools/perf/tests/workloads/false_sharing.c, branch master</title>
<subtitle>Linux kernel for Apalis and Colibri modules</subtitle>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/'/>
<entry>
<title>perf test: Add false_sharing workload exhibiting cross-CPU false sharing</title>
<updated>2026-10-07T09:40:29+00:00</updated>
<author>
<name>Arnaldo Carvalho de Melo</name>
<email>acme@redhat.com</email>
</author>
<published>2026-10-06T14:57:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=bc01105ed65d15787b2eb93ac26e8624a2139e35'/>
<id>bc01105ed65d15787b2eb93ac26e8624a2139e35</id>
<content type='text'>
Add a 'perf test -w false_sharing' workload that hammers one shared
struct from several CPUs, shaped as a TCP connection: a read-mostly
identity (five-tuple) shares a cacheline with per-packet rx counters
(the false-sharing line), a second line has packet-path private tx and
congestion control counters, and a third the connection config.

The packet path runs in the main thread and up to four lookup threads
sum the five-tuple and pull the config, reading one volatile shared
instance directly so the accesses are PC-relative and resolvable by the
data type profiler.

Data type profiling of the workload with cacheline info:

  $ perf mem record -- perf test -r5 -w false_sharing
  [ perf record: Woken up 19 times to write data ]
  [ perf record: Captured and wrote 5.612 MB perf.data (72454 samples) ]
  $ perf report -s type,typecln -H --group --stdio
  # Total Lost Samples: 0
  #
  # Samples: 72K of events 'cpu/mem-loads,ldlat=30/P, cpu/mem-stores/P'
  # Event count (approx.): 1261814616
  #
  #            Overhead  Data Type / Data Type Cacheline
  # ...................  ...............................
  #
      88.99%  35.88%     struct net_conn
         56.43%  17.50%     struct net_conn: cache-line 0
         32.55%   0.00%     struct net_conn: cache-line 2
          0.01%  18.38%     struct net_conn: cache-line 1
      10.08%  63.03%     (unknown)
         10.08%  63.03%     (unknown): cache-line 0
       0.82%   0.13%     int
          0.82%   0.13%     int: cache-line 0
       0.01%   0.02%     struct folio
          0.01%   0.02%     struct folio: cache-line 0
       0.01%   0.03%     Elf64_Addr
          0.01%   0.03%     Elf64_Addr: cache-line 0
       0.01%   0.03%     struct sched_entity
          0.01%   0.03%     struct sched_entity: cache-line 1
          0.00%   0.00%     struct sched_entity: cache-line 4
          0.00%   0.00%     struct sched_entity: cache-line 2
          0.00%   0.00%     struct sched_entity: cache-line 3
          0.00%   0.00%     struct sched_entity: cache-line 0
       0.01%   0.00%     struct task_group
          0.01%   0.00%     struct task_group: cache-line 4
          0.00%   0.00%     struct task_group: cache-line 5
       0.00%   0.00%     struct css_rstat_cpu
          0.00%   0.00%     struct css_rstat_cpu: cache-line 0
  $ perf report -s type,typecln,typeoff -H --group --stdio
  # Total Lost Samples: 0
  #
  # Samples: 72K of events 'cpu/mem-loads,ldlat=30/P, cpu/mem-stores/P'
  # Event count (approx.): 1261814616
  #
  #               Overhead  Data Type / Data Type Cacheline / Data Type Offset
  # ......................  ..................................................
  #
      88.99%  35.88%        struct net_conn
         56.43%  17.50%        struct net_conn: cache-line 0
             9.81%   0.00%        struct net_conn +0xa (dport)
             9.54%   0.00%        struct net_conn +0x8 (sport)
             9.53%   0.00%        struct net_conn +0xc (state)
             9.48%   0.00%        struct net_conn +0xd (protocol)
             9.27%   0.00%        struct net_conn +0x4 (daddr)
             8.79%   0.00%        struct net_conn +0 (saddr)
             0.00%  12.08%        struct net_conn +0x10 (bytes_rx)
             0.00%   1.71%        struct net_conn +0x18 (packets_rx)
             0.00%   2.80%        struct net_conn +0x20 (rx_queue)
             0.00%   0.91%        struct net_conn +0x3c (last_ack)
         32.55%   0.00%        struct net_conn: cache-line 2
             5.70%   0.00%        struct net_conn +0x83 (rcv_wscale)
             5.46%   0.00%        struct net_conn +0x84 (keepalive_int)
             5.43%   0.00%        struct net_conn +0x82 (snd_wscale)
             5.39%   0.00%        struct net_conn +0x80 (mss)
             5.34%   0.00%        struct net_conn +0x88 (mark)
             5.23%   0.00%        struct net_conn +0x8c (priority)
          0.01%  18.38%        struct net_conn: cache-line 1
             0.01%   0.05%        struct net_conn +0x5c (retrans)
             0.00%   4.83%        struct net_conn +0x40 (bytes_tx)
             0.00%  10.63%        struct net_conn +0x48 (packets_tx)
             0.00%   1.54%        struct net_conn +0x58 (rtt_us)
             0.00%   1.07%        struct net_conn +0x50 (cwnd)
             0.00%   0.25%        struct net_conn +0x54 (ssthresh)
      10.08%  63.03%        (unknown)
         10.08%  63.03%        (unknown): cache-line 0
            10.08%  63.03%        (unknown)
       0.82%   0.13%        int
          0.82%   0.13%        int: cache-line 0
             0.82%   0.13%        int +0 (no field)
       0.01%   0.02%        struct folio
          0.01%   0.02%        struct folio: cache-line 0
             0.01%   0.00%        struct folio +0 (flags.f)
             0.00%   0.01%        struct folio +0x34 (_refcount.counter)
             0.00%   0.00%        struct folio +0x18 (mapping)

Assisted-by: LLM
Reviewed-by: Namhyung Kim &lt;namhyung@kernel.org&gt;
Signed-off-by: Arnaldo Carvalho de Melo &lt;acme@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add a 'perf test -w false_sharing' workload that hammers one shared
struct from several CPUs, shaped as a TCP connection: a read-mostly
identity (five-tuple) shares a cacheline with per-packet rx counters
(the false-sharing line), a second line has packet-path private tx and
congestion control counters, and a third the connection config.

The packet path runs in the main thread and up to four lookup threads
sum the five-tuple and pull the config, reading one volatile shared
instance directly so the accesses are PC-relative and resolvable by the
data type profiler.

Data type profiling of the workload with cacheline info:

  $ perf mem record -- perf test -r5 -w false_sharing
  [ perf record: Woken up 19 times to write data ]
  [ perf record: Captured and wrote 5.612 MB perf.data (72454 samples) ]
  $ perf report -s type,typecln -H --group --stdio
  # Total Lost Samples: 0
  #
  # Samples: 72K of events 'cpu/mem-loads,ldlat=30/P, cpu/mem-stores/P'
  # Event count (approx.): 1261814616
  #
  #            Overhead  Data Type / Data Type Cacheline
  # ...................  ...............................
  #
      88.99%  35.88%     struct net_conn
         56.43%  17.50%     struct net_conn: cache-line 0
         32.55%   0.00%     struct net_conn: cache-line 2
          0.01%  18.38%     struct net_conn: cache-line 1
      10.08%  63.03%     (unknown)
         10.08%  63.03%     (unknown): cache-line 0
       0.82%   0.13%     int
          0.82%   0.13%     int: cache-line 0
       0.01%   0.02%     struct folio
          0.01%   0.02%     struct folio: cache-line 0
       0.01%   0.03%     Elf64_Addr
          0.01%   0.03%     Elf64_Addr: cache-line 0
       0.01%   0.03%     struct sched_entity
          0.01%   0.03%     struct sched_entity: cache-line 1
          0.00%   0.00%     struct sched_entity: cache-line 4
          0.00%   0.00%     struct sched_entity: cache-line 2
          0.00%   0.00%     struct sched_entity: cache-line 3
          0.00%   0.00%     struct sched_entity: cache-line 0
       0.01%   0.00%     struct task_group
          0.01%   0.00%     struct task_group: cache-line 4
          0.00%   0.00%     struct task_group: cache-line 5
       0.00%   0.00%     struct css_rstat_cpu
          0.00%   0.00%     struct css_rstat_cpu: cache-line 0
  $ perf report -s type,typecln,typeoff -H --group --stdio
  # Total Lost Samples: 0
  #
  # Samples: 72K of events 'cpu/mem-loads,ldlat=30/P, cpu/mem-stores/P'
  # Event count (approx.): 1261814616
  #
  #               Overhead  Data Type / Data Type Cacheline / Data Type Offset
  # ......................  ..................................................
  #
      88.99%  35.88%        struct net_conn
         56.43%  17.50%        struct net_conn: cache-line 0
             9.81%   0.00%        struct net_conn +0xa (dport)
             9.54%   0.00%        struct net_conn +0x8 (sport)
             9.53%   0.00%        struct net_conn +0xc (state)
             9.48%   0.00%        struct net_conn +0xd (protocol)
             9.27%   0.00%        struct net_conn +0x4 (daddr)
             8.79%   0.00%        struct net_conn +0 (saddr)
             0.00%  12.08%        struct net_conn +0x10 (bytes_rx)
             0.00%   1.71%        struct net_conn +0x18 (packets_rx)
             0.00%   2.80%        struct net_conn +0x20 (rx_queue)
             0.00%   0.91%        struct net_conn +0x3c (last_ack)
         32.55%   0.00%        struct net_conn: cache-line 2
             5.70%   0.00%        struct net_conn +0x83 (rcv_wscale)
             5.46%   0.00%        struct net_conn +0x84 (keepalive_int)
             5.43%   0.00%        struct net_conn +0x82 (snd_wscale)
             5.39%   0.00%        struct net_conn +0x80 (mss)
             5.34%   0.00%        struct net_conn +0x88 (mark)
             5.23%   0.00%        struct net_conn +0x8c (priority)
          0.01%  18.38%        struct net_conn: cache-line 1
             0.01%   0.05%        struct net_conn +0x5c (retrans)
             0.00%   4.83%        struct net_conn +0x40 (bytes_tx)
             0.00%  10.63%        struct net_conn +0x48 (packets_tx)
             0.00%   1.54%        struct net_conn +0x58 (rtt_us)
             0.00%   1.07%        struct net_conn +0x50 (cwnd)
             0.00%   0.25%        struct net_conn +0x54 (ssthresh)
      10.08%  63.03%        (unknown)
         10.08%  63.03%        (unknown): cache-line 0
            10.08%  63.03%        (unknown)
       0.82%   0.13%        int
          0.82%   0.13%        int: cache-line 0
             0.82%   0.13%        int +0 (no field)
       0.01%   0.02%        struct folio
          0.01%   0.02%        struct folio: cache-line 0
             0.01%   0.00%        struct folio +0 (flags.f)
             0.00%   0.01%        struct folio +0x34 (_refcount.counter)
             0.00%   0.00%        struct folio +0x18 (mapping)

Assisted-by: LLM
Reviewed-by: Namhyung Kim &lt;namhyung@kernel.org&gt;
Signed-off-by: Arnaldo Carvalho de Melo &lt;acme@redhat.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
