When feature VIRTIO_NET_F_MTU is negotiated on mlx5_vdpa,
22 extra bytes worth of MTU length is shown in guest.
This is because the mlx5_query_port_max_mtu API returns
the "hardware" MTU value, which does not just contain the
Ethernet payload, but includes extra lengths starting
from the Ethernet header up to the FCS altogether.
Fix the MTU so packets won't get dropped silently.
Fixes: 1a86b377aa
("vdpa/mlx5: Add VDPA driver for supported mlx5 devices")
Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Acked-by: Eli Cohen <elic@nvidia.com>
Link: https://lore.kernel.org/r/20210408091047.4269-2-elic@nvidia.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
97 lines
3.2 KiB
C
97 lines
3.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
|
/* Copyright (c) 2020 Mellanox Technologies Ltd. */
|
|
|
|
#ifndef __MLX5_VDPA_H__
|
|
#define __MLX5_VDPA_H__
|
|
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/if_vlan.h>
|
|
#include <linux/vdpa.h>
|
|
#include <linux/mlx5/driver.h>
|
|
|
|
#define MLX5V_ETH_HARD_MTU (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)
|
|
|
|
struct mlx5_vdpa_direct_mr {
|
|
u64 start;
|
|
u64 end;
|
|
u32 perm;
|
|
struct mlx5_core_mkey mr;
|
|
struct sg_table sg_head;
|
|
int log_size;
|
|
int nsg;
|
|
int nent;
|
|
struct list_head list;
|
|
u64 offset;
|
|
};
|
|
|
|
struct mlx5_vdpa_mr {
|
|
struct mlx5_core_mkey mkey;
|
|
|
|
/* list of direct MRs descendants of this indirect mr */
|
|
struct list_head head;
|
|
unsigned long num_directs;
|
|
unsigned long num_klms;
|
|
bool initialized;
|
|
|
|
/* serialize mkey creation and destruction */
|
|
struct mutex mkey_mtx;
|
|
};
|
|
|
|
struct mlx5_vdpa_resources {
|
|
u32 pdn;
|
|
struct mlx5_uars_page *uar;
|
|
void __iomem *kick_addr;
|
|
u16 uid;
|
|
u32 null_mkey;
|
|
bool valid;
|
|
};
|
|
|
|
struct mlx5_vdpa_dev {
|
|
struct vdpa_device vdev;
|
|
struct mlx5_core_dev *mdev;
|
|
struct mlx5_vdpa_resources res;
|
|
|
|
u64 mlx_features;
|
|
u64 actual_features;
|
|
u8 status;
|
|
u32 max_vqs;
|
|
u32 generation;
|
|
|
|
struct mlx5_vdpa_mr mr;
|
|
};
|
|
|
|
int mlx5_vdpa_alloc_pd(struct mlx5_vdpa_dev *dev, u32 *pdn, u16 uid);
|
|
int mlx5_vdpa_dealloc_pd(struct mlx5_vdpa_dev *dev, u32 pdn, u16 uid);
|
|
int mlx5_vdpa_get_null_mkey(struct mlx5_vdpa_dev *dev, u32 *null_mkey);
|
|
int mlx5_vdpa_create_tis(struct mlx5_vdpa_dev *mvdev, void *in, u32 *tisn);
|
|
void mlx5_vdpa_destroy_tis(struct mlx5_vdpa_dev *mvdev, u32 tisn);
|
|
int mlx5_vdpa_create_rqt(struct mlx5_vdpa_dev *mvdev, void *in, int inlen, u32 *rqtn);
|
|
void mlx5_vdpa_destroy_rqt(struct mlx5_vdpa_dev *mvdev, u32 rqtn);
|
|
int mlx5_vdpa_create_tir(struct mlx5_vdpa_dev *mvdev, void *in, u32 *tirn);
|
|
void mlx5_vdpa_destroy_tir(struct mlx5_vdpa_dev *mvdev, u32 tirn);
|
|
int mlx5_vdpa_alloc_transport_domain(struct mlx5_vdpa_dev *mvdev, u32 *tdn);
|
|
void mlx5_vdpa_dealloc_transport_domain(struct mlx5_vdpa_dev *mvdev, u32 tdn);
|
|
int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev);
|
|
void mlx5_vdpa_free_resources(struct mlx5_vdpa_dev *mvdev);
|
|
int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey, u32 *in,
|
|
int inlen);
|
|
int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey);
|
|
int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb,
|
|
bool *change_map);
|
|
int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb);
|
|
void mlx5_vdpa_destroy_mr(struct mlx5_vdpa_dev *mvdev);
|
|
|
|
#define mlx5_vdpa_warn(__dev, format, ...) \
|
|
dev_warn((__dev)->mdev->device, "%s:%d:(pid %d) warning: " format, __func__, __LINE__, \
|
|
current->pid, ##__VA_ARGS__)
|
|
|
|
#define mlx5_vdpa_info(__dev, format, ...) \
|
|
dev_info((__dev)->mdev->device, "%s:%d:(pid %d): " format, __func__, __LINE__, \
|
|
current->pid, ##__VA_ARGS__)
|
|
|
|
#define mlx5_vdpa_dbg(__dev, format, ...) \
|
|
dev_debug((__dev)->mdev->device, "%s:%d:(pid %d): " format, __func__, __LINE__, \
|
|
current->pid, ##__VA_ARGS__)
|
|
|
|
#endif /* __MLX5_VDPA_H__ */
|