All of lore.kernel.org
 help / color / mirror / Atom feed
* i40e: Kernel freezes with XDP_ZEROCOPY
@ 2019-08-07 20:48 Kal Cutter Conley
  2019-10-17  8:53 ` Kal Cutter Conley
  0 siblings, 1 reply; 7+ messages in thread
From: Kal Cutter Conley @ 2019-08-07 20:48 UTC (permalink / raw)
  To: xdp-newbies

Hello,
I am trying to get AF_XDP working with the i40e driver (Ethernet
Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
kernel (machine) freezes hard. I have reproduced this on varying
kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
also, but at a later stage. I tried replacing my XDP program with a
trivial one that simply returns XDP_PASS but it didn't help. On the
same system, the xdpsock sample does appear to work with the -z flag,
however. Are there any current known issues that could be causing
this? I will try to extract a minimal example that exercises the
freeze.

Thanks,
Kal

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-08-07 20:48 i40e: Kernel freezes with XDP_ZEROCOPY Kal Cutter Conley
@ 2019-10-17  8:53 ` Kal Cutter Conley
  2019-10-17 22:56   ` Ilya Goslhtein
  2019-10-18 11:23   ` Magnus Karlsson
  0 siblings, 2 replies; 7+ messages in thread
From: Kal Cutter Conley @ 2019-10-17  8:53 UTC (permalink / raw)
  To: xdp-newbies

