Skip to content

Commit

Permalink
netdev-afxdp: Update memory locking limits unconditionally.
Browse files Browse the repository at this point in the history
Any type of AF_XDP socket in all modes implies creation of BPF map of
type BPF_MAP_TYPE_XSKMAP.  This leads to BPF_MAP_CREATE syscall and
subsequently 'xsk_map_alloc()' function that will charge required
memory from the memlock limit and fail with EPERM if we're trying
to allocate more.

On my system with 64K bytes of max locked memory by default, OVS
frequently starts to fail after addition of 3rd afxdp port in SKB
mode:

  netdev_afxdp|ERR|xsk_socket__create failed (Operation not permitted)
                   mode: SKB qid: 0

Fixes: 0de1b42 ("netdev-afxdp: add new netdev type for AF_XDP.")
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Signed-off-by: William Tu <u9012063@gmail.com>
  • Loading branch information
igsilya authored and williamtu committed Oct 10, 2019
1 parent ec92f8d commit 53c0bd5
Showing 1 changed file with 6 additions and 13 deletions.
19 changes: 6 additions & 13 deletions lib/netdev-afxdp.c
Expand Up @@ -525,19 +525,12 @@ netdev_afxdp_reconfigure(struct netdev *netdev)
netdev->n_rxq = dev->requested_n_rxq;
netdev->n_txq = netdev->n_rxq;

if (dev->requested_xdpmode == XDP_ZEROCOPY) {
dev->xdpmode = XDP_ZEROCOPY;
VLOG_INFO("AF_XDP device %s in DRV mode.", netdev_get_name(netdev));
if (setrlimit(RLIMIT_MEMLOCK, &r)) {
VLOG_ERR("ERROR: setrlimit(RLIMIT_MEMLOCK): %s",
ovs_strerror(errno));
}
} else {
dev->xdpmode = XDP_COPY;
VLOG_INFO("AF_XDP device %s in SKB mode.", netdev_get_name(netdev));
/* TODO: set rlimit back to previous value
* when no device is in DRV mode.
*/
dev->xdpmode = dev->requested_xdpmode;
VLOG_INFO("%s: Setting XDP mode to %s.", netdev_get_name(netdev),
dev->xdpmode == XDP_ZEROCOPY ? "DRV" : "SKB");

if (setrlimit(RLIMIT_MEMLOCK, &r)) {
VLOG_ERR("setrlimit(RLIMIT_MEMLOCK) failed: %s", ovs_strerror(errno));
}

err = xsk_configure_all(netdev);
Expand Down

0 comments on commit 53c0bd5

Please sign in to comment.