From: Jesper Dangaard Brouer <brouer@redhat.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH v2 0/5] Introducing ixgbe AF_XDP ZC support
Date: Thu, 4 Oct 2018 23:18:48 +0200 [thread overview]
Message-ID: <20181004231848.33efd81f@redhat.com> (raw)
In-Reply-To: <20181002080034.11754-1-bjorn.topel@gmail.com>
On Tue, 2 Oct 2018 10:00:29 +0200
Bj?rn T?pel <bjorn.topel@gmail.com> wrote:
> From: Bj?rn T?pel <bjorn.topel@intel.com>
>
> Jeff: Please remove the v1 patches from your dev-queue!
>
> This patch set introduces zero-copy AF_XDP support for Intel's ixgbe
> driver.
>
> The ixgbe zero-copy code is located in its own file ixgbe_xsk.[ch],
> analogous to the i40e ZC support. Again, as in i40e, code paths have
> been copied from the XDP path to the zero-copy path. Going forward we
> will try to generalize more code between the AF_XDP ZC drivers, and
> also reduce the heavy C&P.
>
> We have run some benchmarks on a dual socket system with two Broadwell
> E5 2660 @ 2.0 GHz with hyperthreading turned off. Each socket has 14
> cores which gives a total of 28, but only two cores are used in these
> experiments. One for TR/RX and one for the user space application. The
> memory is DDR4 @ 2133 MT/s (1067 MHz) and the size of each DIMM is
> 8192MB and with 8 of those DIMMs in the system we have 64 GB of total
> memory. The compiler used is GCC 7.3.0. The NIC is Intel
> 82599ES/X520-2 10Gbit/s using the ixgbe driver.
>
> Below are the results in Mpps of the 82599ES/X520-2 NIC benchmark runs
> for 64B and 1500B packets, generated by a commercial packet generator
> HW blasting packets at full 10Gbit/s line rate. The results are with
> retpoline and all other spectre and meltdown fixes.
>
> AF_XDP performance 64B packets:
> Benchmark XDP_DRV with zerocopy
> rxdrop 14.7
> txpush 14.6
I see similar performance numbers, but my system can crash with 'txonly'.
See full crash log and my analysis, below.
> l2fwd 11.1
Got l2fwd 13.2 Mpps.
>
> AF_XDP performance 1500B packets:
> Benchmark XDP_DRV with zerocopy
> rxdrop 0.8
> l2fwd 0.8
>
> XDP performance on our system as a base line.
>
> 64B packets:
> XDP stats CPU Mpps issue-pps
> XDP-RX CPU 16 14.7 0
>
> 1500B packets:
> XDP stats CPU Mpps issue-pps
> XDP-RX CPU 16 0.8 0
>
> The structure of the patch set is as follows:
>
> Patch 1: Introduce Rx/Tx ring enable/disable functionality
> Patch 2: Preparatory patche to ixgbe driver code for RX
> Patch 3: ixgbe zero-copy support for RX
> Patch 4: Preparatory patch to ixgbe driver code for TX
> Patch 5: ixgbe zero-copy support for TX
>
> Changes since v1:
>
> * Removed redundant AF_XDP precondition checks, pointed out by
> Jakub. Now, the preconditions are only checked at XDP enable time.
> * Fixed a crash in the egress path, due to incorrect usage of
> ixgbe_ring queue_index member. In v2 a ring_idx back reference is
> introduced, and used in favor of queue_index. William reported the
> crash, and helped me smoke out the issue. Kudos!
> * In ixgbe_xsk_async_xmit, validate qid against num_xdp_queues,
> instead of num_rx_queues.
>
> Cheers!
> Bj?rn
>
> Bj?rn T?pel (5):
> ixgbe: added Rx/Tx ring disable/enable functions
> ixgbe: move common Rx functions to ixgbe_txrx_common.h
> ixgbe: add AF_XDP zero-copy Rx support
> ixgbe: move common Tx functions to ixgbe_txrx_common.h
> ixgbe: add AF_XDP zero-copy Tx support
>
> drivers/net/ethernet/intel/ixgbe/Makefile | 3 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe.h | 28 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 17 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 291 ++++++-
> .../ethernet/intel/ixgbe/ixgbe_txrx_common.h | 50 ++
> drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 803 ++++++++++++++++++
> 6 files changed, 1146 insertions(+), 46 deletions(-)
> create mode 100644 drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
> create mode 100644 drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
sock0 at ixgbe2:0 rxdrop
pps pkts 1.00
rx 14,572,284 36,093,496
tx 0 0
sock0 at ixgbe2:0 l2fwd
pps pkts 1.00
rx 13,287,830 108,616,192
tx 13,287,830 108,616,284
Notice, the crash only happens some times (on the second invocation):
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
samples/bpf/xdpsock_user.c:kick_tx:749: Assertion failed: 0: errno: 100/"Network is down"
sock0 at ixgbe2:0 txonly
pps pkts 0.05
rx 0 0
tx 33,763 1,709
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
sock0 at ixgbe2:0 txonly
pps pkts 1.00
rx 0 0
tx 14,730,354 14,733,404
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
samples/bpf/xdpsock_user.c:kick_tx:749: Assertion failed: 0: errno: 100/"Network is down"
sock0 at ixgbe2:0 txonly
pps pkts 0.26
rx 0 0
tx 2,054,927 524,680
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
[ 249.953547] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 250.204158] ixgbe 0000:01:00.1 ixgbe2: NIC Link is Up 10 Gbps, Flow Control: None
[ 257.217496] ixgbe 0000:01:00.1: removed PHC on ixgbe2
[ 257.279328] ixgbe 0000:01:00.1: Multiqueue Disabled: Rx Queue count = 1, Tx Queue count = 1 XDP Queue count = 6
[ 257.308463] ixgbe 0000:01:00.1: registered PHC device on ixgbe2
[ 257.489166] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 257.494923] ixgbe 0000:01:00.1 ixgbe2: initiating reset to clear Tx work after link loss
[ 257.716190] ixgbe 0000:01:00.1 ixgbe2: Reset adapter
[ 257.968552] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 258.185273] ixgbe 0000:01:00.1 ixgbe2: NIC Link is Up 10 Gbps, Flow Control: None
[ 260.836196] BUG: unable to handle kernel NULL pointer dereference at 0000000000000040
[ 260.844652] PGD 0 P4D 0
[ 260.847527] Oops: 0002 [#1] PREEMPT SMP PTI
[ 260.852042] CPU: 1 PID: 18 Comm: ksoftirqd/1 Not tainted 4.19.0-rc5-bpf-next-xdp-ixgbe-ZC+ #66
[ 260.861269] Hardware name: Supermicro Super Server/X10SRi-F, BIOS 2.0a 08/01/2016
[ 260.869381] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 260.874682] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 260.894317] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 260.899873] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 260.907339] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 260.914801] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 260.922263] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 260.929726] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 260.937189] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 260.945871] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 260.951943] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 260.959409] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 260.966872] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 260.974333] Call Trace:
[ 260.977115] ? ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 260.982843] ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 260.988426] ixgbe_poll+0x5a/0x700 [ixgbe]
[ 260.992850] net_rx_action+0x141/0x3f0
[ 260.996931] ? sort_range+0x20/0x20
[ 261.000743] __do_softirq+0xe3/0x2f7
[ 261.004656] ? sort_range+0x20/0x20
[ 261.008490] run_ksoftirqd+0x26/0x30
[ 261.012420] smpboot_thread_fn+0x114/0x1d0
[ 261.016848] kthread+0x111/0x130
[ 261.020423] ? kthread_create_worker_on_cpu+0x50/0x50
[ 261.025802] ret_from_fork+0x1f/0x30
[ 261.029707] Modules linked in: ip6table_filter ip6_tables iptable_filter ip_tables x_tables tun nfnetlink bridge nf_defrag_ipv6 nf_defrag_ipv4 bpfilter sunrpc coretemp intel_cstate intel_uncore intel_rapl_perf pcspkr i2c_i801 wmi ipmi_si ipmi_devintf ipmi_msghandler acpi_pad pcc_cpufreq sch_fq_codel ixgbe mdio mlx5_core i40e igb nfp ptp i2c_algo_bit devlink i2c_core pps_core hid_generic [last unloaded: x_tables]
[ 261.067878] CR2: 0000000000000040
[ 261.071526] ---[ end trace f0011e17c3744ee4 ]---
[ 261.077903] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 261.083191] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 261.102852] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 261.108423] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 261.115889] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 261.123382] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 261.130847] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 261.138325] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 261.145788] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 261.154503] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 261.160594] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 261.168070] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 261.175547] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 261.183012] Kernel panic - not syncing: Fatal exception in interrupt
[ 261.189743] Kernel Offset: disabled
[ 261.194954] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
[ 261.203123] ------------[ cut here ]------------
[ 261.208071] sched: Unexpected reschedule of offline CPU#0!
[ 261.213885] WARNING: CPU: 1 PID: 18 at arch/x86/kernel/smp.c:128 native_smp_send_reschedule+0x31/0x40
[ 261.223698] Modules linked in: ip6table_filter ip6_tables iptable_filter ip_tables x_tables tun nfnetlink bridge nf_defrag_ipv6 nf_defrag_ipv4 bpfilter sunrpc coretemp intel_cstate intel_uncore intel_rapl_perf pcspkr i2c_i801 wmi ipmi_si ipmi_devintf ipmi_msghandler acpi_pad pcc_cpufreq sch_fq_codel ixgbe mdio mlx5_core i40e igb nfp ptp i2c_algo_bit devlink i2c_core pps_core hid_generic [last unloaded: x_tables]
[ 261.261869] CPU: 1 PID: 18 Comm: ksoftirqd/1 Tainted: G D 4.19.0-rc5-bpf-next-xdp-ixgbe-ZC+ #66
[ 261.272468] Hardware name: Supermicro Super Server/X10SRi-F, BIOS 2.0a 08/01/2016
[ 261.280549] RIP: 0010:native_smp_send_reschedule+0x31/0x40
[ 261.286361] Code: 48 0f a3 05 91 c7 3d 01 73 12 48 8b 05 e8 11 0c 01 be fd 00 00 00 48 8b 40 30 ff e0 89 fe 48 c7 c7 b8 36 09 82 e8 ff 7d 02 00 <0f> 0b c3 66 90 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 53 48
[ 261.306001] RSP: 0018:ffff88085c643cc0 EFLAGS: 00010082
[ 261.311553] RAX: 000000000000002e RBX: ffff88085c6213c0 RCX: 0000000000000006
[ 261.319023] RDX: 0000000000000007 RSI: 0000000000000092 RDI: ffff88085c6555e0
[ 261.326483] RBP: ffff88085306a0d4 R08: 0000000000000000 R09: 0000000000000478
[ 261.333943] R10: ffff88085c643bf8 R11: ffffffff82acfbad R12: ffff880853069640
[ 261.341407] R13: ffff88085c643d10 R14: 0000000000000086 R15: 00000000000213c0
[ 261.348869] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 261.357555] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 261.363624] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 261.371090] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 261.378554] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 261.386014] Call Trace:
[ 261.388788] <IRQ>
[ 261.391128] check_preempt_curr+0x6f/0x80
[ 261.395466] ttwu_do_wakeup+0x19/0x150
[ 261.399548] try_to_wake_up+0x19c/0x450
[ 261.403715] ? enqueue_entity+0xad/0x2c0
[ 261.407964] __wake_up_common+0x71/0x170
[ 261.412220] ep_poll_callback+0xb5/0x2a0
[ 261.416474] __wake_up_common+0x71/0x170
[ 261.420729] __wake_up_common_lock+0x6c/0x90
[ 261.425335] ? tick_sched_do_timer+0x60/0x60
[ 261.429935] irq_work_run_list+0x47/0x70
[ 261.434190] update_process_times+0x3b/0x50
[ 261.438705] tick_sched_handle+0x21/0x70
[ 261.442959] ? tick_sched_do_timer+0x50/0x60
[ 261.447554] tick_sched_timer+0x37/0x70
[ 261.451719] __hrtimer_run_queues+0xf8/0x2a0
[ 261.456317] hrtimer_interrupt+0xe5/0x240
[ 261.460657] ? sched_clock+0x5/0x10
[ 261.464478] smp_apic_timer_interrupt+0x5e/0x140
[ 261.469420] apic_timer_interrupt+0xf/0x20
[ 261.473847] </IRQ>
[ 261.476271] RIP: 0010:panic+0x1e3/0x232
[ 261.480433] Code: eb ac 83 3d 30 07 a0 01 00 74 05 e8 39 36 02 00 48 c7 c6 a0 8b ac 82 48 c7 c7 10 af 09 82 e8 84 6a 05 00 fb 66 0f 1f 44 00 00 <31> db e8 f8 22 0b 00 4c 39 eb 7c 17 41 83 f4 01 44 89 e7 ff 15 d6
[ 261.500066] RSP: 0018:ffffc9000323baf8 EFLAGS: 00000292 ORIG_RAX: ffffffffffffff13
[ 261.508234] RAX: 0000000000000046 RBX: 0000000000000000 RCX: 0000000000000006
[ 261.515696] RDX: 0000000000000007 RSI: 0000000000000082 RDI: ffff88085c6555e0
[ 261.523160] RBP: ffffc9000323bb68 R08: 0000000000000000 R09: 0000000000000476
[ 261.530620] R10: 0000000000000008 R11: ffffffff82acfbad R12: 0000000000000000
[ 261.538084] R13: 0000000000000000 R14: 0000000000000009 R15: 0000000000000001
[ 261.545546] ? panic+0x1dc/0x232
[ 261.549101] oops_end+0xb9/0xd0
[ 261.552569] no_context+0x156/0x3a0
[ 261.556392] ? cpumask_next_and+0x1a/0x20
[ 261.560730] ? find_busiest_group+0x112/0xa80
[ 261.565413] __do_page_fault+0xd5/0x500
[ 261.569579] page_fault+0x1e/0x30
[ 261.573220] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 261.578508] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 261.598148] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 261.603703] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 261.611169] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 261.618631] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 261.626094] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 261.633557] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 261.641021] ? ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 261.646755] ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 261.652308] ixgbe_poll+0x5a/0x700 [ixgbe]
[ 261.656735] net_rx_action+0x141/0x3f0
[ 261.660814] ? sort_range+0x20/0x20
[ 261.664627] __do_softirq+0xe3/0x2f7
[ 261.668530] ? sort_range+0x20/0x20
[ 261.672351] run_ksoftirqd+0x26/0x30
[ 261.676250] smpboot_thread_fn+0x114/0x1d0
[ 261.680671] kthread+0x111/0x130
[ 261.684223] ? kthread_create_worker_on_cpu+0x50/0x50
[ 261.689603] ret_from_fork+0x1f/0x30
[ 261.701291] ---[ end trace f0011e17c3744ee5 ]---
(gdb) list *(xsk_umem_consume_tx)+0xc9
0xffffffff81883fe9 is in xsk_umem_consume_tx (./include/linux/compiler.h:214).
209 static __always_inline void __write_once_size(volatile void *p, void *res, int size)
210 {
211 switch (size) {
212 case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
213 case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
214 case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
215 case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
216 default:
217 barrier();
218 __builtin_memcpy((void *)p, (const void *)res, size);
I think the bug occurs in the WRITE_ONCE in xskq_peek_desc() and
it correspond to q->ring == NULL (as ring have offset 40)
static inline struct xdp_desc *xskq_peek_desc(struct xsk_queue *q,
struct xdp_desc *desc)
{
if (q->cons_tail == q->cons_head) {
WRITE_ONCE(q->ring->consumer, q->cons_tail);
q->cons_head = q->cons_tail + xskq_nb_avail(q, RX_BATCH_SIZE);
/* Order consumer and data */
smp_rmb();
}
return xskq_validate_desc(q, desc);
}
$ pahole -C xsk_queue vmlinux
struct xsk_queue {
u64 chunk_mask; /* 0 8 */
u64 size; /* 8 8 */
u32 ring_mask; /* 16 4 */
u32 nentries; /* 20 4 */
u32 prod_head; /* 24 4 */
u32 prod_tail; /* 28 4 */
u32 cons_head; /* 32 4 */
u32 cons_tail; /* 36 4 */
struct xdp_ring * ring; /* 40 8 */
u64 invalid_descs; /* 48 8 */
/* size: 56, cachelines: 1, members: 10 */
/* last cacheline: 56 bytes */
};
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer
WARNING: multiple messages have this Message-ID (diff)
From: Jesper Dangaard Brouer <brouer@redhat.com>
To: "Björn Töpel" <bjorn.topel@gmail.com>
Cc: jeffrey.t.kirsher@intel.com, intel-wired-lan@lists.osuosl.org,
"Björn Töpel" <bjorn.topel@intel.com>,
magnus.karlsson@intel.com, magnus.karlsson@gmail.com,
ast@kernel.org, daniel@iogearbox.net, netdev@vger.kernel.org,
u9012063@gmail.com, tuc@vmware.com, jakub.kicinski@netronome.com,
brouer@redhat.com
Subject: Re: [PATCH v2 0/5] Introducing ixgbe AF_XDP ZC support
Date: Thu, 4 Oct 2018 23:18:48 +0200 [thread overview]
Message-ID: <20181004231848.33efd81f@redhat.com> (raw)
In-Reply-To: <20181002080034.11754-1-bjorn.topel@gmail.com>
On Tue, 2 Oct 2018 10:00:29 +0200
Björn Töpel <bjorn.topel@gmail.com> wrote:
> From: Björn Töpel <bjorn.topel@intel.com>
>
> Jeff: Please remove the v1 patches from your dev-queue!
>
> This patch set introduces zero-copy AF_XDP support for Intel's ixgbe
> driver.
>
> The ixgbe zero-copy code is located in its own file ixgbe_xsk.[ch],
> analogous to the i40e ZC support. Again, as in i40e, code paths have
> been copied from the XDP path to the zero-copy path. Going forward we
> will try to generalize more code between the AF_XDP ZC drivers, and
> also reduce the heavy C&P.
>
> We have run some benchmarks on a dual socket system with two Broadwell
> E5 2660 @ 2.0 GHz with hyperthreading turned off. Each socket has 14
> cores which gives a total of 28, but only two cores are used in these
> experiments. One for TR/RX and one for the user space application. The
> memory is DDR4 @ 2133 MT/s (1067 MHz) and the size of each DIMM is
> 8192MB and with 8 of those DIMMs in the system we have 64 GB of total
> memory. The compiler used is GCC 7.3.0. The NIC is Intel
> 82599ES/X520-2 10Gbit/s using the ixgbe driver.
>
> Below are the results in Mpps of the 82599ES/X520-2 NIC benchmark runs
> for 64B and 1500B packets, generated by a commercial packet generator
> HW blasting packets at full 10Gbit/s line rate. The results are with
> retpoline and all other spectre and meltdown fixes.
>
> AF_XDP performance 64B packets:
> Benchmark XDP_DRV with zerocopy
> rxdrop 14.7
> txpush 14.6
I see similar performance numbers, but my system can crash with 'txonly'.
See full crash log and my analysis, below.
> l2fwd 11.1
Got l2fwd 13.2 Mpps.
>
> AF_XDP performance 1500B packets:
> Benchmark XDP_DRV with zerocopy
> rxdrop 0.8
> l2fwd 0.8
>
> XDP performance on our system as a base line.
>
> 64B packets:
> XDP stats CPU Mpps issue-pps
> XDP-RX CPU 16 14.7 0
>
> 1500B packets:
> XDP stats CPU Mpps issue-pps
> XDP-RX CPU 16 0.8 0
>
> The structure of the patch set is as follows:
>
> Patch 1: Introduce Rx/Tx ring enable/disable functionality
> Patch 2: Preparatory patche to ixgbe driver code for RX
> Patch 3: ixgbe zero-copy support for RX
> Patch 4: Preparatory patch to ixgbe driver code for TX
> Patch 5: ixgbe zero-copy support for TX
>
> Changes since v1:
>
> * Removed redundant AF_XDP precondition checks, pointed out by
> Jakub. Now, the preconditions are only checked at XDP enable time.
> * Fixed a crash in the egress path, due to incorrect usage of
> ixgbe_ring queue_index member. In v2 a ring_idx back reference is
> introduced, and used in favor of queue_index. William reported the
> crash, and helped me smoke out the issue. Kudos!
> * In ixgbe_xsk_async_xmit, validate qid against num_xdp_queues,
> instead of num_rx_queues.
>
> Cheers!
> Björn
>
> Björn Töpel (5):
> ixgbe: added Rx/Tx ring disable/enable functions
> ixgbe: move common Rx functions to ixgbe_txrx_common.h
> ixgbe: add AF_XDP zero-copy Rx support
> ixgbe: move common Tx functions to ixgbe_txrx_common.h
> ixgbe: add AF_XDP zero-copy Tx support
>
> drivers/net/ethernet/intel/ixgbe/Makefile | 3 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe.h | 28 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 17 +-
> drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 291 ++++++-
> .../ethernet/intel/ixgbe/ixgbe_txrx_common.h | 50 ++
> drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 803 ++++++++++++++++++
> 6 files changed, 1146 insertions(+), 46 deletions(-)
> create mode 100644 drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
> create mode 100644 drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
sock0@ixgbe2:0 rxdrop
pps pkts 1.00
rx 14,572,284 36,093,496
tx 0 0
sock0@ixgbe2:0 l2fwd
pps pkts 1.00
rx 13,287,830 108,616,192
tx 13,287,830 108,616,284
Notice, the crash only happens some times (on the second invocation):
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
samples/bpf/xdpsock_user.c:kick_tx:749: Assertion failed: 0: errno: 100/"Network is down"
sock0@ixgbe2:0 txonly
pps pkts 0.05
rx 0 0
tx 33,763 1,709
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
sock0@ixgbe2:0 txonly
pps pkts 1.00
rx 0 0
tx 14,730,354 14,733,404
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
samples/bpf/xdpsock_user.c:kick_tx:749: Assertion failed: 0: errno: 100/"Network is down"
sock0@ixgbe2:0 txonly
pps pkts 0.26
rx 0 0
tx 2,054,927 524,680
$ sudo ./xdpsock --interface ixgbe2 --txonly --zero
[ 249.953547] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 250.204158] ixgbe 0000:01:00.1 ixgbe2: NIC Link is Up 10 Gbps, Flow Control: None
[ 257.217496] ixgbe 0000:01:00.1: removed PHC on ixgbe2
[ 257.279328] ixgbe 0000:01:00.1: Multiqueue Disabled: Rx Queue count = 1, Tx Queue count = 1 XDP Queue count = 6
[ 257.308463] ixgbe 0000:01:00.1: registered PHC device on ixgbe2
[ 257.489166] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 257.494923] ixgbe 0000:01:00.1 ixgbe2: initiating reset to clear Tx work after link loss
[ 257.716190] ixgbe 0000:01:00.1 ixgbe2: Reset adapter
[ 257.968552] ixgbe 0000:01:00.1 ixgbe2: detected SFP+: 4
[ 258.185273] ixgbe 0000:01:00.1 ixgbe2: NIC Link is Up 10 Gbps, Flow Control: None
[ 260.836196] BUG: unable to handle kernel NULL pointer dereference at 0000000000000040
[ 260.844652] PGD 0 P4D 0
[ 260.847527] Oops: 0002 [#1] PREEMPT SMP PTI
[ 260.852042] CPU: 1 PID: 18 Comm: ksoftirqd/1 Not tainted 4.19.0-rc5-bpf-next-xdp-ixgbe-ZC+ #66
[ 260.861269] Hardware name: Supermicro Super Server/X10SRi-F, BIOS 2.0a 08/01/2016
[ 260.869381] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 260.874682] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 260.894317] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 260.899873] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 260.907339] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 260.914801] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 260.922263] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 260.929726] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 260.937189] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 260.945871] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 260.951943] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 260.959409] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 260.966872] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 260.974333] Call Trace:
[ 260.977115] ? ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 260.982843] ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 260.988426] ixgbe_poll+0x5a/0x700 [ixgbe]
[ 260.992850] net_rx_action+0x141/0x3f0
[ 260.996931] ? sort_range+0x20/0x20
[ 261.000743] __do_softirq+0xe3/0x2f7
[ 261.004656] ? sort_range+0x20/0x20
[ 261.008490] run_ksoftirqd+0x26/0x30
[ 261.012420] smpboot_thread_fn+0x114/0x1d0
[ 261.016848] kthread+0x111/0x130
[ 261.020423] ? kthread_create_worker_on_cpu+0x50/0x50
[ 261.025802] ret_from_fork+0x1f/0x30
[ 261.029707] Modules linked in: ip6table_filter ip6_tables iptable_filter ip_tables x_tables tun nfnetlink bridge nf_defrag_ipv6 nf_defrag_ipv4 bpfilter sunrpc coretemp intel_cstate intel_uncore intel_rapl_perf pcspkr i2c_i801 wmi ipmi_si ipmi_devintf ipmi_msghandler acpi_pad pcc_cpufreq sch_fq_codel ixgbe mdio mlx5_core i40e igb nfp ptp i2c_algo_bit devlink i2c_core pps_core hid_generic [last unloaded: x_tables]
[ 261.067878] CR2: 0000000000000040
[ 261.071526] ---[ end trace f0011e17c3744ee4 ]---
[ 261.077903] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 261.083191] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 261.102852] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 261.108423] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 261.115889] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 261.123382] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 261.130847] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 261.138325] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 261.145788] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 261.154503] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 261.160594] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 261.168070] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 261.175547] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 261.183012] Kernel panic - not syncing: Fatal exception in interrupt
[ 261.189743] Kernel Offset: disabled
[ 261.194954] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
[ 261.203123] ------------[ cut here ]------------
[ 261.208071] sched: Unexpected reschedule of offline CPU#0!
[ 261.213885] WARNING: CPU: 1 PID: 18 at arch/x86/kernel/smp.c:128 native_smp_send_reschedule+0x31/0x40
[ 261.223698] Modules linked in: ip6table_filter ip6_tables iptable_filter ip_tables x_tables tun nfnetlink bridge nf_defrag_ipv6 nf_defrag_ipv4 bpfilter sunrpc coretemp intel_cstate intel_uncore intel_rapl_perf pcspkr i2c_i801 wmi ipmi_si ipmi_devintf ipmi_msghandler acpi_pad pcc_cpufreq sch_fq_codel ixgbe mdio mlx5_core i40e igb nfp ptp i2c_algo_bit devlink i2c_core pps_core hid_generic [last unloaded: x_tables]
[ 261.261869] CPU: 1 PID: 18 Comm: ksoftirqd/1 Tainted: G D 4.19.0-rc5-bpf-next-xdp-ixgbe-ZC+ #66
[ 261.272468] Hardware name: Supermicro Super Server/X10SRi-F, BIOS 2.0a 08/01/2016
[ 261.280549] RIP: 0010:native_smp_send_reschedule+0x31/0x40
[ 261.286361] Code: 48 0f a3 05 91 c7 3d 01 73 12 48 8b 05 e8 11 0c 01 be fd 00 00 00 48 8b 40 30 ff e0 89 fe 48 c7 c7 b8 36 09 82 e8 ff 7d 02 00 <0f> 0b c3 66 90 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 53 48
[ 261.306001] RSP: 0018:ffff88085c643cc0 EFLAGS: 00010082
[ 261.311553] RAX: 000000000000002e RBX: ffff88085c6213c0 RCX: 0000000000000006
[ 261.319023] RDX: 0000000000000007 RSI: 0000000000000092 RDI: ffff88085c6555e0
[ 261.326483] RBP: ffff88085306a0d4 R08: 0000000000000000 R09: 0000000000000478
[ 261.333943] R10: ffff88085c643bf8 R11: ffffffff82acfbad R12: ffff880853069640
[ 261.341407] R13: ffff88085c643d10 R14: 0000000000000086 R15: 00000000000213c0
[ 261.348869] FS: 0000000000000000(0000) GS:ffff88085c640000(0000) knlGS:0000000000000000
[ 261.357555] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 261.363624] CR2: 0000000000000040 CR3: 000000087f20a006 CR4: 00000000003606e0
[ 261.371090] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 261.378554] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 261.386014] Call Trace:
[ 261.388788] <IRQ>
[ 261.391128] check_preempt_curr+0x6f/0x80
[ 261.395466] ttwu_do_wakeup+0x19/0x150
[ 261.399548] try_to_wake_up+0x19c/0x450
[ 261.403715] ? enqueue_entity+0xad/0x2c0
[ 261.407964] __wake_up_common+0x71/0x170
[ 261.412220] ep_poll_callback+0xb5/0x2a0
[ 261.416474] __wake_up_common+0x71/0x170
[ 261.420729] __wake_up_common_lock+0x6c/0x90
[ 261.425335] ? tick_sched_do_timer+0x60/0x60
[ 261.429935] irq_work_run_list+0x47/0x70
[ 261.434190] update_process_times+0x3b/0x50
[ 261.438705] tick_sched_handle+0x21/0x70
[ 261.442959] ? tick_sched_do_timer+0x50/0x60
[ 261.447554] tick_sched_timer+0x37/0x70
[ 261.451719] __hrtimer_run_queues+0xf8/0x2a0
[ 261.456317] hrtimer_interrupt+0xe5/0x240
[ 261.460657] ? sched_clock+0x5/0x10
[ 261.464478] smp_apic_timer_interrupt+0x5e/0x140
[ 261.469420] apic_timer_interrupt+0xf/0x20
[ 261.473847] </IRQ>
[ 261.476271] RIP: 0010:panic+0x1e3/0x232
[ 261.480433] Code: eb ac 83 3d 30 07 a0 01 00 74 05 e8 39 36 02 00 48 c7 c6 a0 8b ac 82 48 c7 c7 10 af 09 82 e8 84 6a 05 00 fb 66 0f 1f 44 00 00 <31> db e8 f8 22 0b 00 4c 39 eb 7c 17 41 83 f4 01 44 89 e7 ff 15 d6
[ 261.500066] RSP: 0018:ffffc9000323baf8 EFLAGS: 00000292 ORIG_RAX: ffffffffffffff13
[ 261.508234] RAX: 0000000000000046 RBX: 0000000000000000 RCX: 0000000000000006
[ 261.515696] RDX: 0000000000000007 RSI: 0000000000000082 RDI: ffff88085c6555e0
[ 261.523160] RBP: ffffc9000323bb68 R08: 0000000000000000 R09: 0000000000000476
[ 261.530620] R10: 0000000000000008 R11: ffffffff82acfbad R12: 0000000000000000
[ 261.538084] R13: 0000000000000000 R14: 0000000000000009 R15: 0000000000000001
[ 261.545546] ? panic+0x1dc/0x232
[ 261.549101] oops_end+0xb9/0xd0
[ 261.552569] no_context+0x156/0x3a0
[ 261.556392] ? cpumask_next_and+0x1a/0x20
[ 261.560730] ? find_busiest_group+0x112/0xa80
[ 261.565413] __do_page_fault+0xd5/0x500
[ 261.569579] page_fault+0x1e/0x30
[ 261.573220] RIP: 0010:xsk_umem_consume_tx+0xc9/0x180
[ 261.578508] Code: 24 75 be 48 8b 86 08 03 00 00 48 8d b0 f8 fc ff ff 48 39 c7 75 96 e8 26 bd 8a ff 5b 31 c0 41 5a 41 5c 41 5d 5d 49 8d 62 f8 c3 <89> 41 40 8b 4a 24 8b 42 1c 29 c8 75 0b 48 8b 42 28 8b 00 89 42 1c
[ 261.598148] RSP: 0018:ffffc9000323bd00 EFLAGS: 00010246
[ 261.603703] RAX: 0000000000000000 RBX: ffffc9000323bd68 RCX: 0000000000000000
[ 261.611169] RDX: ffff8808553e1c00 RSI: ffff880826e43000 RDI: ffff880854940818
[ 261.618631] RBP: ffffc9000323bd20 R08: 0000000000000010 R09: 0000000000000000
[ 261.626094] R10: ffffc9000323bd40 R11: 0000000000000000 R12: ffffc9000323bd64
[ 261.633557] R13: ffff880854940780 R14: 0000000000000000 R15: 0000000000000000
[ 261.641021] ? ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 261.646755] ixgbe_clean_xdp_tx_irq+0x19d/0x2e0 [ixgbe]
[ 261.652308] ixgbe_poll+0x5a/0x700 [ixgbe]
[ 261.656735] net_rx_action+0x141/0x3f0
[ 261.660814] ? sort_range+0x20/0x20
[ 261.664627] __do_softirq+0xe3/0x2f7
[ 261.668530] ? sort_range+0x20/0x20
[ 261.672351] run_ksoftirqd+0x26/0x30
[ 261.676250] smpboot_thread_fn+0x114/0x1d0
[ 261.680671] kthread+0x111/0x130
[ 261.684223] ? kthread_create_worker_on_cpu+0x50/0x50
[ 261.689603] ret_from_fork+0x1f/0x30
[ 261.701291] ---[ end trace f0011e17c3744ee5 ]---
(gdb) list *(xsk_umem_consume_tx)+0xc9
0xffffffff81883fe9 is in xsk_umem_consume_tx (./include/linux/compiler.h:214).
209 static __always_inline void __write_once_size(volatile void *p, void *res, int size)
210 {
211 switch (size) {
212 case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
213 case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
214 case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
215 case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
216 default:
217 barrier();
218 __builtin_memcpy((void *)p, (const void *)res, size);
I think the bug occurs in the WRITE_ONCE in xskq_peek_desc() and
it correspond to q->ring == NULL (as ring have offset 40)
static inline struct xdp_desc *xskq_peek_desc(struct xsk_queue *q,
struct xdp_desc *desc)
{
if (q->cons_tail == q->cons_head) {
WRITE_ONCE(q->ring->consumer, q->cons_tail);
q->cons_head = q->cons_tail + xskq_nb_avail(q, RX_BATCH_SIZE);
/* Order consumer and data */
smp_rmb();
}
return xskq_validate_desc(q, desc);
}
$ pahole -C xsk_queue vmlinux
struct xsk_queue {
u64 chunk_mask; /* 0 8 */
u64 size; /* 8 8 */
u32 ring_mask; /* 16 4 */
u32 nentries; /* 20 4 */
u32 prod_head; /* 24 4 */
u32 prod_tail; /* 28 4 */
u32 cons_head; /* 32 4 */
u32 cons_tail; /* 36 4 */
struct xdp_ring * ring; /* 40 8 */
u64 invalid_descs; /* 48 8 */
/* size: 56, cachelines: 1, members: 10 */
/* last cacheline: 56 bytes */
};
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer
next prev parent reply other threads:[~2018-10-04 21:18 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-02 8:00 [Intel-wired-lan] [PATCH v2 0/5] Introducing ixgbe AF_XDP ZC support =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 8:00 ` [Intel-wired-lan] [PATCH v2 1/5] ixgbe: added Rx/Tx ring disable/enable functions =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 18:25 ` [Intel-wired-lan] " William Tu
2018-10-02 18:25 ` William Tu
2018-10-02 8:00 ` [Intel-wired-lan] [PATCH v2 2/5] ixgbe: move common Rx functions to ixgbe_txrx_common.h =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 18:27 ` [Intel-wired-lan] " William Tu
2018-10-02 18:27 ` William Tu
2018-10-02 8:00 ` [Intel-wired-lan] [PATCH v2 3/5] ixgbe: add AF_XDP zero-copy Rx support =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 18:26 ` [Intel-wired-lan] " William Tu
2018-10-02 18:26 ` William Tu
2018-10-02 8:00 ` [Intel-wired-lan] [PATCH v2 4/5] ixgbe: move common Tx functions to ixgbe_txrx_common.h =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 18:28 ` [Intel-wired-lan] " William Tu
2018-10-02 18:28 ` William Tu
2018-10-02 8:00 ` [Intel-wired-lan] [PATCH v2 5/5] ixgbe: add AF_XDP zero-copy Tx support =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 8:00 ` Björn Töpel
2018-10-02 18:26 ` [Intel-wired-lan] " William Tu
2018-10-02 18:26 ` William Tu
2018-10-02 18:23 ` [Intel-wired-lan] [PATCH v2 0/5] Introducing ixgbe AF_XDP ZC support William Tu
2018-10-02 18:23 ` William Tu
2018-10-02 18:39 ` [Intel-wired-lan] " =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-02 18:39 ` Björn Töpel
2018-10-02 18:43 ` [Intel-wired-lan] " William Tu
2018-10-02 18:43 ` William Tu
2018-10-04 21:18 ` Jesper Dangaard Brouer [this message]
2018-10-04 21:18 ` Jesper Dangaard Brouer
2018-10-05 4:59 ` [Intel-wired-lan] " =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-05 4:59 ` Björn Töpel
2018-10-05 11:30 ` [Intel-wired-lan] " =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?=
2018-10-05 11:30 ` Björn Töpel
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=20181004231848.33efd81f@redhat.com \
--to=brouer@redhat.com \
--cc=intel-wired-lan@osuosl.org \
/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.