[-- Attachment #1: Type: text/plain, Size: 1222 bytes --]

Hello,
I have managed to extract a reproducer that crashes the kernel. We
observe the crash with all drivers that support XDP zerocopy (i40e,
ixgbe, mlx5_core). The program source is attached (C++). Compile with
a newer clang++ or g++ using flag -std=c++17. It must also be linked
with libbpf. Use libbpf v0.0.5 and make sure to revert
5771dacd3dc2fdd041c51242819a9f212e04af55.

The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.

Hopefully this is useful,
Kal

On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
<kal.conley@dectris.com> wrote:
>
> Hello,
> I am trying to get AF_XDP working with the i40e driver (Ethernet
> Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
> kernel (machine) freezes hard. I have reproduced this on varying
> kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
> also, but at a later stage. I tried replacing my XDP program with a
> trivial one that simply returns XDP_PASS but it didn't help. On the
> same system, the xdpsock sample does appear to work with the -z flag,
> however. Are there any current known issues that could be causing
> this? I will try to extract a minimal example that exercises the
> freeze.
>
> Thanks,
> Kal

[-- Attachment #2: xdp_bomb.cc --]
[-- Type: text/x-c-code, Size: 9328 bytes --]

#include <linux/if_link.h>
#include <net/if.h>
#include <numaif.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <algorithm>
#include <cstdlib>
#include <future>
#include <iostream>
#include <limits>
#include <type_traits>

#include "libbpf/include/uapi/linux/if_xdp.h"
#include "libbpf/src/bpf.h"
#include "libbpf/src/libbpf.h"
#include "libbpf/src/xsk.h"

#if !defined(AF_XDP)
#define AF_XDP 44
#endif

#if !defined(SOL_XDP)
#define SOL_XDP 283
#endif

constexpr size_t KERNEL_MAX_FRAMES = 256 * 1024;
constexpr size_t KERNEL_RX_BATCH_SIZE = 16;
constexpr size_t UMEM_HEADROOM = 16;
constexpr size_t UMEM_SIZE = 500'000'000;

static const char* XDP_PROGRAM_PATH = "xdp_bpf.o";

struct XskConsumerRing : public xsk_ring_cons {
    void* mapping;
};

struct XskProducerRing : public xsk_ring_prod {
    void* mapping;
};

void ErrorExit(const char* text) {
    std::cerr << text << ": errno: " << errno << "\n";
    exit(1);
}

size_t ceil2(size_t x) noexcept {
    constexpr auto N = std::numeric_limits<size_t>::digits;
    x--;
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> (N > 8 ? 8 : 0));
    x |= (x >> (N > 16 ? 16 : 0));
    x |= (x >> (N > 32 ? 32 : 0));
    x |= (x >> (N > 64 ? 64 : 0));
    return x + 1;
}

template <typename T>
constexpr std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>, T>
CeilDivide(T value, T divisor) {
    const T divided = value / divisor;
    return divided + (value % divisor != 0);
}

constexpr auto AlignSize(std::size_t size, std::size_t align) {
    return CeilDivide(size, align) * align;
}

template <typename RingType, typename DescType>
RingType InitializeRing(size_t ring_size,
                        const xdp_ring_offset& offsets,
                        int xdp_fd,
                        off_t xdp_pgoff) {
    void* mapping = mmap(0, offsets.desc + ring_size * sizeof(DescType),
                         PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE,
                         xdp_fd, xdp_pgoff);
    if (mapping == MAP_FAILED) {
        ErrorExit("mmap");
    }

    char* addr = static_cast<char*>(mapping);

    RingType ring;
    ring.cached_prod = 0;
    ring.cached_cons = 0;
    ring.mask = ring_size - 1;
    ring.size = ring_size;
    ring.producer = reinterpret_cast<uint32_t*>(addr + offsets.producer);
    ring.consumer = reinterpret_cast<uint32_t*>(addr + offsets.consumer);
    ring.ring = reinterpret_cast<DescType*>(addr + offsets.desc);
    ring.mapping = mapping;
    return ring;
}

void CreateXsk(uint32_t if_index, uint32_t queue_id, size_t nr_frames, int umem_fd) {
    const int xsk_fd = socket(AF_XDP, SOCK_RAW, 0);
    if (xsk_fd < 0) {
        ErrorExit("socket");
    }

    int rx_size = ceil2(nr_frames);
    for (;; rx_size /= 2) {
        int ret = setsockopt(xsk_fd, SOL_XDP, XDP_RX_RING, &rx_size,
                             sizeof(rx_size));
        if (ret == 0) {
            break;
        } else if (errno != ENOMEM) {
            ErrorExit("socket");
        }
    }

    xdp_mmap_offsets offsets{};
    socklen_t offsets_len = sizeof(offsets);
    if (getsockopt(xsk_fd, SOL_XDP, XDP_MMAP_OFFSETS, &offsets, &offsets_len) < 0) {
        ErrorExit("getsockopt");
    }
    if (offsets_len != sizeof(offsets)) {
        std::cerr << "XDP_MMAP_OFFSETS length (" << offsets_len
                  << ") not supported\n";
        exit(1);
    }

    auto rx = InitializeRing<XskConsumerRing, xdp_desc>(
            rx_size, offsets.rx, xsk_fd, XDP_PGOFF_RX_RING);

    sockaddr_xdp sxdp{};
    sxdp.sxdp_family = AF_XDP;
    sxdp.sxdp_flags = XDP_SHARED_UMEM;
    sxdp.sxdp_ifindex = if_index;
    sxdp.sxdp_queue_id = queue_id;
    sxdp.sxdp_shared_umem_fd = umem_fd;
    if (bind(xsk_fd, reinterpret_cast<sockaddr*>(&sxdp), sizeof(sxdp)) < 0) {
        ErrorExit("bind");
    }

    xdp_options options{};
    socklen_t options_len = sizeof(options);
    if (getsockopt(xsk_fd, SOL_XDP, XDP_OPTIONS, &options, &options_len) < 0) {
        ErrorExit("getsockopt");
    }

    std::cout << "Created AF_XDP socket (" << rx_size << " rx descs)"
              << ((options.flags & XDP_OPTIONS_ZEROCOPY) ? " (zc)" : "")
              << "\n";
}

void CreateUmemXsk(uint32_t if_index, uint32_t queue_id, size_t umem_size) {
    const uint32_t page_size = getpagesize();
    const uint32_t frame_size = page_size;
    const uint32_t frame_mask = frame_size - 1;

    constexpr size_t MAX_FRAMES = KERNEL_MAX_FRAMES - KERNEL_RX_BATCH_SIZE;
    const size_t nr_frames = std::min(
            AlignSize(umem_size, static_cast<size_t>(page_size)) / frame_size,
            MAX_FRAMES);
    const size_t nr_frames_ring = ceil2(nr_frames + KERNEL_RX_BATCH_SIZE);
    umem_size = frame_size * nr_frames;

    std::cout << "Allocating UMEM buffer of " << umem_size << " bytes\n";

    int umem_fd = socket(AF_XDP, SOCK_RAW, 0);
    if (umem_fd == -1) {
        ErrorExit("socket");
    }

    void* umem_area = mmap(0, umem_size, PROT_READ | PROT_WRITE,
                           MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
    if (umem_area == MAP_FAILED) {
        ErrorExit("mmap");
    }

    xdp_umem_reg umem_reg{};
    umem_reg.addr = reinterpret_cast<uint64_t>(umem_area);
    umem_reg.len = umem_size;
    umem_reg.chunk_size = frame_size;
    umem_reg.headroom = UMEM_HEADROOM;
    if (setsockopt(umem_fd, SOL_XDP, XDP_UMEM_REG, &umem_reg, sizeof(umem_reg)) < 0) {
        ErrorExit("setsockopt");
    }

    const int fr_size = nr_frames_ring;
    if (setsockopt(umem_fd, SOL_XDP, XDP_UMEM_FILL_RING, &fr_size, sizeof(fr_size)) < 0) {
        ErrorExit("setsockopt");
    }

    const int cr_size = nr_frames_ring;
    if (setsockopt(umem_fd, SOL_XDP, XDP_UMEM_COMPLETION_RING, &cr_size, sizeof(cr_size)) < 0) {
        ErrorExit("setsockopt");
    }

    const int dummy_rx_size = 1;
    if (setsockopt(umem_fd, SOL_XDP, XDP_RX_RING, &dummy_rx_size, sizeof(dummy_rx_size)) < 0) {
        ErrorExit("setsockopt");
    }

    xdp_mmap_offsets offsets{};
    socklen_t offsets_len = sizeof(offsets);
    if (getsockopt(umem_fd, SOL_XDP, XDP_MMAP_OFFSETS, &offsets, &offsets_len) < 0) {
        ErrorExit("getsockopt");
    }
    if (offsets_len != sizeof(offsets)) {
        std::cerr << "XDP_MMAP_OFFSETS length (" << offsets_len
                  << ") not supported\n";
        exit(1);
    }

    auto fr = InitializeRing<XskProducerRing, uint64_t>(
            fr_size, offsets.fr, umem_fd, XDP_UMEM_PGOFF_FILL_RING);

    uint32_t idx;
    if (int ret = xsk_ring_prod__reserve(&fr, nr_frames, &idx); ret < 0) {
        errno = -ret;
        ErrorExit("xsk_ring_prod__reserve");
    } else if (static_cast<size_t>(ret) != nr_frames) {
        ErrorExit("xsk_ring_prod__reserve");
    }

    for (size_t i = 0; i < nr_frames; ++i)
        *xsk_ring_prod__fill_addr(&fr, idx++) = i * frame_size;

    xsk_ring_prod__submit(&fr, nr_frames);

    sockaddr_xdp sxdp{};
    sxdp.sxdp_family = AF_XDP;
    sxdp.sxdp_flags = XDP_ZEROCOPY;
    sxdp.sxdp_ifindex = if_index;
    sxdp.sxdp_queue_id = queue_id;
    sxdp.sxdp_shared_umem_fd = -1;
    if (bind(umem_fd, reinterpret_cast<sockaddr*>(&sxdp), sizeof(sxdp)) < 0) {
        ErrorExit("bind");
    }

    CreateXsk(if_index, queue_id, nr_frames, umem_fd);
}

int main(int argc, char* argv[]) {
    if (argc != 3) {
        std::cerr << "Usage: xdp_bomb <interface_name> <queue_id>\n";
        return 1;
    }
    const char* if_name = argv[1];
    const uint32_t queue_id = std::atoi(argv[2]);

    const size_t umem_size = UMEM_SIZE;

    const rlimit rlimit_infinity = {RLIM_INFINITY, RLIM_INFINITY};
    if (setrlimit(RLIMIT_MEMLOCK, &rlimit_infinity) != 0) {
        ErrorExit("setrlimit");
    }

    bpf_prog_load_attr prog_load_attr{};
    prog_load_attr.file = XDP_PROGRAM_PATH;
    prog_load_attr.prog_type = BPF_PROG_TYPE_XDP;
    bpf_object* prog;
    int prog_fd;
    if (bpf_prog_load_xattr(&prog_load_attr, &prog, &prog_fd) != 0) {
        ErrorExit("bpf_prog_load_xattr");
    }

    std::cout << "Loaded XDP program: `" << prog_load_attr.file << "`\n";

    const int if_index = if_nametoindex(if_name);
    if (if_index == 0) {
        std::cerr << "Could not get interface index for `" << if_name << "`\n";
    }

    (void)bpf_set_link_xdp_fd(if_index, -1, XDP_FLAGS_SKB_MODE);
    (void)bpf_set_link_xdp_fd(if_index, -1, XDP_FLAGS_DRV_MODE);
    (void)bpf_set_link_xdp_fd(if_index, -1, XDP_FLAGS_HW_MODE);

    if (int ret = bpf_set_link_xdp_fd(if_index, prog_fd, 0);
        ret < 0) {
        errno = -ret;
        ErrorExit("bpf_set_link_xdp_fd");
    }

    uint32_t prog_id;
    if (int ret = bpf_get_link_xdp_id(if_index, &prog_id, 0); ret < 0) {
        errno = -ret;
        ErrorExit("bpf_get_link_xdp_id");
    }

    std::cout << "XDP program attached to interface `" << if_name
              << "` (id=" << prog_id << ")\n";

    for (int i = 0; i < 32; ++i) {
        pid_t pid = fork();
        if (pid == -1) {
            ErrorExit("fork");
        } else if (pid != 0) {
            wait(nullptr);
        } else {
            CreateUmemXsk(if_index, queue_id, umem_size);
            return 0;
        }
    }

    std::cout << "You win.\n";
    return 0;
}

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-10-17  8:53 ` Kal Cutter Conley
@ 2019-10-17 22:56   ` Ilya Goslhtein
  2019-10-18  7:06     ` Kal Cutter Conley
  2019-10-18 11:23   ` Magnus Karlsson
  1 sibling, 1 reply; 7+ messages in thread
From: Ilya Goslhtein @ 2019-10-17 22:56 UTC (permalink / raw)
  To: Kal Cutter Conley, xdp-newbies

Hello Kal,

I've noticed that all created processes in your code snippet bound to 
the same queue without SHARED flag.

Is it supposed to work?

Thanks.

On 17.10.2019 11:53, Kal Cutter Conley wrote:
> Hello,
> I have managed to extract a reproducer that crashes the kernel. We
> observe the crash with all drivers that support XDP zerocopy (i40e,
> ixgbe, mlx5_core). The program source is attached (C++). Compile with
> a newer clang++ or g++ using flag -std=c++17. It must also be linked
> with libbpf. Use libbpf v0.0.5 and make sure to revert
> 5771dacd3dc2fdd041c51242819a9f212e04af55.
>
> The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.
>
> Hopefully this is useful,
> Kal
>
> On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
> <kal.conley@dectris.com> wrote:
>> Hello,
>> I am trying to get AF_XDP working with the i40e driver (Ethernet
>> Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
>> kernel (machine) freezes hard. I have reproduced this on varying
>> kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
>> also, but at a later stage. I tried replacing my XDP program with a
>> trivial one that simply returns XDP_PASS but it didn't help. On the
>> same system, the xdpsock sample does appear to work with the -z flag,
>> however. Are there any current known issues that could be causing
>> this? I will try to extract a minimal example that exercises the
>> freeze.
>>
>> Thanks,
>> Kal

-- 
Best regards,
Ilya Golshtein

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-10-17 22:56   ` Ilya Goslhtein
@ 2019-10-18  7:06     ` Kal Cutter Conley
  0 siblings, 0 replies; 7+ messages in thread
From: Kal Cutter Conley @ 2019-10-18  7:06 UTC (permalink / raw)
  To: Ilya Goslhtein; +Cc: xdp-newbies

Hello Ilya,
The processes are created in serial (parent waits for each child to
exit). I only use fork() to avoid clean-up code. Sorry for the
confusion!

Kal

On Fri, Oct 18, 2019 at 12:56 AM Ilya Goslhtein <ilejn@yandex.ru> wrote:
>
> Hello Kal,
>
> I've noticed that all created processes in your code snippet bound to
> the same queue without SHARED flag.
>
> Is it supposed to work?
>
> Thanks.
>
> On 17.10.2019 11:53, Kal Cutter Conley wrote:
> > Hello,
> > I have managed to extract a reproducer that crashes the kernel. We
> > observe the crash with all drivers that support XDP zerocopy (i40e,
> > ixgbe, mlx5_core). The program source is attached (C++). Compile with
> > a newer clang++ or g++ using flag -std=c++17. It must also be linked
> > with libbpf. Use libbpf v0.0.5 and make sure to revert
> > 5771dacd3dc2fdd041c51242819a9f212e04af55.
> >
> > The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.
> >
> > Hopefully this is useful,
> > Kal
> >
> > On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
> > <kal.conley@dectris.com> wrote:
> >> Hello,
> >> I am trying to get AF_XDP working with the i40e driver (Ethernet
> >> Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
> >> kernel (machine) freezes hard. I have reproduced this on varying
> >> kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
> >> also, but at a later stage. I tried replacing my XDP program with a
> >> trivial one that simply returns XDP_PASS but it didn't help. On the
> >> same system, the xdpsock sample does appear to work with the -z flag,
> >> however. Are there any current known issues that could be causing
> >> this? I will try to extract a minimal example that exercises the
> >> freeze.
> >>
> >> Thanks,
> >> Kal
>
> --
> Best regards,
> Ilya Golshtein
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-10-17  8:53 ` Kal Cutter Conley
  2019-10-17 22:56   ` Ilya Goslhtein
@ 2019-10-18 11:23   ` Magnus Karlsson
  2019-10-18 11:59     ` Magnus Karlsson
  1 sibling, 1 reply; 7+ messages in thread
From: Magnus Karlsson @ 2019-10-18 11:23 UTC (permalink / raw)
  To: Kal Cutter Conley; +Cc: Xdp

Thanks Kal. Will take a look at it and get back.

/Magnus

On Fri, Oct 18, 2019 at 12:18 PM Kal Cutter Conley
<kal.conley@dectris.com> wrote:
>
> Hello,
> I have managed to extract a reproducer that crashes the kernel. We
> observe the crash with all drivers that support XDP zerocopy (i40e,
> ixgbe, mlx5_core). The program source is attached (C++). Compile with
> a newer clang++ or g++ using flag -std=c++17. It must also be linked
> with libbpf. Use libbpf v0.0.5 and make sure to revert
> 5771dacd3dc2fdd041c51242819a9f212e04af55.
>
> The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.
>
> Hopefully this is useful,
> Kal
>
> On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
> <kal.conley@dectris.com> wrote:
> >
> > Hello,
> > I am trying to get AF_XDP working with the i40e driver (Ethernet
> > Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
> > kernel (machine) freezes hard. I have reproduced this on varying
> > kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
> > also, but at a later stage. I tried replacing my XDP program with a
> > trivial one that simply returns XDP_PASS but it didn't help. On the
> > same system, the xdpsock sample does appear to work with the -z flag,
> > however. Are there any current known issues that could be causing
> > this? I will try to extract a minimal example that exercises the
> > freeze.
> >
> > Thanks,
> > Kal

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-10-18 11:23   ` Magnus Karlsson
@ 2019-10-18 11:59     ` Magnus Karlsson
  2019-10-18 14:30       ` Kal Cutter Conley
  0 siblings, 1 reply; 7+ messages in thread
From: Magnus Karlsson @ 2019-10-18 11:59 UTC (permalink / raw)
  To: Kal Cutter Conley; +Cc: Xdp

I have managed to reproduce and root cause it. Will produce a patch.
Thanks for finding this issue.

/Magnus

On Fri, Oct 18, 2019 at 1:23 PM Magnus Karlsson
<magnus.karlsson@gmail.com> wrote:
>
> Thanks Kal. Will take a look at it and get back.
>
> /Magnus
>
> On Fri, Oct 18, 2019 at 12:18 PM Kal Cutter Conley
> <kal.conley@dectris.com> wrote:
> >
> > Hello,
> > I have managed to extract a reproducer that crashes the kernel. We
> > observe the crash with all drivers that support XDP zerocopy (i40e,
> > ixgbe, mlx5_core). The program source is attached (C++). Compile with
> > a newer clang++ or g++ using flag -std=c++17. It must also be linked
> > with libbpf. Use libbpf v0.0.5 and make sure to revert
> > 5771dacd3dc2fdd041c51242819a9f212e04af55.
> >
> > The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.
> >
> > Hopefully this is useful,
> > Kal
> >
> > On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
> > <kal.conley@dectris.com> wrote:
> > >
> > > Hello,
> > > I am trying to get AF_XDP working with the i40e driver (Ethernet
> > > Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
> > > kernel (machine) freezes hard. I have reproduced this on varying
> > > kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
> > > also, but at a later stage. I tried replacing my XDP program with a
> > > trivial one that simply returns XDP_PASS but it didn't help. On the
> > > same system, the xdpsock sample does appear to work with the -z flag,
> > > however. Are there any current known issues that could be causing
> > > this? I will try to extract a minimal example that exercises the
> > > freeze.
> > >
> > > Thanks,
> > > Kal

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: i40e: Kernel freezes with XDP_ZEROCOPY
  2019-10-18 11:59     ` Magnus Karlsson
@ 2019-10-18 14:30       ` Kal Cutter Conley
  0 siblings, 0 replies; 7+ messages in thread
From: Kal Cutter Conley @ 2019-10-18 14:30 UTC (permalink / raw)
  To: Magnus Karlsson; +Cc: Xdp

Hi Magnus,
Excellent! Thanks for looking into this. Can you send a link to your
patch when it's ready?

/Kal


On Fri, Oct 18, 2019 at 1:59 PM Magnus Karlsson
<magnus.karlsson@gmail.com> wrote:
>
> I have managed to reproduce and root cause it. Will produce a patch.
> Thanks for finding this issue.
>
> /Magnus
>
> On Fri, Oct 18, 2019 at 1:23 PM Magnus Karlsson
> <magnus.karlsson@gmail.com> wrote:
> >
> > Thanks Kal. Will take a look at it and get back.
> >
> > /Magnus
> >
> > On Fri, Oct 18, 2019 at 12:18 PM Kal Cutter Conley
> > <kal.conley@dectris.com> wrote:
> > >
> > > Hello,
> > > I have managed to extract a reproducer that crashes the kernel. We
> > > observe the crash with all drivers that support XDP zerocopy (i40e,
> > > ixgbe, mlx5_core). The program source is attached (C++). Compile with
> > > a newer clang++ or g++ using flag -std=c++17. It must also be linked
> > > with libbpf. Use libbpf v0.0.5 and make sure to revert
> > > 5771dacd3dc2fdd041c51242819a9f212e04af55.
> > >
> > > The crash is a kernel NULL pointer dereference in xsk_umem_consume_tx.
> > >
> > > Hopefully this is useful,
> > > Kal
> > >
> > > On Wed, Aug 7, 2019 at 10:48 PM Kal Cutter Conley
> > > <kal.conley@dectris.com> wrote:
> > > >
> > > > Hello,
> > > > I am trying to get AF_XDP working with the i40e driver (Ethernet
> > > > Controller X710 for 10GbE SFP+). After bind() with XDP_ZEROCOPY the
> > > > kernel (machine) freezes hard. I have reproduced this on varying
> > > > kernel versions between 5.1 and 5.3-rc3 with 5.3 kernels freezing
> > > > also, but at a later stage. I tried replacing my XDP program with a
> > > > trivial one that simply returns XDP_PASS but it didn't help. On the
> > > > same system, the xdpsock sample does appear to work with the -z flag,
> > > > however. Are there any current known issues that could be causing
> > > > this? I will try to extract a minimal example that exercises the
> > > > freeze.
> > > >
> > > > Thanks,
> > > > Kal

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-10-18 14:31 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-07 20:48 i40e: Kernel freezes with XDP_ZEROCOPY Kal Cutter Conley
2019-10-17  8:53 ` Kal Cutter Conley
2019-10-17 22:56   ` Ilya Goslhtein
2019-10-18  7:06     ` Kal Cutter Conley
2019-10-18 11:23   ` Magnus Karlsson
2019-10-18 11:59     ` Magnus Karlsson
2019-10-18 14:30       ` Kal Cutter Conley

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.