mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 08:08:54 +00:00
xsk: Add getsockopt XDP_OPTIONS
Make it possible for the application to determine whether the AF_XDP socket is running in zero-copy mode. To achieve this, add a new getsockopt option XDP_OPTIONS that returns flags. The only flag supported for now is the zero-copy mode indicator. Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com> Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Acked-by: Saeed Mahameed <saeedm@mellanox.com> Acked-by: Björn Töpel <bjorn.topel@intel.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
d57d76428a
commit
2640d3c812
3 changed files with 36 additions and 0 deletions
|
@ -46,6 +46,7 @@ struct xdp_mmap_offsets {
|
||||||
#define XDP_UMEM_FILL_RING 5
|
#define XDP_UMEM_FILL_RING 5
|
||||||
#define XDP_UMEM_COMPLETION_RING 6
|
#define XDP_UMEM_COMPLETION_RING 6
|
||||||
#define XDP_STATISTICS 7
|
#define XDP_STATISTICS 7
|
||||||
|
#define XDP_OPTIONS 8
|
||||||
|
|
||||||
struct xdp_umem_reg {
|
struct xdp_umem_reg {
|
||||||
__u64 addr; /* Start of packet data area */
|
__u64 addr; /* Start of packet data area */
|
||||||
|
@ -60,6 +61,13 @@ struct xdp_statistics {
|
||||||
__u64 tx_invalid_descs; /* Dropped due to invalid descriptor */
|
__u64 tx_invalid_descs; /* Dropped due to invalid descriptor */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct xdp_options {
|
||||||
|
__u32 flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for the flags field of struct xdp_options */
|
||||||
|
#define XDP_OPTIONS_ZEROCOPY (1 << 0)
|
||||||
|
|
||||||
/* Pgoff for mmaping the rings */
|
/* Pgoff for mmaping the rings */
|
||||||
#define XDP_PGOFF_RX_RING 0
|
#define XDP_PGOFF_RX_RING 0
|
||||||
#define XDP_PGOFF_TX_RING 0x80000000
|
#define XDP_PGOFF_TX_RING 0x80000000
|
||||||
|
|
|
@ -650,6 +650,26 @@ static int xsk_getsockopt(struct socket *sock, int level, int optname,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
case XDP_OPTIONS:
|
||||||
|
{
|
||||||
|
struct xdp_options opts = {};
|
||||||
|
|
||||||
|
if (len < sizeof(opts))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&xs->mutex);
|
||||||
|
if (xs->zc)
|
||||||
|
opts.flags |= XDP_OPTIONS_ZEROCOPY;
|
||||||
|
mutex_unlock(&xs->mutex);
|
||||||
|
|
||||||
|
len = sizeof(opts);
|
||||||
|
if (copy_to_user(optval, &opts, len))
|
||||||
|
return -EFAULT;
|
||||||
|
if (put_user(len, optlen))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ struct xdp_mmap_offsets {
|
||||||
#define XDP_UMEM_FILL_RING 5
|
#define XDP_UMEM_FILL_RING 5
|
||||||
#define XDP_UMEM_COMPLETION_RING 6
|
#define XDP_UMEM_COMPLETION_RING 6
|
||||||
#define XDP_STATISTICS 7
|
#define XDP_STATISTICS 7
|
||||||
|
#define XDP_OPTIONS 8
|
||||||
|
|
||||||
struct xdp_umem_reg {
|
struct xdp_umem_reg {
|
||||||
__u64 addr; /* Start of packet data area */
|
__u64 addr; /* Start of packet data area */
|
||||||
|
@ -60,6 +61,13 @@ struct xdp_statistics {
|
||||||
__u64 tx_invalid_descs; /* Dropped due to invalid descriptor */
|
__u64 tx_invalid_descs; /* Dropped due to invalid descriptor */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct xdp_options {
|
||||||
|
__u32 flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for the flags field of struct xdp_options */
|
||||||
|
#define XDP_OPTIONS_ZEROCOPY (1 << 0)
|
||||||
|
|
||||||
/* Pgoff for mmaping the rings */
|
/* Pgoff for mmaping the rings */
|
||||||
#define XDP_PGOFF_RX_RING 0
|
#define XDP_PGOFF_RX_RING 0
|
||||||
#define XDP_PGOFF_TX_RING 0x80000000
|
#define XDP_PGOFF_TX_RING 0x80000000
|
||||||
|
|
Loading…
Reference in a new issue