virtio_net: make use of extended ack message reporting
Try to carry error messages to the user via the netlink extended ack message attribute. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d957c0f711
commit
9861ce039c
|
@ -1878,7 +1878,8 @@ static int virtnet_reset(struct virtnet_info *vi, int curr_qp, int xdp_qp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog)
|
static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
|
unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
|
||||||
struct virtnet_info *vi = netdev_priv(dev);
|
struct virtnet_info *vi = netdev_priv(dev);
|
||||||
|
@ -1890,16 +1891,17 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog)
|
||||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) ||
|
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) ||
|
||||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_ECN) ||
|
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_ECN) ||
|
||||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_UFO)) {
|
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_UFO)) {
|
||||||
netdev_warn(dev, "can't set XDP while host is implementing LRO, disable LRO first\n");
|
NL_SET_ERR_MSG(extack, "can't set XDP while host is implementing LRO, disable LRO first");
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vi->mergeable_rx_bufs && !vi->any_header_sg) {
|
if (vi->mergeable_rx_bufs && !vi->any_header_sg) {
|
||||||
netdev_warn(dev, "XDP expects header/data in single page, any_header_sg required\n");
|
NL_SET_ERR_MSG(extack, "XDP expects header/data in single page, any_header_sg required");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->mtu > max_sz) {
|
if (dev->mtu > max_sz) {
|
||||||
|
NL_SET_ERR_MSG(extack, "MTU too large to enable XDP");
|
||||||
netdev_warn(dev, "XDP requires MTU less than %lu\n", max_sz);
|
netdev_warn(dev, "XDP requires MTU less than %lu\n", max_sz);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1910,6 +1912,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog)
|
||||||
|
|
||||||
/* XDP requires extra queues for XDP_TX */
|
/* XDP requires extra queues for XDP_TX */
|
||||||
if (curr_qp + xdp_qp > vi->max_queue_pairs) {
|
if (curr_qp + xdp_qp > vi->max_queue_pairs) {
|
||||||
|
NL_SET_ERR_MSG(extack, "Too few free TX rings available");
|
||||||
netdev_warn(dev, "request %i queues but max is %i\n",
|
netdev_warn(dev, "request %i queues but max is %i\n",
|
||||||
curr_qp + xdp_qp, vi->max_queue_pairs);
|
curr_qp + xdp_qp, vi->max_queue_pairs);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1971,7 +1974,7 @@ static int virtnet_xdp(struct net_device *dev, struct netdev_xdp *xdp)
|
||||||
{
|
{
|
||||||
switch (xdp->command) {
|
switch (xdp->command) {
|
||||||
case XDP_SETUP_PROG:
|
case XDP_SETUP_PROG:
|
||||||
return virtnet_xdp_set(dev, xdp->prog);
|
return virtnet_xdp_set(dev, xdp->prog, xdp->extack);
|
||||||
case XDP_QUERY_PROG:
|
case XDP_QUERY_PROG:
|
||||||
xdp->prog_attached = virtnet_xdp_query(dev);
|
xdp->prog_attached = virtnet_xdp_query(dev);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue