![Jason Wang](/assets/img/avatar_default.png)
This patch implements XDP transmission for TAP. Since we can't create new queues for TAP during XDP set, exist ptr_ring was reused for queuing XDP buffers. To differ xdp_buff from sk_buff, TUN_XDP_FLAG (0x1UL) was encoded into lowest bit of xpd_buff pointer during ptr_ring_produce, and was decoded during consuming. XDP metadata was stored in the headroom of the packet which should work in most of cases since driver usually reserve enough headroom. Very minor changes were done for vhost_net: it just need to peek the length depends on the type of pointer. Tests were done on two Intel E5-2630 2.40GHz machines connected back to back through two 82599ES. Traffic were generated/received through MoonGen/testpmd(rxonly). It reports ~20% improvements when xdp_redirect_map is doing redirection from ixgbe to TAP (from 2.50Mpps to 3.05Mpps) Cc: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
/*
|
|
* Universal TUN/TAP device driver.
|
|
* Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
#ifndef __IF_TUN_H
|
|
#define __IF_TUN_H
|
|
|
|
#include <uapi/linux/if_tun.h>
|
|
|
|
#define TUN_XDP_FLAG 0x1UL
|
|
|
|
#if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE)
|
|
struct socket *tun_get_socket(struct file *);
|
|
struct ptr_ring *tun_get_tx_ring(struct file *file);
|
|
bool tun_is_xdp_buff(void *ptr);
|
|
void *tun_xdp_to_ptr(void *ptr);
|
|
void *tun_ptr_to_xdp(void *ptr);
|
|
#else
|
|
#include <linux/err.h>
|
|
#include <linux/errno.h>
|
|
struct file;
|
|
struct socket;
|
|
static inline struct socket *tun_get_socket(struct file *f)
|
|
{
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
static inline struct ptr_ring *tun_get_tx_ring(struct file *f)
|
|
{
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
static inline bool tun_is_xdp_buff(void *ptr)
|
|
{
|
|
return false;
|
|
}
|
|
void *tun_xdp_to_ptr(void *ptr)
|
|
{
|
|
return NULL;
|
|
}
|
|
void *tun_ptr_to_xdp(void *ptr)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif /* CONFIG_TUN */
|
|
#endif /* __IF_TUN_H */
|