forked from Minki/linux
perf/urgent fixes:
BPF: Jiri Olsa: - Fixup determination of end of kernel map, to avoid having BPF programs, that are after the kernel headers and just before module texts mixed up in the kernel map. tools UAPI header copies: Arnaldo Carvalho de Melo: - Update copy of files related to new fspick, fsmount, fsconfig, fsopen, move_mount and open_tree syscalls. - Sync cpufeatures.h, sched.h, fs.h, drm.h, i915_drm.h and kvm.h headers. Namespaces: Namhyung Kim: - Add missing byte swap ops for namespace events when processing records from perf.data files that could have been recorded in a arch with a different endianness. - Fix access to the thread namespaces list by using the namespaces_lock. perf data: Shawn Landden: - Fix 'strncat may truncate' build failure with recent gcc. s/390 Thomas Richter: - Fix s390 missing module symbol and warning for non-root users in 'perf record'. arm64: Vitaly Chikunov: - Fix mksyscalltbl when system kernel headers are ahead of the kernel. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCXO1vsQAKCRCyPKLppCJ+ J5MrAQCrxsTz1Lc6GrStrMMX72BqmoEPzoCkmONCukVJCcXeEQEAzdz4I4/CNG3g phtc030+Njnc8X5qpkR9kqSQuaPjWAk= =1Fbq -----END PGP SIGNATURE----- Merge tag 'perf-urgent-for-mingo-5.2-20190528' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf/urgent fixes: BPF: Jiri Olsa: - Fixup determination of end of kernel map, to avoid having BPF programs, that are after the kernel headers and just before module texts mixed up in the kernel map. tools UAPI header copies: Arnaldo Carvalho de Melo: - Update copy of files related to new fspick, fsmount, fsconfig, fsopen, move_mount and open_tree syscalls. - Sync cpufeatures.h, sched.h, fs.h, drm.h, i915_drm.h and kvm.h headers. Namespaces: Namhyung Kim: - Add missing byte swap ops for namespace events when processing records from perf.data files that could have been recorded in a arch with a different endianness. - Fix access to the thread namespaces list by using the namespaces_lock. perf data: Shawn Landden: - Fix 'strncat may truncate' build failure with recent gcc. s/390 Thomas Richter: - Fix s390 missing module symbol and warning for non-root users in 'perf record'. arm64: Vitaly Chikunov: - Fix mksyscalltbl when system kernel headers are ahead of the kernel. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
849e96f300
@ -131,7 +131,7 @@ The following sections detail encoding of each kind.
|
||||
``btf_type`` is followed by a ``u32`` with the following bits arrangement::
|
||||
|
||||
#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL & 0x00ff0000)) >> 16)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
|
||||
#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
|
||||
|
||||
The ``BTF_INT_ENCODING`` has the following attributes::
|
||||
|
@ -437,20 +437,6 @@ more details, with real examples.
|
||||
The second argument is optional, and if supplied will be used
|
||||
if first argument is not supported.
|
||||
|
||||
cc-ldoption
|
||||
cc-ldoption is used to check if $(CC) when used to link object files
|
||||
supports the given option. An optional second option may be
|
||||
specified if first option are not supported.
|
||||
|
||||
Example:
|
||||
#arch/x86/kernel/Makefile
|
||||
vsyscall-flags += $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
|
||||
|
||||
In the above example, vsyscall-flags will be assigned the option
|
||||
-Wl$(comma)--hash-style=sysv if it is supported by $(CC).
|
||||
The second argument is optional, and if supplied will be used
|
||||
if first argument is not supported.
|
||||
|
||||
as-instr
|
||||
as-instr checks if the assembler reports a specific instruction
|
||||
and then outputs either option1 or option2
|
||||
|
@ -11068,10 +11068,8 @@ S: Supported
|
||||
F: drivers/net/ethernet/qlogic/netxen/
|
||||
|
||||
NFC SUBSYSTEM
|
||||
M: Samuel Ortiz <sameo@linux.intel.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
L: netdev@vger.kernel.org
|
||||
S: Orphan
|
||||
F: net/nfc/
|
||||
F: include/net/nfc/
|
||||
F: include/uapi/linux/nfc.h
|
||||
|
@ -2767,12 +2767,6 @@ static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
|
||||
case MEMDUMP:
|
||||
{
|
||||
switch (ia_cmds.sub_cmd) {
|
||||
case MEMDUMP_DEV:
|
||||
if (!capable(CAP_NET_ADMIN)) return -EPERM;
|
||||
if (copy_to_user(ia_cmds.buf, iadev, sizeof(IADEV)))
|
||||
return -EFAULT;
|
||||
ia_cmds.status = 0;
|
||||
break;
|
||||
case MEMDUMP_SEGREG:
|
||||
if (!capable(CAP_NET_ADMIN)) return -EPERM;
|
||||
tmps = (u16 __user *)ia_cmds.buf;
|
||||
|
@ -109,15 +109,15 @@ u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
||||
}
|
||||
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_index, REP_IB);
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_num, REP_IB);
|
||||
}
|
||||
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_index, REP_ETH);
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_num, REP_ETH);
|
||||
}
|
||||
|
||||
struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
||||
@ -125,9 +125,10 @@ struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
||||
return mlx5_eswitch_uplink_get_proto_dev(esw, REP_IB);
|
||||
}
|
||||
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw, int vport)
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_vport_rep(esw, vport);
|
||||
return mlx5_eswitch_vport_rep(esw, vport_num);
|
||||
}
|
||||
|
||||
struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
||||
|
@ -14,17 +14,17 @@ extern const struct mlx5_ib_profile uplink_rep_profile;
|
||||
|
||||
u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw);
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw);
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
void mlx5_ib_register_vport_reps(struct mlx5_core_dev *mdev);
|
||||
void mlx5_ib_unregister_vport_reps(struct mlx5_core_dev *mdev);
|
||||
struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
||||
struct mlx5_ib_sq *sq,
|
||||
u16 port);
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
#else /* CONFIG_MLX5_ESWITCH */
|
||||
static inline u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
||||
{
|
||||
@ -33,7 +33,7 @@ static inline u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
||||
|
||||
static inline
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -46,7 +46,7 @@ struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
||||
|
||||
static inline
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -63,7 +63,7 @@ struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
||||
|
||||
static inline
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ obj-$(CONFIG_ARCNET) += arcnet/
|
||||
obj-$(CONFIG_DEV_APPLETALK) += appletalk/
|
||||
obj-$(CONFIG_CAIF) += caif/
|
||||
obj-$(CONFIG_CAN) += can/
|
||||
obj-$(CONFIG_NET_DSA) += dsa/
|
||||
obj-y += dsa/
|
||||
obj-$(CONFIG_ETHERNET) += ethernet/
|
||||
obj-$(CONFIG_FDDI) += fddi/
|
||||
obj-$(CONFIG_HIPPI) += hippi/
|
||||
|
@ -3343,7 +3343,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
if (!err)
|
||||
err = -ENODEV;
|
||||
|
||||
dev_err(&pdev->dev, "failed to get macb_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to get macb_clk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -3352,7 +3352,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
if (!err)
|
||||
err = -ENODEV;
|
||||
|
||||
dev_err(&pdev->dev, "failed to get hclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to get hclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -3370,31 +3370,31 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
|
||||
err = clk_prepare_enable(*pclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*hclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable hclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable hclk (%d)\n", err);
|
||||
goto err_disable_pclk;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*tx_clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable tx_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable tx_clk (%d)\n", err);
|
||||
goto err_disable_hclk;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*rx_clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable rx_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable rx_clk (%d)\n", err);
|
||||
goto err_disable_txclk;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(*tsu_clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable tsu_clk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable tsu_clk (%d)\n", err);
|
||||
goto err_disable_rxclk;
|
||||
}
|
||||
|
||||
@ -3868,7 +3868,7 @@ static int at91ether_clk_init(struct platform_device *pdev, struct clk **pclk,
|
||||
|
||||
err = clk_prepare_enable(*pclk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err);
|
||||
dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -313,7 +313,9 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
|
||||
while (bds_to_clean && tx_frm_cnt < ENETC_DEFAULT_TX_WORK) {
|
||||
bool is_eof = !!tx_swbd->skb;
|
||||
|
||||
enetc_unmap_tx_buff(tx_ring, tx_swbd);
|
||||
if (likely(tx_swbd->dma))
|
||||
enetc_unmap_tx_buff(tx_ring, tx_swbd);
|
||||
|
||||
if (is_eof) {
|
||||
napi_consume_skb(tx_swbd->skb, napi_budget);
|
||||
tx_swbd->skb = NULL;
|
||||
|
@ -570,6 +570,7 @@ static const struct ethtool_ops enetc_pf_ethtool_ops = {
|
||||
.get_ringparam = enetc_get_ringparam,
|
||||
.get_link_ksettings = phy_ethtool_get_link_ksettings,
|
||||
.set_link_ksettings = phy_ethtool_set_link_ksettings,
|
||||
.get_link = ethtool_op_get_link,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops enetc_vf_ethtool_ops = {
|
||||
@ -584,6 +585,7 @@ static const struct ethtool_ops enetc_vf_ethtool_ops = {
|
||||
.get_rxfh = enetc_get_rxfh,
|
||||
.set_rxfh = enetc_set_rxfh,
|
||||
.get_ringparam = enetc_get_ringparam,
|
||||
.get_link = ethtool_op_get_link,
|
||||
};
|
||||
|
||||
void enetc_set_ethtool_ops(struct net_device *ndev)
|
||||
|
@ -721,7 +721,7 @@ static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
|
||||
ndev->watchdog_timeo = 5 * HZ;
|
||||
ndev->max_mtu = ENETC_MAX_MTU;
|
||||
|
||||
ndev->hw_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
|
||||
ndev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||
NETIF_F_LOOPBACK;
|
||||
ndev->features = NETIF_F_HIGHDMA | NETIF_F_SG |
|
||||
|
@ -130,7 +130,7 @@ static void enetc_vf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
|
||||
ndev->watchdog_timeo = 5 * HZ;
|
||||
ndev->max_mtu = ENETC_MAX_MTU;
|
||||
|
||||
ndev->hw_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
|
||||
ndev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | NETIF_F_HW_CSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_CTAG_RX;
|
||||
ndev->features = NETIF_F_HIGHDMA | NETIF_F_SG |
|
||||
|
@ -1492,7 +1492,7 @@ int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
|
||||
rule.port = port;
|
||||
rule.qpn = qpn;
|
||||
INIT_LIST_HEAD(&rule.list);
|
||||
mlx4_err(dev, "going promisc on %x\n", port);
|
||||
mlx4_info(dev, "going promisc on %x\n", port);
|
||||
|
||||
return mlx4_flow_attach(dev, &rule, regid_p);
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ config MLX5_CORE
|
||||
select NET_DEVLINK
|
||||
imply PTP_1588_CLOCK
|
||||
imply VXLAN
|
||||
imply MLXFW
|
||||
default n
|
||||
---help---
|
||||
Core driver for low level functionality of the ConnectX-4 and
|
||||
|
@ -1604,7 +1604,27 @@ void mlx5_cmd_flush(struct mlx5_core_dev *dev)
|
||||
|
||||
static int status_to_err(u8 status)
|
||||
{
|
||||
return status ? -1 : 0; /* TBD more meaningful codes */
|
||||
switch (status) {
|
||||
case MLX5_CMD_DELIVERY_STAT_OK:
|
||||
case MLX5_DRIVER_STATUS_ABORTED:
|
||||
return 0;
|
||||
case MLX5_CMD_DELIVERY_STAT_SIGNAT_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_TOK_ERR:
|
||||
return -EBADR;
|
||||
case MLX5_CMD_DELIVERY_STAT_BAD_BLK_NUM_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_OUT_PTR_ALIGN_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_IN_PTR_ALIGN_ERR:
|
||||
return -EFAULT; /* Bad address */
|
||||
case MLX5_CMD_DELIVERY_STAT_IN_LENGTH_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_OUT_LENGTH_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_CMD_DESCR_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_RES_FLD_NOT_CLR_ERR:
|
||||
return -ENOMSG;
|
||||
case MLX5_CMD_DELIVERY_STAT_FW_ERR:
|
||||
return -EIO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static struct mlx5_cmd_msg *alloc_msg(struct mlx5_core_dev *dev, int in_size,
|
||||
|
@ -26,7 +26,7 @@ static int mlx5_peer_pf_disable_hca(struct mlx5_core_dev *dev)
|
||||
|
||||
MLX5_SET(disable_hca_in, in, opcode, MLX5_CMD_OP_DISABLE_HCA);
|
||||
MLX5_SET(disable_hca_in, in, function_id, 0);
|
||||
MLX5_SET(enable_hca_in, in, embedded_cpu_function, 0);
|
||||
MLX5_SET(disable_hca_in, in, embedded_cpu_function, 0);
|
||||
return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||
}
|
||||
|
||||
|
@ -1901,6 +1901,22 @@ static int mlx5e_flash_device(struct net_device *dev,
|
||||
return mlx5e_ethtool_flash_device(priv, flash);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MLX5_EN_RXNFC
|
||||
/* When CONFIG_MLX5_EN_RXNFC=n we only support ETHTOOL_GRXRINGS
|
||||
* otherwise this function will be defined from en_fs_ethtool.c
|
||||
*/
|
||||
static int mlx5e_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, u32 *rule_locs)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (info->cmd != ETHTOOL_GRXRINGS)
|
||||
return -EOPNOTSUPP;
|
||||
/* ring_count is needed by ethtool -x */
|
||||
info->data = priv->channels.params.num_channels;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct ethtool_ops mlx5e_ethtool_ops = {
|
||||
.get_drvinfo = mlx5e_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
@ -1919,8 +1935,8 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
|
||||
.get_rxfh_indir_size = mlx5e_get_rxfh_indir_size,
|
||||
.get_rxfh = mlx5e_get_rxfh,
|
||||
.set_rxfh = mlx5e_set_rxfh,
|
||||
#ifdef CONFIG_MLX5_EN_RXNFC
|
||||
.get_rxnfc = mlx5e_get_rxnfc,
|
||||
#ifdef CONFIG_MLX5_EN_RXNFC
|
||||
.set_rxnfc = mlx5e_set_rxnfc,
|
||||
#endif
|
||||
.flash_device = mlx5e_flash_device,
|
||||
|
@ -65,9 +65,26 @@ static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
|
||||
static void mlx5e_rep_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
|
||||
strlcpy(drvinfo->driver, mlx5e_rep_driver_name,
|
||||
sizeof(drvinfo->driver));
|
||||
strlcpy(drvinfo->version, UTS_RELEASE, sizeof(drvinfo->version));
|
||||
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
|
||||
"%d.%d.%04d (%.16s)",
|
||||
fw_rev_maj(mdev), fw_rev_min(mdev),
|
||||
fw_rev_sub(mdev), mdev->board_id);
|
||||
}
|
||||
|
||||
static void mlx5e_uplink_rep_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
mlx5e_rep_get_drvinfo(dev, drvinfo);
|
||||
strlcpy(drvinfo->bus_info, pci_name(priv->mdev->pdev),
|
||||
sizeof(drvinfo->bus_info));
|
||||
}
|
||||
|
||||
static const struct counter_desc sw_rep_stats_desc[] = {
|
||||
@ -363,7 +380,7 @@ static const struct ethtool_ops mlx5e_vf_rep_ethtool_ops = {
|
||||
};
|
||||
|
||||
static const struct ethtool_ops mlx5e_uplink_rep_ethtool_ops = {
|
||||
.get_drvinfo = mlx5e_rep_get_drvinfo,
|
||||
.get_drvinfo = mlx5e_uplink_rep_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_strings = mlx5e_rep_get_strings,
|
||||
.get_sset_count = mlx5e_rep_get_sset_count,
|
||||
|
@ -1595,7 +1595,7 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
||||
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CVLAN)) {
|
||||
struct flow_match_vlan match;
|
||||
|
||||
flow_rule_match_vlan(rule, &match);
|
||||
flow_rule_match_cvlan(rule, &match);
|
||||
if (match.mask->vlan_id ||
|
||||
match.mask->vlan_priority ||
|
||||
match.mask->vlan_tpid) {
|
||||
@ -1916,6 +1916,19 @@ struct mlx5_fields {
|
||||
offsetof(struct pedit_headers, field) + (off), \
|
||||
MLX5_BYTE_OFF(fte_match_set_lyr_2_4, match_field)}
|
||||
|
||||
/* masked values are the same and there are no rewrites that do not have a
|
||||
* match.
|
||||
*/
|
||||
#define SAME_VAL_MASK(type, valp, maskp, matchvalp, matchmaskp) ({ \
|
||||
type matchmaskx = *(type *)(matchmaskp); \
|
||||
type matchvalx = *(type *)(matchvalp); \
|
||||
type maskx = *(type *)(maskp); \
|
||||
type valx = *(type *)(valp); \
|
||||
\
|
||||
(valx & maskx) == (matchvalx & matchmaskx) && !(maskx & (maskx ^ \
|
||||
matchmaskx)); \
|
||||
})
|
||||
|
||||
static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
|
||||
void *matchmaskp, int size)
|
||||
{
|
||||
@ -1923,16 +1936,13 @@ static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
|
||||
|
||||
switch (size) {
|
||||
case sizeof(u8):
|
||||
same = ((*(u8 *)valp) & (*(u8 *)maskp)) ==
|
||||
((*(u8 *)matchvalp) & (*(u8 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u8, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
case sizeof(u16):
|
||||
same = ((*(u16 *)valp) & (*(u16 *)maskp)) ==
|
||||
((*(u16 *)matchvalp) & (*(u16 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u16, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
case sizeof(u32):
|
||||
same = ((*(u32 *)valp) & (*(u32 *)maskp)) ==
|
||||
((*(u32 *)matchvalp) & (*(u32 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u32, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2557,8 +2567,10 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
/* in case all pedit actions are skipped, remove the MOD_HDR
|
||||
* flag.
|
||||
*/
|
||||
if (parse_attr->num_mod_hdr_actions == 0)
|
||||
if (parse_attr->num_mod_hdr_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
kfree(parse_attr->mod_hdr_actions);
|
||||
}
|
||||
}
|
||||
|
||||
attr->action = action;
|
||||
@ -2995,6 +3007,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
||||
*/
|
||||
if (parse_attr->num_mod_hdr_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
kfree(parse_attr->mod_hdr_actions);
|
||||
if (!((action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
|
||||
(action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
|
||||
attr->split_count = 0;
|
||||
|
@ -361,7 +361,7 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
stats->bytes += num_bytes;
|
||||
stats->xmit_more += netdev_xmit_more();
|
||||
stats->xmit_more += xmit_more;
|
||||
|
||||
headlen = skb->len - ihs - skb->data_len;
|
||||
ds_cnt += !!headlen;
|
||||
@ -624,7 +624,8 @@ mlx5i_txwqe_build_datagram(struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
||||
}
|
||||
|
||||
netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey)
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
||||
bool xmit_more)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
struct mlx5i_tx_wqe *wqe;
|
||||
@ -660,7 +661,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
stats->bytes += num_bytes;
|
||||
stats->xmit_more += netdev_xmit_more();
|
||||
stats->xmit_more += xmit_more;
|
||||
|
||||
headlen = skb->len - ihs - skb->data_len;
|
||||
ds_cnt += !!headlen;
|
||||
@ -705,7 +706,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
goto err_drop;
|
||||
|
||||
mlx5e_txwqe_complete(sq, skb, opcode, ds_cnt, num_wqebbs, num_bytes,
|
||||
num_dma, wi, cseg, false);
|
||||
num_dma, wi, cseg, xmit_more);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
|
@ -1526,7 +1526,7 @@ static void node_guid_gen_from_mac(u64 *node_guid, u8 mac[ETH_ALEN])
|
||||
static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
|
||||
struct mlx5_vport *vport)
|
||||
{
|
||||
int vport_num = vport->vport;
|
||||
u16 vport_num = vport->vport;
|
||||
|
||||
if (esw->manager_vport == vport_num)
|
||||
return;
|
||||
@ -1915,7 +1915,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
|
||||
|
||||
/* Vport Administration */
|
||||
int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
||||
int vport, u8 mac[ETH_ALEN])
|
||||
u16 vport, u8 mac[ETH_ALEN])
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
u64 node_guid;
|
||||
@ -1959,7 +1959,7 @@ unlock:
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
||||
int vport, int link_state)
|
||||
u16 vport, int link_state)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
int err = 0;
|
||||
@ -1989,7 +1989,7 @@ unlock:
|
||||
}
|
||||
|
||||
int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
||||
int vport, struct ifla_vf_info *ivi)
|
||||
u16 vport, struct ifla_vf_info *ivi)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
|
||||
@ -2014,7 +2014,7 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
||||
}
|
||||
|
||||
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos, u8 set_flags)
|
||||
u16 vport, u16 vlan, u8 qos, u8 set_flags)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
int err = 0;
|
||||
@ -2047,7 +2047,7 @@ unlock:
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos)
|
||||
u16 vport, u16 vlan, u8 qos)
|
||||
{
|
||||
u8 set_flags = 0;
|
||||
|
||||
@ -2058,7 +2058,7 @@ int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
|
||||
int vport, bool spoofchk)
|
||||
u16 vport, bool spoofchk)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
bool pschk;
|
||||
@ -2208,7 +2208,7 @@ out:
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,
|
||||
int vport, bool setting)
|
||||
u16 vport, bool setting)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
|
||||
@ -2278,7 +2278,7 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport,
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 max_rate, u32 min_rate)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
@ -2368,7 +2368,7 @@ static int mlx5_eswitch_query_vport_drop_stats(struct mlx5_core_dev *dev,
|
||||
}
|
||||
|
||||
int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
||||
int vport_num,
|
||||
u16 vport_num,
|
||||
struct ifla_vf_stats *vf_stats)
|
||||
{
|
||||
struct mlx5_vport *vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
|
@ -246,23 +246,23 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw);
|
||||
int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode);
|
||||
void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw);
|
||||
int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
||||
int vport, u8 mac[ETH_ALEN]);
|
||||
u16 vport, u8 mac[ETH_ALEN]);
|
||||
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
||||
int vport, int link_state);
|
||||
u16 vport, int link_state);
|
||||
int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos);
|
||||
u16 vport, u16 vlan, u8 qos);
|
||||
int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
|
||||
int vport, bool spoofchk);
|
||||
u16 vport, bool spoofchk);
|
||||
int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,
|
||||
int vport_num, bool setting);
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport,
|
||||
u16 vport_num, bool setting);
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 max_rate, u32 min_rate);
|
||||
int mlx5_eswitch_set_vepa(struct mlx5_eswitch *esw, u8 setting);
|
||||
int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting);
|
||||
int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
||||
int vport, struct ifla_vf_info *ivi);
|
||||
u16 vport, struct ifla_vf_info *ivi);
|
||||
int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport,
|
||||
struct ifla_vf_stats *vf_stats);
|
||||
void mlx5_eswitch_del_send_to_vport_rule(struct mlx5_flow_handle *rule);
|
||||
|
||||
@ -296,7 +296,7 @@ u32
|
||||
mlx5_eswitch_get_chain_range(struct mlx5_eswitch *esw);
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport,
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
struct mlx5_flow_destination *dest);
|
||||
|
||||
enum {
|
||||
@ -366,7 +366,7 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
|
||||
int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
|
||||
struct mlx5_esw_flow_attr *attr);
|
||||
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos, u8 set_flags);
|
||||
u16 vport, u16 vlan, u8 qos, u8 set_flags);
|
||||
|
||||
static inline bool mlx5_eswitch_vlan_actions_supported(struct mlx5_core_dev *dev,
|
||||
u8 vlan_depth)
|
||||
@ -430,7 +430,7 @@ static inline int mlx5_eswitch_vport_num_to_index(struct mlx5_eswitch *esw,
|
||||
return vport_num;
|
||||
}
|
||||
|
||||
static inline int mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
|
||||
static inline u16 mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
|
||||
int index)
|
||||
{
|
||||
if (index == mlx5_eswitch_ecpf_idx(esw) &&
|
||||
|
@ -57,7 +57,7 @@
|
||||
static struct mlx5_eswitch_rep *mlx5_eswitch_get_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
int idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
|
||||
WARN_ON(idx > esw->total_vports - 1);
|
||||
return &esw->offloads.vport_reps[idx];
|
||||
@ -515,7 +515,8 @@ out:
|
||||
}
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, int vport, u32 sqn)
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 sqn)
|
||||
{
|
||||
struct mlx5_flow_act flow_act = {0};
|
||||
struct mlx5_flow_destination dest = {};
|
||||
@ -1181,7 +1182,7 @@ static void esw_destroy_vport_rx_group(struct mlx5_eswitch *esw)
|
||||
}
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport,
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
struct mlx5_flow_destination *dest)
|
||||
{
|
||||
struct mlx5_flow_act flow_act = {0};
|
||||
@ -1731,13 +1732,14 @@ static void esw_prio_tag_acls_cleanup(struct mlx5_eswitch *esw)
|
||||
struct mlx5_vport *vport;
|
||||
int i;
|
||||
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->nvports) {
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->dev->priv.sriov.num_vfs) {
|
||||
esw_vport_disable_egress_acl(esw, vport);
|
||||
esw_vport_disable_ingress_acl(esw, vport);
|
||||
}
|
||||
}
|
||||
|
||||
static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int nvports)
|
||||
static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int vf_nvports,
|
||||
int nvports)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -1745,7 +1747,7 @@ static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int nvports)
|
||||
mutex_init(&esw->fdb_table.offloads.fdb_prio_lock);
|
||||
|
||||
if (MLX5_CAP_GEN(esw->dev, prio_tag_required)) {
|
||||
err = esw_prio_tag_acls_config(esw, nvports);
|
||||
err = esw_prio_tag_acls_config(esw, vf_nvports);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@ -1838,7 +1840,7 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports,
|
||||
{
|
||||
int err;
|
||||
|
||||
err = esw_offloads_steering_init(esw, total_nvports);
|
||||
err = esw_offloads_steering_init(esw, vf_nvports, total_nvports);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -2243,7 +2245,7 @@ void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
|
||||
}
|
||||
|
||||
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport,
|
||||
u8 rep_type)
|
||||
{
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
@ -2264,7 +2266,7 @@ void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type)
|
||||
EXPORT_SYMBOL(mlx5_eswitch_uplink_get_proto_dev);
|
||||
|
||||
struct mlx5_eswitch_rep *mlx5_eswitch_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport)
|
||||
u16 vport)
|
||||
{
|
||||
return mlx5_eswitch_get_rep(esw, vport);
|
||||
}
|
||||
|
@ -1380,6 +1380,8 @@ static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1,
|
||||
if ((d1->type == MLX5_FLOW_DESTINATION_TYPE_VPORT &&
|
||||
d1->vport.num == d2->vport.num &&
|
||||
d1->vport.flags == d2->vport.flags &&
|
||||
((d1->vport.flags & MLX5_FLOW_DEST_VPORT_VHCA_ID) ?
|
||||
(d1->vport.vhca_id == d2->vport.vhca_id) : true) &&
|
||||
((d1->vport.flags & MLX5_FLOW_DEST_VPORT_REFORMAT_ID) ?
|
||||
(d1->vport.reformat_id == d2->vport.reformat_id) : true)) ||
|
||||
(d1->type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE &&
|
||||
|
@ -619,7 +619,7 @@ static int mlx5i_xmit(struct net_device *dev, struct sk_buff *skb,
|
||||
struct mlx5_ib_ah *mah = to_mah(address);
|
||||
struct mlx5i_priv *ipriv = epriv->ppriv;
|
||||
|
||||
return mlx5i_sq_xmit(sq, skb, &mah->av, dqpn, ipriv->qkey);
|
||||
return mlx5i_sq_xmit(sq, skb, &mah->av, dqpn, ipriv->qkey, netdev_xmit_more());
|
||||
}
|
||||
|
||||
static void mlx5i_set_pkey_index(struct net_device *netdev, int id)
|
||||
|
@ -119,7 +119,8 @@ static inline void mlx5i_sq_fetch_wqe(struct mlx5e_txqsq *sq,
|
||||
}
|
||||
|
||||
netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey);
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
||||
bool xmit_more);
|
||||
void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
|
||||
void mlx5i_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats);
|
||||
|
||||
|
@ -122,6 +122,12 @@ void *mlxsw_core_driver_priv(struct mlxsw_core *mlxsw_core)
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_driver_priv);
|
||||
|
||||
bool mlxsw_core_res_query_enabled(const struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
return mlxsw_core->driver->res_query_enabled;
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_res_query_enabled);
|
||||
|
||||
struct mlxsw_rx_listener_item {
|
||||
struct list_head list;
|
||||
struct mlxsw_rx_listener rxl;
|
||||
|
@ -28,6 +28,8 @@ unsigned int mlxsw_core_max_ports(const struct mlxsw_core *mlxsw_core);
|
||||
|
||||
void *mlxsw_core_driver_priv(struct mlxsw_core *mlxsw_core);
|
||||
|
||||
bool mlxsw_core_res_query_enabled(const struct mlxsw_core *mlxsw_core);
|
||||
|
||||
int mlxsw_core_driver_register(struct mlxsw_driver *mlxsw_driver);
|
||||
void mlxsw_core_driver_unregister(struct mlxsw_driver *mlxsw_driver);
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/sfp.h>
|
||||
|
||||
#include "core.h"
|
||||
#include "core_env.h"
|
||||
@ -162,7 +163,7 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
|
||||
{
|
||||
u8 module_info[MLXSW_REG_MCIA_EEPROM_MODULE_INFO_SIZE];
|
||||
u16 offset = MLXSW_REG_MCIA_EEPROM_MODULE_INFO_SIZE;
|
||||
u8 module_rev_id, module_id;
|
||||
u8 module_rev_id, module_id, diag_mon;
|
||||
unsigned int read_size;
|
||||
int err;
|
||||
|
||||
@ -195,8 +196,21 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
|
||||
}
|
||||
break;
|
||||
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_SFP:
|
||||
/* Verify if transceiver provides diagnostic monitoring page */
|
||||
err = mlxsw_env_query_module_eeprom(mlxsw_core, module,
|
||||
SFP_DIAGMON, 1, &diag_mon,
|
||||
&read_size);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (read_size < 1)
|
||||
return -EIO;
|
||||
|
||||
modinfo->type = ETH_MODULE_SFF_8472;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
|
||||
if (diag_mon)
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
|
||||
else
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN / 2;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -518,6 +518,9 @@ static int mlxsw_hwmon_module_init(struct mlxsw_hwmon *mlxsw_hwmon)
|
||||
u8 width;
|
||||
int err;
|
||||
|
||||
if (!mlxsw_core_res_query_enabled(mlxsw_hwmon->core))
|
||||
return 0;
|
||||
|
||||
/* Add extra attributes for module temperature. Sensor index is
|
||||
* assigned to sensor_count value, while all indexed before
|
||||
* sensor_count are already utilized by the sensors connected through
|
||||
|
@ -740,6 +740,9 @@ mlxsw_thermal_modules_init(struct device *dev, struct mlxsw_core *core,
|
||||
struct mlxsw_thermal_module *module_tz;
|
||||
int i, err;
|
||||
|
||||
if (!mlxsw_core_res_query_enabled(core))
|
||||
return 0;
|
||||
|
||||
thermal->tz_module_arr = kcalloc(module_count,
|
||||
sizeof(*thermal->tz_module_arr),
|
||||
GFP_KERNEL);
|
||||
@ -776,6 +779,9 @@ mlxsw_thermal_modules_fini(struct mlxsw_thermal *thermal)
|
||||
unsigned int module_count = mlxsw_core_max_ports(thermal->core);
|
||||
int i;
|
||||
|
||||
if (!mlxsw_core_res_query_enabled(thermal->core))
|
||||
return;
|
||||
|
||||
for (i = module_count - 1; i >= 0; i--)
|
||||
mlxsw_thermal_module_fini(&thermal->tz_module_arr[i]);
|
||||
kfree(thermal->tz_module_arr);
|
||||
|
@ -168,6 +168,7 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb)
|
||||
return;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < count; i++) {
|
||||
ipv4_addr = payload->tun_info[i].ipv4;
|
||||
port = be32_to_cpu(payload->tun_info[i].egress_port);
|
||||
@ -183,6 +184,7 @@ void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb)
|
||||
neigh_event_send(n, NULL);
|
||||
neigh_release(n);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int
|
||||
@ -367,9 +369,10 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb)
|
||||
|
||||
payload = nfp_flower_cmsg_get_data(skb);
|
||||
|
||||
rcu_read_lock();
|
||||
netdev = nfp_app_dev_get(app, be32_to_cpu(payload->ingress_port), NULL);
|
||||
if (!netdev)
|
||||
goto route_fail_warning;
|
||||
goto fail_rcu_unlock;
|
||||
|
||||
flow.daddr = payload->ipv4_addr;
|
||||
flow.flowi4_proto = IPPROTO_UDP;
|
||||
@ -379,21 +382,23 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb)
|
||||
rt = ip_route_output_key(dev_net(netdev), &flow);
|
||||
err = PTR_ERR_OR_ZERO(rt);
|
||||
if (err)
|
||||
goto route_fail_warning;
|
||||
goto fail_rcu_unlock;
|
||||
#else
|
||||
goto route_fail_warning;
|
||||
goto fail_rcu_unlock;
|
||||
#endif
|
||||
|
||||
/* Get the neighbour entry for the lookup */
|
||||
n = dst_neigh_lookup(&rt->dst, &flow.daddr);
|
||||
ip_rt_put(rt);
|
||||
if (!n)
|
||||
goto route_fail_warning;
|
||||
nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_KERNEL);
|
||||
goto fail_rcu_unlock;
|
||||
nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_ATOMIC);
|
||||
neigh_release(n);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
|
||||
route_fail_warning:
|
||||
fail_rcu_unlock:
|
||||
rcu_read_unlock();
|
||||
nfp_flower_cmsg_warn(app, "Requested route not found.\n");
|
||||
}
|
||||
|
||||
|
@ -487,6 +487,7 @@ static int aqr107_config_init(struct phy_device *phydev)
|
||||
/* Check that the PHY interface type is compatible */
|
||||
if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
|
||||
phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
|
||||
phydev->interface != PHY_INTERFACE_MODE_XGMII &&
|
||||
phydev->interface != PHY_INTERFACE_MODE_10GKR)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -610,12 +610,20 @@ static struct compressor ppp_deflate_draft = {
|
||||
|
||||
static int __init deflate_init(void)
|
||||
{
|
||||
int answer = ppp_register_compressor(&ppp_deflate);
|
||||
if (answer == 0)
|
||||
printk(KERN_INFO
|
||||
"PPP Deflate Compression module registered\n");
|
||||
ppp_register_compressor(&ppp_deflate_draft);
|
||||
return answer;
|
||||
int rc;
|
||||
|
||||
rc = ppp_register_compressor(&ppp_deflate);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = ppp_register_compressor(&ppp_deflate_draft);
|
||||
if (rc) {
|
||||
ppp_unregister_compressor(&ppp_deflate);
|
||||
return rc;
|
||||
}
|
||||
|
||||
pr_info("PPP Deflate Compression module registered\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit deflate_cleanup(void)
|
||||
|
@ -320,7 +320,6 @@ static int aqc111_get_link_ksettings(struct net_device *net,
|
||||
static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
|
||||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
|
||||
aqc111_data->phy_cfg |= AQ_PAUSE;
|
||||
@ -362,8 +361,7 @@ static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
|
||||
}
|
||||
}
|
||||
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &phy_on_the_wire);
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &aqc111_data->phy_cfg);
|
||||
}
|
||||
|
||||
static int aqc111_set_link_ksettings(struct net_device *net,
|
||||
@ -439,7 +437,7 @@ static int aqc111_change_mtu(struct net_device *net, int new_mtu)
|
||||
aqc111_write16_cmd(dev, AQ_ACCESS_MAC, SFR_MEDIUM_STATUS_MODE,
|
||||
2, ®16);
|
||||
|
||||
if (dev->net->mtu > 12500 && dev->net->mtu <= 16334) {
|
||||
if (dev->net->mtu > 12500) {
|
||||
memcpy(buf, &AQC111_BULKIN_SIZE[2], 5);
|
||||
/* RX bulk configuration */
|
||||
aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_RX_BULKIN_QCTRL,
|
||||
@ -453,10 +451,8 @@ static int aqc111_change_mtu(struct net_device *net, int new_mtu)
|
||||
reg16 = 0x1020;
|
||||
else if (dev->net->mtu <= 12500)
|
||||
reg16 = 0x1420;
|
||||
else if (dev->net->mtu <= 16334)
|
||||
reg16 = 0x1A20;
|
||||
else
|
||||
return 0;
|
||||
reg16 = 0x1A20;
|
||||
|
||||
aqc111_write16_cmd(dev, AQ_ACCESS_MAC, SFR_PAUSE_WATERLVL_LOW,
|
||||
2, ®16);
|
||||
@ -757,7 +753,6 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
/* Force bz */
|
||||
reg16 = SFR_PHYPWR_RSTCTL_BZ;
|
||||
@ -771,9 +766,8 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
aqc111_data->phy_cfg &= ~AQ_PHY_POWER_EN;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0,
|
||||
&phy_on_the_wire);
|
||||
&aqc111_data->phy_cfg);
|
||||
|
||||
kfree(aqc111_data);
|
||||
}
|
||||
@ -996,7 +990,6 @@ static int aqc111_reset(struct usbnet *dev)
|
||||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u8 reg8 = 0;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
dev->rx_urb_size = URB_SIZE;
|
||||
|
||||
@ -1009,9 +1002,8 @@ static int aqc111_reset(struct usbnet *dev)
|
||||
|
||||
/* Power up ethernet PHY */
|
||||
aqc111_data->phy_cfg = AQ_PHY_POWER_EN;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&phy_on_the_wire);
|
||||
&aqc111_data->phy_cfg);
|
||||
|
||||
/* Set the MAC address */
|
||||
aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_NODE_ID, ETH_ALEN,
|
||||
@ -1042,7 +1034,6 @@ static int aqc111_stop(struct usbnet *dev)
|
||||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16 = 0;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
aqc111_read16_cmd(dev, AQ_ACCESS_MAC, SFR_MEDIUM_STATUS_MODE,
|
||||
2, ®16);
|
||||
@ -1054,9 +1045,8 @@ static int aqc111_stop(struct usbnet *dev)
|
||||
|
||||
/* Put PHY to low power*/
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&phy_on_the_wire);
|
||||
&aqc111_data->phy_cfg);
|
||||
|
||||
netif_carrier_off(dev->net);
|
||||
|
||||
@ -1332,7 +1322,6 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
u16 temp_rx_ctrl = 0x00;
|
||||
u16 reg16;
|
||||
u8 reg8;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
usbnet_suspend(intf, message);
|
||||
|
||||
@ -1404,14 +1393,12 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
|
||||
aqc111_write_cmd(dev, AQ_WOL_CFG, 0, 0,
|
||||
WOL_CFG_SIZE, &wol_cfg);
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&phy_on_the_wire);
|
||||
&aqc111_data->phy_cfg);
|
||||
} else {
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&phy_on_the_wire);
|
||||
&aqc111_data->phy_cfg);
|
||||
|
||||
/* Disable RX path */
|
||||
aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC,
|
||||
@ -1428,7 +1415,7 @@ static int aqc111_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct usbnet *dev = usb_get_intfdata(intf);
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16, oldreg16;
|
||||
u16 reg16;
|
||||
u8 reg8;
|
||||
|
||||
netif_carrier_off(dev->net);
|
||||
@ -1444,11 +1431,9 @@ static int aqc111_resume(struct usb_interface *intf)
|
||||
/* Configure RX control register => start operation */
|
||||
reg16 = aqc111_data->rxctl;
|
||||
reg16 &= ~SFR_RX_CTL_START;
|
||||
/* needs to be saved in case endianness is swapped */
|
||||
oldreg16 = reg16;
|
||||
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, ®16);
|
||||
|
||||
reg16 = oldreg16 | SFR_RX_CTL_START;
|
||||
reg16 |= SFR_RX_CTL_START;
|
||||
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, ®16);
|
||||
|
||||
aqc111_set_phy_speed(dev, aqc111_data->autoneg,
|
||||
|
@ -1259,6 +1259,8 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */
|
||||
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1201, 2)}, /* Telit LE920, LE920A4 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1260, 2)}, /* Telit LE910Cx */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1261, 2)}, /* Telit LE910Cx */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1900, 1)}, /* Telit LN940 series */
|
||||
{QMI_FIXED_INTF(0x1c9e, 0x9801, 3)}, /* Telewell TW-3G HSPA+ */
|
||||
{QMI_FIXED_INTF(0x1c9e, 0x9803, 4)}, /* Telewell TW-3G HSPA+ */
|
||||
|
@ -1008,6 +1008,7 @@ int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping,
|
||||
struct list_head *workspace;
|
||||
int ret;
|
||||
|
||||
level = btrfs_compress_op[type]->set_level(level);
|
||||
workspace = get_workspace(type, level);
|
||||
ret = btrfs_compress_op[type]->compress_pages(workspace, mapping,
|
||||
start, pages,
|
||||
|
@ -757,12 +757,14 @@ static struct btrfs_space_info *__find_space_info(struct btrfs_fs_info *info,
|
||||
}
|
||||
|
||||
static void add_pinned_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_ref *ref)
|
||||
struct btrfs_ref *ref, int sign)
|
||||
{
|
||||
struct btrfs_space_info *space_info;
|
||||
s64 num_bytes = -ref->len;
|
||||
s64 num_bytes;
|
||||
u64 flags;
|
||||
|
||||
ASSERT(sign == 1 || sign == -1);
|
||||
num_bytes = sign * ref->len;
|
||||
if (ref->type == BTRFS_REF_METADATA) {
|
||||
if (ref->tree_ref.root == BTRFS_CHUNK_TREE_OBJECTID)
|
||||
flags = BTRFS_BLOCK_GROUP_SYSTEM;
|
||||
@ -2063,7 +2065,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
|
||||
btrfs_ref_tree_mod(fs_info, generic_ref);
|
||||
|
||||
if (ret == 0 && old_ref_mod < 0 && new_ref_mod >= 0)
|
||||
add_pinned_bytes(fs_info, generic_ref);
|
||||
add_pinned_bytes(fs_info, generic_ref, -1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -3882,8 +3884,7 @@ static int create_space_info(struct btrfs_fs_info *info, u64 flags)
|
||||
info->space_info_kobj, "%s",
|
||||
alloc_name(space_info->flags));
|
||||
if (ret) {
|
||||
percpu_counter_destroy(&space_info->total_bytes_pinned);
|
||||
kfree(space_info);
|
||||
kobject_put(&space_info->kobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -7190,7 +7191,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
|
||||
}
|
||||
out:
|
||||
if (pin)
|
||||
add_pinned_bytes(fs_info, &generic_ref);
|
||||
add_pinned_bytes(fs_info, &generic_ref, 1);
|
||||
|
||||
if (last_ref) {
|
||||
/*
|
||||
@ -7238,7 +7239,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref)
|
||||
btrfs_ref_tree_mod(fs_info, ref);
|
||||
|
||||
if (ret == 0 && old_ref_mod >= 0 && new_ref_mod < 0)
|
||||
add_pinned_bytes(fs_info, ref);
|
||||
add_pinned_bytes(fs_info, ref, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -2067,6 +2067,18 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
int ret = 0, err;
|
||||
u64 len;
|
||||
|
||||
/*
|
||||
* If the inode needs a full sync, make sure we use a full range to
|
||||
* avoid log tree corruption, due to hole detection racing with ordered
|
||||
* extent completion for adjacent ranges, and assertion failures during
|
||||
* hole detection.
|
||||
*/
|
||||
if (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
|
||||
&BTRFS_I(inode)->runtime_flags)) {
|
||||
start = 0;
|
||||
end = LLONG_MAX;
|
||||
}
|
||||
|
||||
/*
|
||||
* The range length can be represented by u64, we have to do the typecasts
|
||||
* to avoid signed overflow if it's [0, LLONG_MAX] eg. from fsync()
|
||||
@ -2554,10 +2566,8 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
||||
|
||||
ret = btrfs_punch_hole_lock_range(inode, lockstart, lockend,
|
||||
&cached_state);
|
||||
if (ret) {
|
||||
inode_unlock(inode);
|
||||
if (ret)
|
||||
goto out_only_mutex;
|
||||
}
|
||||
|
||||
path = btrfs_alloc_path();
|
||||
if (!path) {
|
||||
|
@ -332,6 +332,7 @@ static int inherit_props(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
int ret;
|
||||
int i;
|
||||
bool need_reserve = false;
|
||||
|
||||
if (!test_bit(BTRFS_INODE_HAS_PROPS,
|
||||
&BTRFS_I(parent)->runtime_flags))
|
||||
@ -357,11 +358,20 @@ static int inherit_props(struct btrfs_trans_handle *trans,
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
|
||||
ret = btrfs_block_rsv_add(root, trans->block_rsv,
|
||||
num_bytes, BTRFS_RESERVE_NO_FLUSH);
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Currently callers should be reserving 1 item for properties,
|
||||
* since we only have 1 property that we currently support. If
|
||||
* we add more in the future we need to try and reserve more
|
||||
* space for them. But we should also revisit how we do space
|
||||
* reservations if we do add more properties in the future.
|
||||
*/
|
||||
if (need_reserve) {
|
||||
num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
|
||||
ret = btrfs_block_rsv_add(root, trans->block_rsv,
|
||||
num_bytes, BTRFS_RESERVE_NO_FLUSH);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = btrfs_setxattr(trans, inode, h->xattr_name, value,
|
||||
strlen(value), 0);
|
||||
@ -375,9 +385,13 @@ static int inherit_props(struct btrfs_trans_handle *trans,
|
||||
&BTRFS_I(inode)->runtime_flags);
|
||||
}
|
||||
|
||||
btrfs_block_rsv_release(fs_info, trans->block_rsv, num_bytes);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (need_reserve) {
|
||||
btrfs_block_rsv_release(fs_info, trans->block_rsv,
|
||||
num_bytes);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
need_reserve = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -132,10 +132,8 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
|
||||
return -ENOMEM;
|
||||
|
||||
ret = btrfs_search_slot(trans, root, key, path, 0, 1);
|
||||
if (ret < 0) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ret > 0) {
|
||||
btrfs_crit(fs_info,
|
||||
|
@ -825,7 +825,12 @@ int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs,
|
||||
fs_devs->fsid_kobj.kset = btrfs_kset;
|
||||
error = kobject_init_and_add(&fs_devs->fsid_kobj,
|
||||
&btrfs_ktype, parent, "%pU", fs_devs->fsid);
|
||||
return error;
|
||||
if (error) {
|
||||
kobject_put(&fs_devs->fsid_kobj);
|
||||
return error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info)
|
||||
|
@ -107,8 +107,26 @@ static void file_extent_err(const struct extent_buffer *eb, int slot,
|
||||
(!IS_ALIGNED(btrfs_file_extent_##name((leaf), (fi)), (alignment))); \
|
||||
})
|
||||
|
||||
static u64 file_extent_end(struct extent_buffer *leaf,
|
||||
struct btrfs_key *key,
|
||||
struct btrfs_file_extent_item *extent)
|
||||
{
|
||||
u64 end;
|
||||
u64 len;
|
||||
|
||||
if (btrfs_file_extent_type(leaf, extent) == BTRFS_FILE_EXTENT_INLINE) {
|
||||
len = btrfs_file_extent_ram_bytes(leaf, extent);
|
||||
end = ALIGN(key->offset + len, leaf->fs_info->sectorsize);
|
||||
} else {
|
||||
len = btrfs_file_extent_num_bytes(leaf, extent);
|
||||
end = key->offset + len;
|
||||
}
|
||||
return end;
|
||||
}
|
||||
|
||||
static int check_extent_data_item(struct extent_buffer *leaf,
|
||||
struct btrfs_key *key, int slot)
|
||||
struct btrfs_key *key, int slot,
|
||||
struct btrfs_key *prev_key)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = leaf->fs_info;
|
||||
struct btrfs_file_extent_item *fi;
|
||||
@ -188,6 +206,28 @@ static int check_extent_data_item(struct extent_buffer *leaf,
|
||||
CHECK_FE_ALIGNED(leaf, slot, fi, offset, sectorsize) ||
|
||||
CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize))
|
||||
return -EUCLEAN;
|
||||
|
||||
/*
|
||||
* Check that no two consecutive file extent items, in the same leaf,
|
||||
* present ranges that overlap each other.
|
||||
*/
|
||||
if (slot > 0 &&
|
||||
prev_key->objectid == key->objectid &&
|
||||
prev_key->type == BTRFS_EXTENT_DATA_KEY) {
|
||||
struct btrfs_file_extent_item *prev_fi;
|
||||
u64 prev_end;
|
||||
|
||||
prev_fi = btrfs_item_ptr(leaf, slot - 1,
|
||||
struct btrfs_file_extent_item);
|
||||
prev_end = file_extent_end(leaf, prev_key, prev_fi);
|
||||
if (prev_end > key->offset) {
|
||||
file_extent_err(leaf, slot - 1,
|
||||
"file extent end range (%llu) goes beyond start offset (%llu) of the next file extent",
|
||||
prev_end, key->offset);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -774,14 +814,15 @@ static int check_inode_item(struct extent_buffer *leaf,
|
||||
* Common point to switch the item-specific validation.
|
||||
*/
|
||||
static int check_leaf_item(struct extent_buffer *leaf,
|
||||
struct btrfs_key *key, int slot)
|
||||
struct btrfs_key *key, int slot,
|
||||
struct btrfs_key *prev_key)
|
||||
{
|
||||
int ret = 0;
|
||||
struct btrfs_chunk *chunk;
|
||||
|
||||
switch (key->type) {
|
||||
case BTRFS_EXTENT_DATA_KEY:
|
||||
ret = check_extent_data_item(leaf, key, slot);
|
||||
ret = check_extent_data_item(leaf, key, slot, prev_key);
|
||||
break;
|
||||
case BTRFS_EXTENT_CSUM_KEY:
|
||||
ret = check_csum_item(leaf, key, slot);
|
||||
@ -928,7 +969,7 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
|
||||
* Check if the item size and content meet other
|
||||
* criteria
|
||||
*/
|
||||
ret = check_leaf_item(leaf, &key, slot);
|
||||
ret = check_leaf_item(leaf, &key, slot, &prev_key);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
@ -4182,6 +4182,7 @@ fill_holes:
|
||||
*last_extent, 0,
|
||||
0, len, 0, len,
|
||||
0, 0, 0);
|
||||
*last_extent += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ struct bpf_map_ops {
|
||||
void (*map_free)(struct bpf_map *map);
|
||||
int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key);
|
||||
void (*map_release_uref)(struct bpf_map *map);
|
||||
void *(*map_lookup_elem_sys_only)(struct bpf_map *map, void *key);
|
||||
|
||||
/* funcs callable from userspace and from eBPF programs */
|
||||
void *(*map_lookup_elem)(struct bpf_map *map, void *key);
|
||||
|
@ -51,13 +51,13 @@ void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
|
||||
u8 rep_type);
|
||||
void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport_num,
|
||||
u8 rep_type);
|
||||
struct mlx5_eswitch_rep *mlx5_eswitch_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport);
|
||||
u16 vport_num);
|
||||
void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
u8 mlx5_eswitch_mode(struct mlx5_eswitch *esw);
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw,
|
||||
int vport, u32 sqn);
|
||||
u16 vport_num, u32 sqn);
|
||||
#endif
|
||||
|
@ -22,7 +22,7 @@ static inline int of_get_phy_mode(struct device_node *np)
|
||||
|
||||
static inline const void *of_get_mac_address(struct device_node *np)
|
||||
{
|
||||
return NULL;
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
|
||||
|
@ -84,7 +84,7 @@ struct bucket_table {
|
||||
|
||||
struct lockdep_map dep_map;
|
||||
|
||||
struct rhash_lock_head __rcu *buckets[] ____cacheline_aligned_in_smp;
|
||||
struct rhash_lock_head *buckets[] ____cacheline_aligned_in_smp;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -261,13 +261,13 @@ void rhashtable_free_and_destroy(struct rhashtable *ht,
|
||||
void *arg);
|
||||
void rhashtable_destroy(struct rhashtable *ht);
|
||||
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
struct rhash_lock_head __rcu **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
struct rhash_lock_head **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
struct rhash_lock_head **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
struct rhash_lock_head **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash);
|
||||
|
||||
#define rht_dereference(p, ht) \
|
||||
rcu_dereference_protected(p, lockdep_rht_mutex_is_held(ht))
|
||||
@ -284,21 +284,21 @@ struct rhash_lock_head __rcu **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
#define rht_entry(tpos, pos, member) \
|
||||
({ tpos = container_of(pos, typeof(*tpos), member); 1; })
|
||||
|
||||
static inline struct rhash_lock_head __rcu *const *rht_bucket(
|
||||
static inline struct rhash_lock_head *const *rht_bucket(
|
||||
const struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
return unlikely(tbl->nest) ? rht_bucket_nested(tbl, hash) :
|
||||
&tbl->buckets[hash];
|
||||
}
|
||||
|
||||
static inline struct rhash_lock_head __rcu **rht_bucket_var(
|
||||
static inline struct rhash_lock_head **rht_bucket_var(
|
||||
struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
return unlikely(tbl->nest) ? __rht_bucket_nested(tbl, hash) :
|
||||
&tbl->buckets[hash];
|
||||
}
|
||||
|
||||
static inline struct rhash_lock_head __rcu **rht_bucket_insert(
|
||||
static inline struct rhash_lock_head **rht_bucket_insert(
|
||||
struct rhashtable *ht, struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
return unlikely(tbl->nest) ? rht_bucket_nested_insert(ht, tbl, hash) :
|
||||
@ -349,6 +349,12 @@ static inline void rht_unlock(struct bucket_table *tbl,
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
static inline struct rhash_head __rcu *__rht_ptr(
|
||||
struct rhash_lock_head *const *bkt)
|
||||
{
|
||||
return (struct rhash_head __rcu *)((unsigned long)*bkt & ~BIT(0));
|
||||
}
|
||||
|
||||
/*
|
||||
* Where 'bkt' is a bucket and might be locked:
|
||||
* rht_ptr() dereferences that pointer and clears the lock bit.
|
||||
@ -356,30 +362,30 @@ static inline void rht_unlock(struct bucket_table *tbl,
|
||||
* access is guaranteed, such as when destroying the table.
|
||||
*/
|
||||
static inline struct rhash_head *rht_ptr(
|
||||
struct rhash_lock_head __rcu * const *bkt,
|
||||
struct rhash_lock_head *const *bkt,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
{
|
||||
const struct rhash_lock_head *p =
|
||||
rht_dereference_bucket_rcu(*bkt, tbl, hash);
|
||||
|
||||
if ((((unsigned long)p) & ~BIT(0)) == 0)
|
||||
return RHT_NULLS_MARKER(bkt);
|
||||
return (void *)(((unsigned long)p) & ~BIT(0));
|
||||
}
|
||||
|
||||
static inline struct rhash_head *rht_ptr_exclusive(
|
||||
struct rhash_lock_head __rcu * const *bkt)
|
||||
{
|
||||
const struct rhash_lock_head *p =
|
||||
rcu_dereference_protected(*bkt, 1);
|
||||
struct rhash_head __rcu *p = __rht_ptr(bkt);
|
||||
|
||||
if (!p)
|
||||
return RHT_NULLS_MARKER(bkt);
|
||||
return (void *)(((unsigned long)p) & ~BIT(0));
|
||||
|
||||
return rht_dereference_bucket_rcu(p, tbl, hash);
|
||||
}
|
||||
|
||||
static inline void rht_assign_locked(struct rhash_lock_head __rcu **bkt,
|
||||
static inline struct rhash_head *rht_ptr_exclusive(
|
||||
struct rhash_lock_head *const *bkt)
|
||||
{
|
||||
struct rhash_head __rcu *p = __rht_ptr(bkt);
|
||||
|
||||
if (!p)
|
||||
return RHT_NULLS_MARKER(bkt);
|
||||
|
||||
return rcu_dereference_protected(p, 1);
|
||||
}
|
||||
|
||||
static inline void rht_assign_locked(struct rhash_lock_head **bkt,
|
||||
struct rhash_head *obj)
|
||||
{
|
||||
struct rhash_head __rcu **p = (struct rhash_head __rcu **)bkt;
|
||||
@ -390,7 +396,7 @@ static inline void rht_assign_locked(struct rhash_lock_head __rcu **bkt,
|
||||
}
|
||||
|
||||
static inline void rht_assign_unlock(struct bucket_table *tbl,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct rhash_head *obj)
|
||||
{
|
||||
struct rhash_head __rcu **p = (struct rhash_head __rcu **)bkt;
|
||||
@ -587,7 +593,7 @@ static inline struct rhash_head *__rhashtable_lookup(
|
||||
.ht = ht,
|
||||
.key = key,
|
||||
};
|
||||
struct rhash_lock_head __rcu * const *bkt;
|
||||
struct rhash_lock_head *const *bkt;
|
||||
struct bucket_table *tbl;
|
||||
struct rhash_head *he;
|
||||
unsigned int hash;
|
||||
@ -703,7 +709,7 @@ static inline void *__rhashtable_insert_fast(
|
||||
.ht = ht,
|
||||
.key = key,
|
||||
};
|
||||
struct rhash_lock_head __rcu **bkt;
|
||||
struct rhash_lock_head **bkt;
|
||||
struct rhash_head __rcu **pprev;
|
||||
struct bucket_table *tbl;
|
||||
struct rhash_head *head;
|
||||
@ -989,7 +995,7 @@ static inline int __rhashtable_remove_fast_one(
|
||||
struct rhash_head *obj, const struct rhashtable_params params,
|
||||
bool rhlist)
|
||||
{
|
||||
struct rhash_lock_head __rcu **bkt;
|
||||
struct rhash_lock_head **bkt;
|
||||
struct rhash_head __rcu **pprev;
|
||||
struct rhash_head *he;
|
||||
unsigned int hash;
|
||||
@ -1141,7 +1147,7 @@ static inline int __rhashtable_replace_fast(
|
||||
struct rhash_head *obj_old, struct rhash_head *obj_new,
|
||||
const struct rhashtable_params params)
|
||||
{
|
||||
struct rhash_lock_head __rcu **bkt;
|
||||
struct rhash_lock_head **bkt;
|
||||
struct rhash_head __rcu **pprev;
|
||||
struct rhash_head *he;
|
||||
unsigned int hash;
|
||||
|
@ -1434,10 +1434,12 @@ static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy)
|
||||
struct ubuf_info *uarg = skb_zcopy(skb);
|
||||
|
||||
if (uarg) {
|
||||
if (uarg->callback == sock_zerocopy_callback) {
|
||||
if (skb_zcopy_is_nouarg(skb)) {
|
||||
/* no notification callback */
|
||||
} else if (uarg->callback == sock_zerocopy_callback) {
|
||||
uarg->zerocopy = uarg->zerocopy && zerocopy;
|
||||
sock_zerocopy_put(uarg);
|
||||
} else if (!skb_zcopy_is_nouarg(skb)) {
|
||||
} else {
|
||||
uarg->callback(uarg, zerocopy);
|
||||
}
|
||||
|
||||
@ -2691,7 +2693,8 @@ static inline int skb_orphan_frags(struct sk_buff *skb, gfp_t gfp_mask)
|
||||
{
|
||||
if (likely(!skb_zcopy(skb)))
|
||||
return 0;
|
||||
if (skb_uarg(skb)->callback == sock_zerocopy_callback)
|
||||
if (!skb_zcopy_is_nouarg(skb) &&
|
||||
skb_uarg(skb)->callback == sock_zerocopy_callback)
|
||||
return 0;
|
||||
return skb_copy_ubufs(skb, gfp_mask);
|
||||
}
|
||||
|
@ -71,6 +71,8 @@ void flow_rule_match_eth_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_eth_addrs *out);
|
||||
void flow_rule_match_vlan(const struct flow_rule *rule,
|
||||
struct flow_match_vlan *out);
|
||||
void flow_rule_match_cvlan(const struct flow_rule *rule,
|
||||
struct flow_match_vlan *out);
|
||||
void flow_rule_match_ipv4_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv4_addrs *out);
|
||||
void flow_rule_match_ipv6_addrs(const struct flow_rule *rule,
|
||||
|
@ -167,7 +167,8 @@ struct fib6_info {
|
||||
dst_nocount:1,
|
||||
dst_nopolicy:1,
|
||||
dst_host:1,
|
||||
unused:3;
|
||||
fib6_destroying:1,
|
||||
unused:2;
|
||||
|
||||
struct fib6_nh fib6_nh;
|
||||
struct rcu_head rcu;
|
||||
|
@ -1473,7 +1473,7 @@ static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
|
||||
sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
|
||||
sk->sk_wmem_queued -= skb->truesize;
|
||||
sk_mem_uncharge(sk, skb->truesize);
|
||||
if (!sk->sk_tx_skb_cache) {
|
||||
if (!sk->sk_tx_skb_cache && !skb_cloned(skb)) {
|
||||
skb_zcopy_clear(skb, true);
|
||||
sk->sk_tx_skb_cache = skb;
|
||||
return;
|
||||
|
@ -83,7 +83,7 @@ struct btf_type {
|
||||
* is the 32 bits arrangement:
|
||||
*/
|
||||
#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL & 0x00ff0000)) >> 16)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
|
||||
#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
|
||||
|
||||
/* Attributes stored in the BTF_INT_ENCODING */
|
||||
|
@ -164,6 +164,9 @@ static void dev_map_free(struct bpf_map *map)
|
||||
bpf_clear_redirect_map(map);
|
||||
synchronize_rcu();
|
||||
|
||||
/* Make sure prior __dev_map_entry_free() have completed. */
|
||||
rcu_barrier();
|
||||
|
||||
/* To ensure all pending flush operations have completed wait for flush
|
||||
* bitmap to indicate all flush_needed bits to be zero on _all_ cpus.
|
||||
* Because the above synchronize_rcu() ensures the map is disconnected
|
||||
|
@ -527,18 +527,30 @@ static u32 htab_map_gen_lookup(struct bpf_map *map, struct bpf_insn *insn_buf)
|
||||
return insn - insn_buf;
|
||||
}
|
||||
|
||||
static void *htab_lru_map_lookup_elem(struct bpf_map *map, void *key)
|
||||
static __always_inline void *__htab_lru_map_lookup_elem(struct bpf_map *map,
|
||||
void *key, const bool mark)
|
||||
{
|
||||
struct htab_elem *l = __htab_map_lookup_elem(map, key);
|
||||
|
||||
if (l) {
|
||||
bpf_lru_node_set_ref(&l->lru_node);
|
||||
if (mark)
|
||||
bpf_lru_node_set_ref(&l->lru_node);
|
||||
return l->key + round_up(map->key_size, 8);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *htab_lru_map_lookup_elem(struct bpf_map *map, void *key)
|
||||
{
|
||||
return __htab_lru_map_lookup_elem(map, key, true);
|
||||
}
|
||||
|
||||
static void *htab_lru_map_lookup_elem_sys(struct bpf_map *map, void *key)
|
||||
{
|
||||
return __htab_lru_map_lookup_elem(map, key, false);
|
||||
}
|
||||
|
||||
static u32 htab_lru_map_gen_lookup(struct bpf_map *map,
|
||||
struct bpf_insn *insn_buf)
|
||||
{
|
||||
@ -1250,6 +1262,7 @@ const struct bpf_map_ops htab_lru_map_ops = {
|
||||
.map_free = htab_map_free,
|
||||
.map_get_next_key = htab_map_get_next_key,
|
||||
.map_lookup_elem = htab_lru_map_lookup_elem,
|
||||
.map_lookup_elem_sys_only = htab_lru_map_lookup_elem_sys,
|
||||
.map_update_elem = htab_lru_map_update_elem,
|
||||
.map_delete_elem = htab_lru_map_delete_elem,
|
||||
.map_gen_lookup = htab_lru_map_gen_lookup,
|
||||
@ -1281,7 +1294,6 @@ static void *htab_lru_percpu_map_lookup_elem(struct bpf_map *map, void *key)
|
||||
|
||||
int bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value)
|
||||
{
|
||||
struct bpf_htab *htab = container_of(map, struct bpf_htab, map);
|
||||
struct htab_elem *l;
|
||||
void __percpu *pptr;
|
||||
int ret = -ENOENT;
|
||||
@ -1297,8 +1309,9 @@ int bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value)
|
||||
l = __htab_map_lookup_elem(map, key);
|
||||
if (!l)
|
||||
goto out;
|
||||
if (htab_is_lru(htab))
|
||||
bpf_lru_node_set_ref(&l->lru_node);
|
||||
/* We do not mark LRU map element here in order to not mess up
|
||||
* eviction heuristics when user space does a map walk.
|
||||
*/
|
||||
pptr = htab_elem_get_ptr(l, map->key_size);
|
||||
for_each_possible_cpu(cpu) {
|
||||
bpf_long_memcpy(value + off,
|
||||
|
@ -518,7 +518,7 @@ out:
|
||||
static struct bpf_prog *__get_prog_inode(struct inode *inode, enum bpf_prog_type type)
|
||||
{
|
||||
struct bpf_prog *prog;
|
||||
int ret = inode_permission(inode, MAY_READ | MAY_WRITE);
|
||||
int ret = inode_permission(inode, MAY_READ);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
|
@ -808,7 +808,10 @@ static int map_lookup_elem(union bpf_attr *attr)
|
||||
err = map->ops->map_peek_elem(map, value);
|
||||
} else {
|
||||
rcu_read_lock();
|
||||
ptr = map->ops->map_lookup_elem(map, key);
|
||||
if (map->ops->map_lookup_elem_sys_only)
|
||||
ptr = map->ops->map_lookup_elem_sys_only(map, key);
|
||||
else
|
||||
ptr = map->ops->map_lookup_elem(map, key);
|
||||
if (IS_ERR(ptr)) {
|
||||
err = PTR_ERR(ptr);
|
||||
} else if (!ptr) {
|
||||
|
@ -1297,7 +1297,8 @@ int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
int bpf_event_notify(struct notifier_block *nb, unsigned long op, void *module)
|
||||
static int bpf_event_notify(struct notifier_block *nb, unsigned long op,
|
||||
void *module)
|
||||
{
|
||||
struct bpf_trace_module *btm, *tmp;
|
||||
struct module *mod = module;
|
||||
@ -1336,7 +1337,7 @@ static struct notifier_block bpf_module_nb = {
|
||||
.notifier_call = bpf_event_notify,
|
||||
};
|
||||
|
||||
int __init bpf_event_init(void)
|
||||
static int __init bpf_event_init(void)
|
||||
{
|
||||
register_module_notifier(&bpf_module_nb);
|
||||
return 0;
|
||||
|
@ -171,9 +171,9 @@ static void prandom_seed_early(struct rnd_state *state, u32 seed,
|
||||
|
||||
/**
|
||||
* prandom_seed - add entropy to pseudo random number generator
|
||||
* @seed: seed value
|
||||
* @entropy: entropy value
|
||||
*
|
||||
* Add some additional seeding to the prandom pool.
|
||||
* Add some additional entropy to the prandom pool.
|
||||
*/
|
||||
void prandom_seed(u32 entropy)
|
||||
{
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
union nested_table {
|
||||
union nested_table __rcu *table;
|
||||
struct rhash_lock_head __rcu *bucket;
|
||||
struct rhash_lock_head *bucket;
|
||||
};
|
||||
|
||||
static u32 head_hashfn(struct rhashtable *ht,
|
||||
@ -131,7 +131,7 @@ static union nested_table *nested_table_alloc(struct rhashtable *ht,
|
||||
INIT_RHT_NULLS_HEAD(ntbl[i].bucket);
|
||||
}
|
||||
|
||||
if (cmpxchg(prev, NULL, ntbl) == NULL)
|
||||
if (cmpxchg((union nested_table **)prev, NULL, ntbl) == NULL)
|
||||
return ntbl;
|
||||
/* Raced with another thread. */
|
||||
kfree(ntbl);
|
||||
@ -216,7 +216,7 @@ static struct bucket_table *rhashtable_last_table(struct rhashtable *ht,
|
||||
}
|
||||
|
||||
static int rhashtable_rehash_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
struct rhash_lock_head **bkt,
|
||||
unsigned int old_hash)
|
||||
{
|
||||
struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
|
||||
@ -269,7 +269,7 @@ static int rhashtable_rehash_chain(struct rhashtable *ht,
|
||||
unsigned int old_hash)
|
||||
{
|
||||
struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
|
||||
struct rhash_lock_head __rcu **bkt = rht_bucket_var(old_tbl, old_hash);
|
||||
struct rhash_lock_head **bkt = rht_bucket_var(old_tbl, old_hash);
|
||||
int err;
|
||||
|
||||
if (!bkt)
|
||||
@ -296,7 +296,8 @@ static int rhashtable_rehash_attach(struct rhashtable *ht,
|
||||
* rcu_assign_pointer().
|
||||
*/
|
||||
|
||||
if (cmpxchg(&old_tbl->future_tbl, NULL, new_tbl) != NULL)
|
||||
if (cmpxchg((struct bucket_table **)&old_tbl->future_tbl, NULL,
|
||||
new_tbl) != NULL)
|
||||
return -EEXIST;
|
||||
|
||||
return 0;
|
||||
@ -478,7 +479,7 @@ fail:
|
||||
}
|
||||
|
||||
static void *rhashtable_lookup_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct bucket_table *tbl, unsigned int hash,
|
||||
const void *key, struct rhash_head *obj)
|
||||
{
|
||||
@ -529,7 +530,7 @@ static void *rhashtable_lookup_one(struct rhashtable *ht,
|
||||
}
|
||||
|
||||
static struct bucket_table *rhashtable_insert_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash,
|
||||
struct rhash_head *obj,
|
||||
@ -584,7 +585,7 @@ static void *rhashtable_try_insert(struct rhashtable *ht, const void *key,
|
||||
{
|
||||
struct bucket_table *new_tbl;
|
||||
struct bucket_table *tbl;
|
||||
struct rhash_lock_head __rcu **bkt;
|
||||
struct rhash_lock_head **bkt;
|
||||
unsigned int hash;
|
||||
void *data;
|
||||
|
||||
@ -1166,8 +1167,8 @@ void rhashtable_destroy(struct rhashtable *ht)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rhashtable_destroy);
|
||||
|
||||
struct rhash_lock_head __rcu **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
{
|
||||
const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
|
||||
unsigned int index = hash & ((1 << tbl->nest) - 1);
|
||||
@ -1195,10 +1196,10 @@ struct rhash_lock_head __rcu **__rht_bucket_nested(const struct bucket_table *tb
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__rht_bucket_nested);
|
||||
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
{
|
||||
static struct rhash_lock_head __rcu *rhnull;
|
||||
static struct rhash_lock_head *rhnull;
|
||||
|
||||
if (!rhnull)
|
||||
INIT_RHT_NULLS_HEAD(rhnull);
|
||||
@ -1206,9 +1207,9 @@ struct rhash_lock_head __rcu **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rht_bucket_nested);
|
||||
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
{
|
||||
const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
|
||||
unsigned int index = hash & ((1 << tbl->nest) - 1);
|
||||
|
@ -26,7 +26,7 @@ struct cflayer *cfdbgl_create(u8 channel_id, struct dev_info *dev_info)
|
||||
cfsrvl_init(dbg, channel_id, dev_info, false);
|
||||
dbg->layer.receive = cfdbgl_receive;
|
||||
dbg->layer.transmit = cfdbgl_transmit;
|
||||
snprintf(dbg->layer.name, CAIF_LAYER_NAME_SZ - 1, "dbg%d", channel_id);
|
||||
snprintf(dbg->layer.name, CAIF_LAYER_NAME_SZ, "dbg%d", channel_id);
|
||||
return &dbg->layer;
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,7 @@ struct cflayer *cfdgml_create(u8 channel_id, struct dev_info *dev_info)
|
||||
cfsrvl_init(dgm, channel_id, dev_info, true);
|
||||
dgm->layer.receive = cfdgml_receive;
|
||||
dgm->layer.transmit = cfdgml_transmit;
|
||||
snprintf(dgm->layer.name, CAIF_LAYER_NAME_SZ - 1, "dgm%d", channel_id);
|
||||
dgm->layer.name[CAIF_LAYER_NAME_SZ - 1] = '\0';
|
||||
snprintf(dgm->layer.name, CAIF_LAYER_NAME_SZ, "dgm%d", channel_id);
|
||||
return &dgm->layer;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ struct cflayer *cfutill_create(u8 channel_id, struct dev_info *dev_info)
|
||||
cfsrvl_init(util, channel_id, dev_info, true);
|
||||
util->layer.receive = cfutill_receive;
|
||||
util->layer.transmit = cfutill_transmit;
|
||||
snprintf(util->layer.name, CAIF_LAYER_NAME_SZ - 1, "util1");
|
||||
snprintf(util->layer.name, CAIF_LAYER_NAME_SZ, "util1");
|
||||
return &util->layer;
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ struct cflayer *cfvei_create(u8 channel_id, struct dev_info *dev_info)
|
||||
cfsrvl_init(vei, channel_id, dev_info, true);
|
||||
vei->layer.receive = cfvei_receive;
|
||||
vei->layer.transmit = cfvei_transmit;
|
||||
snprintf(vei->layer.name, CAIF_LAYER_NAME_SZ - 1, "vei%d", channel_id);
|
||||
snprintf(vei->layer.name, CAIF_LAYER_NAME_SZ, "vei%d", channel_id);
|
||||
return &vei->layer;
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ struct cflayer *cfvidl_create(u8 channel_id, struct dev_info *dev_info)
|
||||
cfsrvl_init(vid, channel_id, dev_info, false);
|
||||
vid->layer.receive = cfvidl_receive;
|
||||
vid->layer.transmit = cfvidl_transmit;
|
||||
snprintf(vid->layer.name, CAIF_LAYER_NAME_SZ - 1, "vid1");
|
||||
snprintf(vid->layer.name, CAIF_LAYER_NAME_SZ, "vid1");
|
||||
return &vid->layer;
|
||||
}
|
||||
|
||||
|
@ -8927,7 +8927,7 @@ static void netdev_wait_allrefs(struct net_device *dev)
|
||||
|
||||
refcnt = netdev_refcnt_read(dev);
|
||||
|
||||
if (time_after(jiffies, warning_time + 10 * HZ)) {
|
||||
if (refcnt && time_after(jiffies, warning_time + 10 * HZ)) {
|
||||
pr_emerg("unregister_netdevice: waiting for %s to become free. Usage count = %d\n",
|
||||
dev->name, refcnt);
|
||||
warning_time = jiffies;
|
||||
|
@ -54,6 +54,13 @@ void flow_rule_match_vlan(const struct flow_rule *rule,
|
||||
}
|
||||
EXPORT_SYMBOL(flow_rule_match_vlan);
|
||||
|
||||
void flow_rule_match_cvlan(const struct flow_rule *rule,
|
||||
struct flow_match_vlan *out)
|
||||
{
|
||||
FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_CVLAN, out);
|
||||
}
|
||||
EXPORT_SYMBOL(flow_rule_match_cvlan);
|
||||
|
||||
void flow_rule_match_ipv4_addrs(const struct flow_rule *rule,
|
||||
struct flow_match_ipv4_addrs *out)
|
||||
{
|
||||
|
@ -1496,14 +1496,15 @@ static int put_master_ifindex(struct sk_buff *skb, struct net_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev)
|
||||
static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev,
|
||||
bool force)
|
||||
{
|
||||
int ifindex = dev_get_iflink(dev);
|
||||
|
||||
if (dev->ifindex == ifindex)
|
||||
return 0;
|
||||
if (force || dev->ifindex != ifindex)
|
||||
return nla_put_u32(skb, IFLA_LINK, ifindex);
|
||||
|
||||
return nla_put_u32(skb, IFLA_LINK, ifindex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static noinline_for_stack int nla_put_ifalias(struct sk_buff *skb,
|
||||
@ -1520,6 +1521,8 @@ static int rtnl_fill_link_netnsid(struct sk_buff *skb,
|
||||
const struct net_device *dev,
|
||||
struct net *src_net)
|
||||
{
|
||||
bool put_iflink = false;
|
||||
|
||||
if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) {
|
||||
struct net *link_net = dev->rtnl_link_ops->get_link_net(dev);
|
||||
|
||||
@ -1528,10 +1531,12 @@ static int rtnl_fill_link_netnsid(struct sk_buff *skb,
|
||||
|
||||
if (nla_put_s32(skb, IFLA_LINK_NETNSID, id))
|
||||
return -EMSGSIZE;
|
||||
|
||||
put_iflink = true;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return nla_put_iflink(skb, dev, put_iflink);
|
||||
}
|
||||
|
||||
static int rtnl_fill_link_af(struct sk_buff *skb,
|
||||
@ -1617,7 +1622,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
||||
#ifdef CONFIG_RPS
|
||||
nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) ||
|
||||
#endif
|
||||
nla_put_iflink(skb, dev) ||
|
||||
put_master_ifindex(skb, dev) ||
|
||||
nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) ||
|
||||
(dev->qdisc &&
|
||||
|
@ -411,6 +411,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)
|
||||
sk_mem_charge(sk, skb->len);
|
||||
copied = skb->len;
|
||||
msg->sg.start = 0;
|
||||
msg->sg.size = copied;
|
||||
msg->sg.end = num_sge == MAX_MSG_FRAGS ? 0 : num_sge;
|
||||
msg->skb = skb;
|
||||
|
||||
@ -554,8 +555,10 @@ static void sk_psock_destroy_deferred(struct work_struct *gc)
|
||||
struct sk_psock *psock = container_of(gc, struct sk_psock, gc);
|
||||
|
||||
/* No sk_callback_lock since already detached. */
|
||||
strp_stop(&psock->parser.strp);
|
||||
strp_done(&psock->parser.strp);
|
||||
|
||||
/* Parser has been stopped */
|
||||
if (psock->progs.skb_parser)
|
||||
strp_done(&psock->parser.strp);
|
||||
|
||||
cancel_work_sync(&psock->work);
|
||||
|
||||
|
@ -30,13 +30,11 @@ static int bpfilter_mbox_request(struct sock *sk, int optname,
|
||||
mutex_lock(&bpfilter_ops.lock);
|
||||
if (!bpfilter_ops.sockopt) {
|
||||
mutex_unlock(&bpfilter_ops.lock);
|
||||
err = request_module("bpfilter");
|
||||
request_module("bpfilter");
|
||||
mutex_lock(&bpfilter_ops.lock);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
if (!bpfilter_ops.sockopt) {
|
||||
err = -ECHILD;
|
||||
err = -ENOPROTOOPT;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
@ -1113,7 +1113,7 @@ static void ping_v4_format_sock(struct sock *sp, struct seq_file *f,
|
||||
__u16 srcp = ntohs(inet->inet_sport);
|
||||
|
||||
seq_printf(f, "%5d: %08X:%04X %08X:%04X"
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d",
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u",
|
||||
bucket, src, srcp, dest, destp, sp->sk_state,
|
||||
sk_wmem_alloc_get(sp),
|
||||
sk_rmem_alloc_get(sp),
|
||||
|
@ -1076,7 +1076,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
|
||||
srcp = inet->inet_num;
|
||||
|
||||
seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n",
|
||||
i, src, srcp, dest, destp, sp->sk_state,
|
||||
sk_wmem_alloc_get(sp),
|
||||
sk_rmem_alloc_get(sp),
|
||||
|
@ -855,7 +855,7 @@ struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp,
|
||||
|
||||
if (likely(!size)) {
|
||||
skb = sk->sk_tx_skb_cache;
|
||||
if (skb && !skb_cloned(skb)) {
|
||||
if (skb) {
|
||||
skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
|
||||
sk->sk_tx_skb_cache = NULL;
|
||||
pskb_trim(skb, 0);
|
||||
|
@ -27,7 +27,10 @@ static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock,
|
||||
int flags, long timeo, int *err)
|
||||
{
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (!timeo)
|
||||
return ret;
|
||||
|
||||
add_wait_queue(sk_sleep(sk), &wait);
|
||||
sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
|
||||
@ -528,8 +531,6 @@ static void tcp_bpf_remove(struct sock *sk, struct sk_psock *psock)
|
||||
{
|
||||
struct sk_psock_link *link;
|
||||
|
||||
sk_psock_cork_free(psock);
|
||||
__sk_psock_purge_ingress_msg(psock);
|
||||
while ((link = sk_psock_link_pop(psock))) {
|
||||
sk_psock_unlink(sk, link);
|
||||
sk_psock_free_link(link);
|
||||
|
@ -6024,6 +6024,9 @@ reset_and_undo:
|
||||
static void tcp_rcv_synrecv_state_fastopen(struct sock *sk)
|
||||
{
|
||||
tcp_try_undo_loss(sk, false);
|
||||
|
||||
/* Reset rtx states to prevent spurious retransmits_timed_out() */
|
||||
tcp_sk(sk)->retrans_stamp = 0;
|
||||
inet_csk(sk)->icsk_retransmits = 0;
|
||||
|
||||
/* Once we leave TCP_SYN_RECV or TCP_FIN_WAIT_1,
|
||||
|
@ -2883,7 +2883,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f,
|
||||
__u16 srcp = ntohs(inet->inet_sport);
|
||||
|
||||
seq_printf(f, "%5d: %08X:%04X %08X:%04X"
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d",
|
||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u",
|
||||
bucket, src, srcp, dest, destp, sp->sk_state,
|
||||
sk_wmem_alloc_get(sp),
|
||||
udp_rqueue_get(sp),
|
||||
|
@ -1034,7 +1034,7 @@ void __ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp,
|
||||
src = &sp->sk_v6_rcv_saddr;
|
||||
seq_printf(seq,
|
||||
"%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
|
||||
"%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
|
||||
"%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %u\n",
|
||||
bucket,
|
||||
src->s6_addr32[0], src->s6_addr32[1],
|
||||
src->s6_addr32[2], src->s6_addr32[3], srcp,
|
||||
|
@ -904,6 +904,12 @@ static void fib6_drop_pcpu_from(struct fib6_info *f6i,
|
||||
{
|
||||
int cpu;
|
||||
|
||||
/* Make sure rt6_make_pcpu_route() wont add other percpu routes
|
||||
* while we are cleaning them here.
|
||||
*/
|
||||
f6i->fib6_destroying = 1;
|
||||
mb(); /* paired with the cmpxchg() in rt6_make_pcpu_route() */
|
||||
|
||||
/* release the reference to this fib entry from
|
||||
* all of its cached pcpu routes
|
||||
*/
|
||||
@ -927,6 +933,9 @@ static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn,
|
||||
{
|
||||
struct fib6_table *table = rt->fib6_table;
|
||||
|
||||
if (rt->rt6i_pcpu)
|
||||
fib6_drop_pcpu_from(rt, table);
|
||||
|
||||
if (refcount_read(&rt->fib6_ref) != 1) {
|
||||
/* This route is used as dummy address holder in some split
|
||||
* nodes. It is not leaked, but it still holds other resources,
|
||||
@ -948,9 +957,6 @@ static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn,
|
||||
fn = rcu_dereference_protected(fn->parent,
|
||||
lockdep_is_held(&table->tb6_lock));
|
||||
}
|
||||
|
||||
if (rt->rt6i_pcpu)
|
||||
fib6_drop_pcpu_from(rt, table);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,8 +111,8 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
|
||||
int iif, int type, u32 portid, u32 seq,
|
||||
unsigned int flags);
|
||||
static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
|
||||
struct in6_addr *daddr,
|
||||
struct in6_addr *saddr);
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr);
|
||||
|
||||
#ifdef CONFIG_IPV6_ROUTE_INFO
|
||||
static struct fib6_info *rt6_add_route_info(struct net *net,
|
||||
@ -1295,6 +1295,13 @@ static struct rt6_info *rt6_make_pcpu_route(struct net *net,
|
||||
prev = cmpxchg(p, NULL, pcpu_rt);
|
||||
BUG_ON(prev);
|
||||
|
||||
if (res->f6i->fib6_destroying) {
|
||||
struct fib6_info *from;
|
||||
|
||||
from = xchg((__force struct fib6_info **)&pcpu_rt->from, NULL);
|
||||
fib6_info_release(from);
|
||||
}
|
||||
|
||||
return pcpu_rt;
|
||||
}
|
||||
|
||||
@ -1566,31 +1573,44 @@ out:
|
||||
* Caller has to hold rcu_read_lock()
|
||||
*/
|
||||
static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
|
||||
struct in6_addr *daddr,
|
||||
struct in6_addr *saddr)
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
const struct in6_addr *src_key = NULL;
|
||||
struct rt6_exception_bucket *bucket;
|
||||
struct in6_addr *src_key = NULL;
|
||||
struct rt6_exception *rt6_ex;
|
||||
struct rt6_info *ret = NULL;
|
||||
|
||||
bucket = rcu_dereference(res->f6i->rt6i_exception_bucket);
|
||||
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
/* fib6i_src.plen != 0 indicates f6i is in subtree
|
||||
* and exception table is indexed by a hash of
|
||||
* both fib6_dst and fib6_src.
|
||||
* Otherwise, the exception table is indexed by
|
||||
* a hash of only fib6_dst.
|
||||
* However, the src addr used to create the hash
|
||||
* might not be exactly the passed in saddr which
|
||||
* is a /128 addr from the flow.
|
||||
* So we need to use f6i->fib6_src to redo lookup
|
||||
* if the passed in saddr does not find anything.
|
||||
* (See the logic in ip6_rt_cache_alloc() on how
|
||||
* rt->rt6i_src is updated.)
|
||||
*/
|
||||
if (res->f6i->fib6_src.plen)
|
||||
src_key = saddr;
|
||||
find_ex:
|
||||
#endif
|
||||
bucket = rcu_dereference(res->f6i->rt6i_exception_bucket);
|
||||
rt6_ex = __rt6_find_exception_rcu(&bucket, daddr, src_key);
|
||||
|
||||
if (rt6_ex && !rt6_check_expired(rt6_ex->rt6i))
|
||||
ret = rt6_ex->rt6i;
|
||||
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
/* Use fib6_src as src_key and redo lookup */
|
||||
if (!ret && src_key && src_key != &res->f6i->fib6_src.addr) {
|
||||
src_key = &res->f6i->fib6_src.addr;
|
||||
goto find_ex;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2665,12 +2685,10 @@ u32 ip6_mtu_from_fib6(const struct fib6_result *res,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
struct rt6_exception_bucket *bucket;
|
||||
const struct fib6_nh *nh = res->nh;
|
||||
struct fib6_info *f6i = res->f6i;
|
||||
const struct in6_addr *src_key;
|
||||
struct rt6_exception *rt6_ex;
|
||||
struct inet6_dev *idev;
|
||||
struct rt6_info *rt;
|
||||
u32 mtu = 0;
|
||||
|
||||
if (unlikely(fib6_metric_locked(f6i, RTAX_MTU))) {
|
||||
@ -2679,18 +2697,10 @@ u32 ip6_mtu_from_fib6(const struct fib6_result *res,
|
||||
goto out;
|
||||
}
|
||||
|
||||
src_key = NULL;
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
if (f6i->fib6_src.plen)
|
||||
src_key = saddr;
|
||||
#endif
|
||||
|
||||
bucket = rcu_dereference(f6i->rt6i_exception_bucket);
|
||||
rt6_ex = __rt6_find_exception_rcu(&bucket, daddr, src_key);
|
||||
if (rt6_ex && !rt6_check_expired(rt6_ex->rt6i))
|
||||
mtu = dst_metric_raw(&rt6_ex->rt6i->dst, RTAX_MTU);
|
||||
|
||||
if (likely(!mtu)) {
|
||||
rt = rt6_find_cached_rt(res, daddr, saddr);
|
||||
if (unlikely(rt)) {
|
||||
mtu = dst_metric_raw(&rt->dst, RTAX_MTU);
|
||||
} else {
|
||||
struct net_device *dev = nh->fib_nh_dev;
|
||||
|
||||
mtu = IPV6_MIN_MTU;
|
||||
|
@ -2642,7 +2642,7 @@ static int netlink_seq_show(struct seq_file *seq, void *v)
|
||||
struct sock *s = v;
|
||||
struct netlink_sock *nlk = nlk_sk(s);
|
||||
|
||||
seq_printf(seq, "%pK %-3d %-10u %08x %-8d %-8d %-5d %-8d %-8d %-8lu\n",
|
||||
seq_printf(seq, "%pK %-3d %-10u %08x %-8d %-8d %-5d %-8d %-8u %-8lu\n",
|
||||
s,
|
||||
s->sk_protocol,
|
||||
nlk->portid,
|
||||
|
@ -607,7 +607,7 @@ static int pn_sock_seq_show(struct seq_file *seq, void *v)
|
||||
struct pn_sock *pn = pn_sk(sk);
|
||||
|
||||
seq_printf(seq, "%2d %04X:%04X:%02X %02X %08X:%08X %5d %lu "
|
||||
"%d %pK %d",
|
||||
"%d %pK %u",
|
||||
sk->sk_protocol, pn->sobject, pn->dobject,
|
||||
pn->resource, sk->sk_state,
|
||||
sk_wmem_alloc_get(sk), sk_rmem_alloc_get(sk),
|
||||
|
34
net/socket.c
34
net/socket.c
@ -645,14 +645,6 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
|
||||
}
|
||||
EXPORT_SYMBOL(__sock_tx_timestamp);
|
||||
|
||||
/**
|
||||
* sock_sendmsg - send a message through @sock
|
||||
* @sock: socket
|
||||
* @msg: message to send
|
||||
*
|
||||
* Sends @msg through @sock, passing through LSM.
|
||||
* Returns the number of bytes sent, or an error code.
|
||||
*/
|
||||
INDIRECT_CALLABLE_DECLARE(int inet_sendmsg(struct socket *, struct msghdr *,
|
||||
size_t));
|
||||
static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
|
||||
@ -663,6 +655,14 @@ static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* sock_sendmsg - send a message through @sock
|
||||
* @sock: socket
|
||||
* @msg: message to send
|
||||
*
|
||||
* Sends @msg through @sock, passing through LSM.
|
||||
* Returns the number of bytes sent, or an error code.
|
||||
*/
|
||||
int sock_sendmsg(struct socket *sock, struct msghdr *msg)
|
||||
{
|
||||
int err = security_socket_sendmsg(sock, msg,
|
||||
@ -875,15 +875,6 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
|
||||
|
||||
/**
|
||||
* sock_recvmsg - receive a message from @sock
|
||||
* @sock: socket
|
||||
* @msg: message to receive
|
||||
* @flags: message flags
|
||||
*
|
||||
* Receives @msg from @sock, passing through LSM. Returns the total number
|
||||
* of bytes received, or an error.
|
||||
*/
|
||||
INDIRECT_CALLABLE_DECLARE(int inet_recvmsg(struct socket *, struct msghdr *,
|
||||
size_t , int ));
|
||||
static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
||||
@ -893,6 +884,15 @@ static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
||||
msg_data_left(msg), flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* sock_recvmsg - receive a message from @sock
|
||||
* @sock: socket
|
||||
* @msg: message to receive
|
||||
* @flags: message flags
|
||||
*
|
||||
* Receives @msg from @sock, passing through LSM. Returns the total number
|
||||
* of bytes received, or an error.
|
||||
*/
|
||||
int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags)
|
||||
{
|
||||
int err = security_socket_recvmsg(sock, msg, msg_data_left(msg), flags);
|
||||
|
@ -131,10 +131,6 @@ static int __init tipc_init(void)
|
||||
if (err)
|
||||
goto out_netlink_compat;
|
||||
|
||||
err = tipc_socket_init();
|
||||
if (err)
|
||||
goto out_socket;
|
||||
|
||||
err = tipc_register_sysctl();
|
||||
if (err)
|
||||
goto out_sysctl;
|
||||
@ -143,6 +139,10 @@ static int __init tipc_init(void)
|
||||
if (err)
|
||||
goto out_pernet;
|
||||
|
||||
err = tipc_socket_init();
|
||||
if (err)
|
||||
goto out_socket;
|
||||
|
||||
err = tipc_bearer_setup();
|
||||
if (err)
|
||||
goto out_bearer;
|
||||
@ -150,12 +150,12 @@ static int __init tipc_init(void)
|
||||
pr_info("Started in single node mode\n");
|
||||
return 0;
|
||||
out_bearer:
|
||||
tipc_socket_stop();
|
||||
out_socket:
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
out_pernet:
|
||||
tipc_unregister_sysctl();
|
||||
out_sysctl:
|
||||
tipc_socket_stop();
|
||||
out_socket:
|
||||
tipc_netlink_compat_stop();
|
||||
out_netlink_compat:
|
||||
tipc_netlink_stop();
|
||||
@ -167,10 +167,10 @@ out_netlink:
|
||||
static void __exit tipc_exit(void)
|
||||
{
|
||||
tipc_bearer_cleanup();
|
||||
tipc_socket_stop();
|
||||
unregister_pernet_subsys(&tipc_net_ops);
|
||||
tipc_netlink_stop();
|
||||
tipc_netlink_compat_stop();
|
||||
tipc_socket_stop();
|
||||
tipc_unregister_sysctl();
|
||||
|
||||
pr_info("Deactivated\n");
|
||||
|
@ -35,6 +35,9 @@
|
||||
/* The MTU is 16KB per the host side's design */
|
||||
#define HVS_MTU_SIZE (1024 * 16)
|
||||
|
||||
/* How long to wait for graceful shutdown of a connection */
|
||||
#define HVS_CLOSE_TIMEOUT (8 * HZ)
|
||||
|
||||
struct vmpipe_proto_header {
|
||||
u32 pkt_type;
|
||||
u32 data_size;
|
||||
@ -305,19 +308,32 @@ static void hvs_channel_cb(void *ctx)
|
||||
sk->sk_write_space(sk);
|
||||
}
|
||||
|
||||
static void hvs_do_close_lock_held(struct vsock_sock *vsk,
|
||||
bool cancel_timeout)
|
||||
{
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
|
||||
sock_set_flag(sk, SOCK_DONE);
|
||||
vsk->peer_shutdown = SHUTDOWN_MASK;
|
||||
if (vsock_stream_has_data(vsk) <= 0)
|
||||
sk->sk_state = TCP_CLOSING;
|
||||
sk->sk_state_change(sk);
|
||||
if (vsk->close_work_scheduled &&
|
||||
(!cancel_timeout || cancel_delayed_work(&vsk->close_work))) {
|
||||
vsk->close_work_scheduled = false;
|
||||
vsock_remove_sock(vsk);
|
||||
|
||||
/* Release the reference taken while scheduling the timeout */
|
||||
sock_put(sk);
|
||||
}
|
||||
}
|
||||
|
||||
static void hvs_close_connection(struct vmbus_channel *chan)
|
||||
{
|
||||
struct sock *sk = get_per_channel_state(chan);
|
||||
struct vsock_sock *vsk = vsock_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
sk->sk_state = TCP_CLOSE;
|
||||
sock_set_flag(sk, SOCK_DONE);
|
||||
vsk->peer_shutdown |= SEND_SHUTDOWN | RCV_SHUTDOWN;
|
||||
|
||||
sk->sk_state_change(sk);
|
||||
|
||||
hvs_do_close_lock_held(vsock_sk(sk), true);
|
||||
release_sock(sk);
|
||||
}
|
||||
|
||||
@ -452,50 +468,80 @@ static int hvs_connect(struct vsock_sock *vsk)
|
||||
return vmbus_send_tl_connect_request(&h->vm_srv_id, &h->host_srv_id);
|
||||
}
|
||||
|
||||
static void hvs_shutdown_lock_held(struct hvsock *hvs, int mode)
|
||||
{
|
||||
struct vmpipe_proto_header hdr;
|
||||
|
||||
if (hvs->fin_sent || !hvs->chan)
|
||||
return;
|
||||
|
||||
/* It can't fail: see hvs_channel_writable_bytes(). */
|
||||
(void)hvs_send_data(hvs->chan, (struct hvs_send_buf *)&hdr, 0);
|
||||
hvs->fin_sent = true;
|
||||
}
|
||||
|
||||
static int hvs_shutdown(struct vsock_sock *vsk, int mode)
|
||||
{
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
struct vmpipe_proto_header hdr;
|
||||
struct hvs_send_buf *send_buf;
|
||||
struct hvsock *hvs;
|
||||
|
||||
if (!(mode & SEND_SHUTDOWN))
|
||||
return 0;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
hvs = vsk->trans;
|
||||
if (hvs->fin_sent)
|
||||
goto out;
|
||||
|
||||
send_buf = (struct hvs_send_buf *)&hdr;
|
||||
|
||||
/* It can't fail: see hvs_channel_writable_bytes(). */
|
||||
(void)hvs_send_data(hvs->chan, send_buf, 0);
|
||||
|
||||
hvs->fin_sent = true;
|
||||
out:
|
||||
hvs_shutdown_lock_held(vsk->trans, mode);
|
||||
release_sock(sk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hvs_close_timeout(struct work_struct *work)
|
||||
{
|
||||
struct vsock_sock *vsk =
|
||||
container_of(work, struct vsock_sock, close_work.work);
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
|
||||
sock_hold(sk);
|
||||
lock_sock(sk);
|
||||
if (!sock_flag(sk, SOCK_DONE))
|
||||
hvs_do_close_lock_held(vsk, false);
|
||||
|
||||
vsk->close_work_scheduled = false;
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
}
|
||||
|
||||
/* Returns true, if it is safe to remove socket; false otherwise */
|
||||
static bool hvs_close_lock_held(struct vsock_sock *vsk)
|
||||
{
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
|
||||
if (!(sk->sk_state == TCP_ESTABLISHED ||
|
||||
sk->sk_state == TCP_CLOSING))
|
||||
return true;
|
||||
|
||||
if ((sk->sk_shutdown & SHUTDOWN_MASK) != SHUTDOWN_MASK)
|
||||
hvs_shutdown_lock_held(vsk->trans, SHUTDOWN_MASK);
|
||||
|
||||
if (sock_flag(sk, SOCK_DONE))
|
||||
return true;
|
||||
|
||||
/* This reference will be dropped by the delayed close routine */
|
||||
sock_hold(sk);
|
||||
INIT_DELAYED_WORK(&vsk->close_work, hvs_close_timeout);
|
||||
vsk->close_work_scheduled = true;
|
||||
schedule_delayed_work(&vsk->close_work, HVS_CLOSE_TIMEOUT);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void hvs_release(struct vsock_sock *vsk)
|
||||
{
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
struct hvsock *hvs = vsk->trans;
|
||||
struct vmbus_channel *chan;
|
||||
bool remove_sock;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
sk->sk_state = TCP_CLOSING;
|
||||
vsock_remove_sock(vsk);
|
||||
|
||||
remove_sock = hvs_close_lock_held(vsk);
|
||||
release_sock(sk);
|
||||
|
||||
chan = hvs->chan;
|
||||
if (chan)
|
||||
hvs_shutdown(vsk, RCV_SHUTDOWN | SEND_SHUTDOWN);
|
||||
|
||||
if (remove_sock)
|
||||
vsock_remove_sock(vsk);
|
||||
}
|
||||
|
||||
static void hvs_destruct(struct vsock_sock *vsk)
|
||||
|
@ -702,28 +702,27 @@ static int __init virtio_vsock_init(void)
|
||||
if (!virtio_vsock_workqueue)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = register_virtio_driver(&virtio_vsock_driver);
|
||||
ret = vsock_core_init(&virtio_transport.transport);
|
||||
if (ret)
|
||||
goto out_wq;
|
||||
|
||||
ret = vsock_core_init(&virtio_transport.transport);
|
||||
ret = register_virtio_driver(&virtio_vsock_driver);
|
||||
if (ret)
|
||||
goto out_vdr;
|
||||
goto out_vci;
|
||||
|
||||
return 0;
|
||||
|
||||
out_vdr:
|
||||
unregister_virtio_driver(&virtio_vsock_driver);
|
||||
out_vci:
|
||||
vsock_core_exit();
|
||||
out_wq:
|
||||
destroy_workqueue(virtio_vsock_workqueue);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static void __exit virtio_vsock_exit(void)
|
||||
{
|
||||
vsock_core_exit();
|
||||
unregister_virtio_driver(&virtio_vsock_driver);
|
||||
vsock_core_exit();
|
||||
destroy_workqueue(virtio_vsock_workqueue);
|
||||
}
|
||||
|
||||
|
@ -786,12 +786,19 @@ static bool virtio_transport_close(struct vsock_sock *vsk)
|
||||
|
||||
void virtio_transport_release(struct vsock_sock *vsk)
|
||||
{
|
||||
struct virtio_vsock_sock *vvs = vsk->trans;
|
||||
struct virtio_vsock_pkt *pkt, *tmp;
|
||||
struct sock *sk = &vsk->sk;
|
||||
bool remove_sock = true;
|
||||
|
||||
lock_sock(sk);
|
||||
if (sk->sk_type == SOCK_STREAM)
|
||||
remove_sock = virtio_transport_close(vsk);
|
||||
|
||||
list_for_each_entry_safe(pkt, tmp, &vvs->rx_queue, list) {
|
||||
list_del(&pkt->list);
|
||||
virtio_transport_free_pkt(pkt);
|
||||
}
|
||||
release_sock(sk);
|
||||
|
||||
if (remove_sock)
|
||||
|
@ -3264,7 +3264,8 @@ static void
|
||||
decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
{
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
int ihl = iph->ihl;
|
||||
u8 *xprth = skb_network_header(skb) + ihl * 4;
|
||||
struct flowi4 *fl4 = &fl->u.ip4;
|
||||
int oif = 0;
|
||||
|
||||
@ -3275,6 +3276,11 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
fl4->flowi4_mark = skb->mark;
|
||||
fl4->flowi4_oif = reverse ? skb->skb_iif : oif;
|
||||
|
||||
fl4->flowi4_proto = iph->protocol;
|
||||
fl4->daddr = reverse ? iph->saddr : iph->daddr;
|
||||
fl4->saddr = reverse ? iph->daddr : iph->saddr;
|
||||
fl4->flowi4_tos = iph->tos;
|
||||
|
||||
if (!ip_is_fragment(iph)) {
|
||||
switch (iph->protocol) {
|
||||
case IPPROTO_UDP:
|
||||
@ -3286,7 +3292,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
pskb_may_pull(skb, xprth + 4 - skb->data)) {
|
||||
__be16 *ports;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
ports = (__be16 *)xprth;
|
||||
|
||||
fl4->fl4_sport = ports[!!reverse];
|
||||
@ -3298,7 +3304,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
pskb_may_pull(skb, xprth + 2 - skb->data)) {
|
||||
u8 *icmp;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
icmp = xprth;
|
||||
|
||||
fl4->fl4_icmp_type = icmp[0];
|
||||
@ -3310,7 +3316,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
pskb_may_pull(skb, xprth + 4 - skb->data)) {
|
||||
__be32 *ehdr;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
ehdr = (__be32 *)xprth;
|
||||
|
||||
fl4->fl4_ipsec_spi = ehdr[0];
|
||||
@ -3321,7 +3327,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
pskb_may_pull(skb, xprth + 8 - skb->data)) {
|
||||
__be32 *ah_hdr;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
ah_hdr = (__be32 *)xprth;
|
||||
|
||||
fl4->fl4_ipsec_spi = ah_hdr[1];
|
||||
@ -3332,7 +3338,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
pskb_may_pull(skb, xprth + 4 - skb->data)) {
|
||||
__be16 *ipcomp_hdr;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
ipcomp_hdr = (__be16 *)xprth;
|
||||
|
||||
fl4->fl4_ipsec_spi = htonl(ntohs(ipcomp_hdr[1]));
|
||||
@ -3344,7 +3350,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
__be16 *greflags;
|
||||
__be32 *gre_hdr;
|
||||
|
||||
xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||
xprth = skb_network_header(skb) + ihl * 4;
|
||||
greflags = (__be16 *)xprth;
|
||||
gre_hdr = (__be32 *)xprth;
|
||||
|
||||
@ -3360,10 +3366,6 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse)
|
||||
break;
|
||||
}
|
||||
}
|
||||
fl4->flowi4_proto = iph->protocol;
|
||||
fl4->daddr = reverse ? iph->saddr : iph->daddr;
|
||||
fl4->saddr = reverse ? iph->daddr : iph->saddr;
|
||||
fl4->flowi4_tos = iph->tos;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
@ -138,11 +138,6 @@ cc-disable-warning = $(call try-run,\
|
||||
# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
|
||||
cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))
|
||||
|
||||
# cc-ldoption
|
||||
# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
|
||||
cc-ldoption = $(call try-run,\
|
||||
$(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||
|
||||
# ld-option
|
||||
# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
|
||||
ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
|
||||
|
@ -6,10 +6,10 @@ set -e
|
||||
# Check uniqueness of module names
|
||||
check_same_name_modules()
|
||||
{
|
||||
for m in $(sed 's:.*/::' modules.order modules.builtin | sort | uniq -d)
|
||||
for m in $(sed 's:.*/::' modules.order | sort | uniq -d)
|
||||
do
|
||||
echo "warning: same basename if the following are built as modules:" >&2
|
||||
sed "/\/$m/!d;s:^kernel/: :" modules.order modules.builtin >&2
|
||||
echo "warning: same module names found:" >&2
|
||||
sed -n "/\/$m/s:^kernel/: :p" modules.order >&2
|
||||
done
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include <linux/psci.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/sve_context.h>
|
||||
|
||||
#define __KVM_HAVE_GUEST_DEBUG
|
||||
#define __KVM_HAVE_IRQ_LINE
|
||||
@ -102,6 +103,9 @@ struct kvm_regs {
|
||||
#define KVM_ARM_VCPU_EL1_32BIT 1 /* CPU running a 32bit VM */
|
||||
#define KVM_ARM_VCPU_PSCI_0_2 2 /* CPU uses PSCI v0.2 */
|
||||
#define KVM_ARM_VCPU_PMU_V3 3 /* Support guest PMUv3 */
|
||||
#define KVM_ARM_VCPU_SVE 4 /* enable SVE for this CPU */
|
||||
#define KVM_ARM_VCPU_PTRAUTH_ADDRESS 5 /* VCPU uses address authentication */
|
||||
#define KVM_ARM_VCPU_PTRAUTH_GENERIC 6 /* VCPU uses generic authentication */
|
||||
|
||||
struct kvm_vcpu_init {
|
||||
__u32 target;
|
||||
@ -226,6 +230,45 @@ struct kvm_vcpu_events {
|
||||
KVM_REG_ARM_FW | ((r) & 0xffff))
|
||||
#define KVM_REG_ARM_PSCI_VERSION KVM_REG_ARM_FW_REG(0)
|
||||
|
||||
/* SVE registers */
|
||||
#define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT)
|
||||
|
||||
/* Z- and P-regs occupy blocks at the following offsets within this range: */
|
||||
#define KVM_REG_ARM64_SVE_ZREG_BASE 0
|
||||
#define KVM_REG_ARM64_SVE_PREG_BASE 0x400
|
||||
#define KVM_REG_ARM64_SVE_FFR_BASE 0x600
|
||||
|
||||
#define KVM_ARM64_SVE_NUM_ZREGS __SVE_NUM_ZREGS
|
||||
#define KVM_ARM64_SVE_NUM_PREGS __SVE_NUM_PREGS
|
||||
|
||||
#define KVM_ARM64_SVE_MAX_SLICES 32
|
||||
|
||||
#define KVM_REG_ARM64_SVE_ZREG(n, i) \
|
||||
(KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_ZREG_BASE | \
|
||||
KVM_REG_SIZE_U2048 | \
|
||||
(((n) & (KVM_ARM64_SVE_NUM_ZREGS - 1)) << 5) | \
|
||||
((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
|
||||
|
||||
#define KVM_REG_ARM64_SVE_PREG(n, i) \
|
||||
(KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_PREG_BASE | \
|
||||
KVM_REG_SIZE_U256 | \
|
||||
(((n) & (KVM_ARM64_SVE_NUM_PREGS - 1)) << 5) | \
|
||||
((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
|
||||
|
||||
#define KVM_REG_ARM64_SVE_FFR(i) \
|
||||
(KVM_REG_ARM64 | KVM_REG_ARM64_SVE | KVM_REG_ARM64_SVE_FFR_BASE | \
|
||||
KVM_REG_SIZE_U256 | \
|
||||
((i) & (KVM_ARM64_SVE_MAX_SLICES - 1)))
|
||||
|
||||
#define KVM_ARM64_SVE_VQ_MIN __SVE_VQ_MIN
|
||||
#define KVM_ARM64_SVE_VQ_MAX __SVE_VQ_MAX
|
||||
|
||||
/* Vector lengths pseudo-register: */
|
||||
#define KVM_REG_ARM64_SVE_VLS (KVM_REG_ARM64 | KVM_REG_ARM64_SVE | \
|
||||
KVM_REG_SIZE_U512 | 0xffff)
|
||||
#define KVM_ARM64_SVE_VLS_WORDS \
|
||||
((KVM_ARM64_SVE_VQ_MAX - KVM_ARM64_SVE_VQ_MIN) / 64 + 1)
|
||||
|
||||
/* Device Control API: ARM VGIC */
|
||||
#define KVM_DEV_ARM_VGIC_GRP_ADDR 0
|
||||
#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
|
||||
|
@ -482,6 +482,8 @@ struct kvm_ppc_cpu_char {
|
||||
#define KVM_REG_PPC_ICP_PPRI_SHIFT 16 /* pending irq priority */
|
||||
#define KVM_REG_PPC_ICP_PPRI_MASK 0xff
|
||||
|
||||
#define KVM_REG_PPC_VP_STATE (KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x8d)
|
||||
|
||||
/* Device control API: PPC-specific devices */
|
||||
#define KVM_DEV_MPIC_GRP_MISC 1
|
||||
#define KVM_DEV_MPIC_BASE_ADDR 0 /* 64-bit */
|
||||
@ -677,4 +679,48 @@ struct kvm_ppc_cpu_char {
|
||||
#define KVM_XICS_PRESENTED (1ULL << 43)
|
||||
#define KVM_XICS_QUEUED (1ULL << 44)
|
||||
|
||||
/* POWER9 XIVE Native Interrupt Controller */
|
||||
#define KVM_DEV_XIVE_GRP_CTRL 1
|
||||
#define KVM_DEV_XIVE_RESET 1
|
||||
#define KVM_DEV_XIVE_EQ_SYNC 2
|
||||
#define KVM_DEV_XIVE_GRP_SOURCE 2 /* 64-bit source identifier */
|
||||
#define KVM_DEV_XIVE_GRP_SOURCE_CONFIG 3 /* 64-bit source identifier */
|
||||
#define KVM_DEV_XIVE_GRP_EQ_CONFIG 4 /* 64-bit EQ identifier */
|
||||
#define KVM_DEV_XIVE_GRP_SOURCE_SYNC 5 /* 64-bit source identifier */
|
||||
|
||||
/* Layout of 64-bit XIVE source attribute values */
|
||||
#define KVM_XIVE_LEVEL_SENSITIVE (1ULL << 0)
|
||||
#define KVM_XIVE_LEVEL_ASSERTED (1ULL << 1)
|
||||
|
||||
/* Layout of 64-bit XIVE source configuration attribute values */
|
||||
#define KVM_XIVE_SOURCE_PRIORITY_SHIFT 0
|
||||
#define KVM_XIVE_SOURCE_PRIORITY_MASK 0x7
|
||||
#define KVM_XIVE_SOURCE_SERVER_SHIFT 3
|
||||
#define KVM_XIVE_SOURCE_SERVER_MASK 0xfffffff8ULL
|
||||
#define KVM_XIVE_SOURCE_MASKED_SHIFT 32
|
||||
#define KVM_XIVE_SOURCE_MASKED_MASK 0x100000000ULL
|
||||
#define KVM_XIVE_SOURCE_EISN_SHIFT 33
|
||||
#define KVM_XIVE_SOURCE_EISN_MASK 0xfffffffe00000000ULL
|
||||
|
||||
/* Layout of 64-bit EQ identifier */
|
||||
#define KVM_XIVE_EQ_PRIORITY_SHIFT 0
|
||||
#define KVM_XIVE_EQ_PRIORITY_MASK 0x7
|
||||
#define KVM_XIVE_EQ_SERVER_SHIFT 3
|
||||
#define KVM_XIVE_EQ_SERVER_MASK 0xfffffff8ULL
|
||||
|
||||
/* Layout of EQ configuration values (64 bytes) */
|
||||
struct kvm_ppc_xive_eq {
|
||||
__u32 flags;
|
||||
__u32 qshift;
|
||||
__u64 qaddr;
|
||||
__u32 qtoggle;
|
||||
__u32 qindex;
|
||||
__u8 pad[40];
|
||||
};
|
||||
|
||||
#define KVM_XIVE_EQ_ALWAYS_NOTIFY 0x00000001
|
||||
|
||||
#define KVM_XIVE_TIMA_PAGE_OFFSET 0
|
||||
#define KVM_XIVE_ESB_PAGE_OFFSET 4
|
||||
|
||||
#endif /* __LINUX_KVM_POWERPC_H */
|
||||
|
@ -153,7 +153,9 @@ struct kvm_s390_vm_cpu_subfunc {
|
||||
__u8 ppno[16]; /* with MSA5 */
|
||||
__u8 kma[16]; /* with MSA8 */
|
||||
__u8 kdsa[16]; /* with MSA9 */
|
||||
__u8 reserved[1792];
|
||||
__u8 sortl[32]; /* with STFLE.150 */
|
||||
__u8 dfltcc[32]; /* with STFLE.151 */
|
||||
__u8 reserved[1728];
|
||||
};
|
||||
|
||||
/* kvm attributes for crypto */
|
||||
|
@ -344,6 +344,7 @@
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */
|
||||
#define X86_FEATURE_AVX512_4VNNIW (18*32+ 2) /* AVX-512 Neural Network Instructions */
|
||||
#define X86_FEATURE_AVX512_4FMAPS (18*32+ 3) /* AVX-512 Multiply Accumulation Single precision */
|
||||
#define X86_FEATURE_MD_CLEAR (18*32+10) /* VERW clears CPU buffers */
|
||||
#define X86_FEATURE_TSX_FORCE_ABORT (18*32+13) /* "" TSX_FORCE_ABORT */
|
||||
#define X86_FEATURE_PCONFIG (18*32+18) /* Intel PCONFIG */
|
||||
#define X86_FEATURE_SPEC_CTRL (18*32+26) /* "" Speculation Control (IBRS + IBPB) */
|
||||
@ -382,5 +383,7 @@
|
||||
#define X86_BUG_SPECTRE_V2 X86_BUG(16) /* CPU is affected by Spectre variant 2 attack with indirect branches */
|
||||
#define X86_BUG_SPEC_STORE_BYPASS X86_BUG(17) /* CPU is affected by speculative store bypass attack */
|
||||
#define X86_BUG_L1TF X86_BUG(18) /* CPU is affected by L1 Terminal Fault */
|
||||
#define X86_BUG_MDS X86_BUG(19) /* CPU is affected by Microarchitectural data sampling */
|
||||
#define X86_BUG_MSBDS_ONLY X86_BUG(20) /* CPU is only affected by the MSDBS variant of BUG_MDS */
|
||||
|
||||
#endif /* _ASM_X86_CPUFEATURES_H */
|
||||
|
@ -208,8 +208,8 @@ static int dump_btf_type(const struct btf *btf, __u32 id,
|
||||
break;
|
||||
}
|
||||
case BTF_KIND_FWD: {
|
||||
const char *fwd_kind = BTF_INFO_KIND(t->info) ? "union"
|
||||
: "struct";
|
||||
const char *fwd_kind = BTF_INFO_KFLAG(t->info) ? "union"
|
||||
: "struct";
|
||||
|
||||
if (json_output)
|
||||
jsonw_string_field(w, "fwd_kind", fwd_kind);
|
||||
|
@ -879,6 +879,8 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
|
||||
}
|
||||
}
|
||||
|
||||
set_max_rlimit();
|
||||
|
||||
obj = __bpf_object__open_xattr(&attr, bpf_flags);
|
||||
if (IS_ERR_OR_NULL(obj)) {
|
||||
p_err("failed to open object file");
|
||||
@ -958,8 +960,6 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
|
||||
goto err_close_obj;
|
||||
}
|
||||
|
||||
set_max_rlimit();
|
||||
|
||||
err = bpf_object__load(obj);
|
||||
if (err) {
|
||||
p_err("failed to load object file");
|
||||
|
@ -832,9 +832,21 @@ __SYSCALL(__NR_io_uring_setup, sys_io_uring_setup)
|
||||
__SYSCALL(__NR_io_uring_enter, sys_io_uring_enter)
|
||||
#define __NR_io_uring_register 427
|
||||
__SYSCALL(__NR_io_uring_register, sys_io_uring_register)
|
||||
#define __NR_open_tree 428
|
||||
__SYSCALL(__NR_open_tree, sys_open_tree)
|
||||
#define __NR_move_mount 429
|
||||
__SYSCALL(__NR_move_mount, sys_move_mount)
|
||||
#define __NR_fsopen 430
|
||||
__SYSCALL(__NR_fsopen, sys_fsopen)
|
||||
#define __NR_fsconfig 431
|
||||
__SYSCALL(__NR_fsconfig, sys_fsconfig)
|
||||
#define __NR_fsmount 432
|
||||
__SYSCALL(__NR_fsmount, sys_fsmount)
|
||||
#define __NR_fspick 433
|
||||
__SYSCALL(__NR_fspick, sys_fspick)
|
||||
|
||||
#undef __NR_syscalls
|
||||
#define __NR_syscalls 428
|
||||
#define __NR_syscalls 434
|
||||
|
||||
/*
|
||||
* 32 bit systems traditionally used different
|
||||
|
@ -649,6 +649,7 @@ struct drm_gem_open {
|
||||
#define DRM_CAP_PAGE_FLIP_TARGET 0x11
|
||||
#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
|
||||
#define DRM_CAP_SYNCOBJ 0x13
|
||||
#define DRM_CAP_SYNCOBJ_TIMELINE 0x14
|
||||
|
||||
/** DRM_IOCTL_GET_CAP ioctl argument type */
|
||||
struct drm_get_cap {
|
||||
@ -735,8 +736,18 @@ struct drm_syncobj_handle {
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
struct drm_syncobj_transfer {
|
||||
__u32 src_handle;
|
||||
__u32 dst_handle;
|
||||
__u64 src_point;
|
||||
__u64 dst_point;
|
||||
__u32 flags;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
|
||||
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
|
||||
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
|
||||
struct drm_syncobj_wait {
|
||||
__u64 handles;
|
||||
/* absolute timeout */
|
||||
@ -747,12 +758,33 @@ struct drm_syncobj_wait {
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
struct drm_syncobj_timeline_wait {
|
||||
__u64 handles;
|
||||
/* wait on specific timeline point for every handles*/
|
||||
__u64 points;
|
||||
/* absolute timeout */
|
||||
__s64 timeout_nsec;
|
||||
__u32 count_handles;
|
||||
__u32 flags;
|
||||
__u32 first_signaled; /* only valid when not waiting all */
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
|
||||
struct drm_syncobj_array {
|
||||
__u64 handles;
|
||||
__u32 count_handles;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
struct drm_syncobj_timeline_array {
|
||||
__u64 handles;
|
||||
__u64 points;
|
||||
__u32 count_handles;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
|
||||
/* Query current scanout sequence number */
|
||||
struct drm_crtc_get_sequence {
|
||||
__u32 crtc_id; /* requested crtc_id */
|
||||
@ -909,6 +941,11 @@ extern "C" {
|
||||
#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
|
||||
#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
|
||||
|
||||
#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
|
||||
#define DRM_IOCTL_SYNCOBJ_QUERY DRM_IOWR(0xCB, struct drm_syncobj_timeline_array)
|
||||
#define DRM_IOCTL_SYNCOBJ_TRANSFER DRM_IOWR(0xCC, struct drm_syncobj_transfer)
|
||||
#define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL DRM_IOWR(0xCD, struct drm_syncobj_timeline_array)
|
||||
|
||||
/**
|
||||
* Device specific ioctls should only be in their respective headers
|
||||
* The device specific ioctl range is from 0x40 to 0x9f.
|
||||
|
@ -62,6 +62,28 @@ extern "C" {
|
||||
#define I915_ERROR_UEVENT "ERROR"
|
||||
#define I915_RESET_UEVENT "RESET"
|
||||
|
||||
/*
|
||||
* i915_user_extension: Base class for defining a chain of extensions
|
||||
*
|
||||
* Many interfaces need to grow over time. In most cases we can simply
|
||||
* extend the struct and have userspace pass in more data. Another option,
|
||||
* as demonstrated by Vulkan's approach to providing extensions for forward
|
||||
* and backward compatibility, is to use a list of optional structs to
|
||||
* provide those extra details.
|
||||
*
|
||||
* The key advantage to using an extension chain is that it allows us to
|
||||
* redefine the interface more easily than an ever growing struct of
|
||||
* increasing complexity, and for large parts of that interface to be
|
||||
* entirely optional. The downside is more pointer chasing; chasing across
|
||||
* the __user boundary with pointers encapsulated inside u64.
|
||||
*/
|
||||
struct i915_user_extension {
|
||||
__u64 next_extension;
|
||||
__u32 name;
|
||||
__u32 flags; /* All undefined bits must be zero. */
|
||||
__u32 rsvd[4]; /* Reserved for future use; must be zero. */
|
||||
};
|
||||
|
||||
/*
|
||||
* MOCS indexes used for GPU surfaces, defining the cacheability of the
|
||||
* surface data and the coherency for this data wrt. CPU vs. GPU accesses.
|
||||
@ -99,9 +121,23 @@ enum drm_i915_gem_engine_class {
|
||||
I915_ENGINE_CLASS_VIDEO = 2,
|
||||
I915_ENGINE_CLASS_VIDEO_ENHANCE = 3,
|
||||
|
||||
/* should be kept compact */
|
||||
|
||||
I915_ENGINE_CLASS_INVALID = -1
|
||||
};
|
||||
|
||||
/*
|
||||
* There may be more than one engine fulfilling any role within the system.
|
||||
* Each engine of a class is given a unique instance number and therefore
|
||||
* any engine can be specified by its class:instance tuplet. APIs that allow
|
||||
* access to any engine in the system will use struct i915_engine_class_instance
|
||||
* for this identification.
|
||||
*/
|
||||
struct i915_engine_class_instance {
|
||||
__u16 engine_class; /* see enum drm_i915_gem_engine_class */
|
||||
__u16 engine_instance;
|
||||
};
|
||||
|
||||
/**
|
||||
* DOC: perf_events exposed by i915 through /sys/bus/event_sources/drivers/i915
|
||||
*
|
||||
@ -319,6 +355,7 @@ typedef struct _drm_i915_sarea {
|
||||
#define DRM_I915_PERF_ADD_CONFIG 0x37
|
||||
#define DRM_I915_PERF_REMOVE_CONFIG 0x38
|
||||
#define DRM_I915_QUERY 0x39
|
||||
/* Must be kept compact -- no holes */
|
||||
|
||||
#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
|
||||
#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
|
||||
@ -367,6 +404,7 @@ typedef struct _drm_i915_sarea {
|
||||
#define DRM_IOCTL_I915_GET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
|
||||
#define DRM_IOCTL_I915_GEM_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_WAIT, struct drm_i915_gem_wait)
|
||||
#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create)
|
||||
#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create_ext)
|
||||
#define DRM_IOCTL_I915_GEM_CONTEXT_DESTROY DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_DESTROY, struct drm_i915_gem_context_destroy)
|
||||
#define DRM_IOCTL_I915_REG_READ DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_REG_READ, struct drm_i915_reg_read)
|
||||
#define DRM_IOCTL_I915_GET_RESET_STATS DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GET_RESET_STATS, struct drm_i915_reset_stats)
|
||||
@ -476,6 +514,7 @@ typedef struct drm_i915_irq_wait {
|
||||
#define I915_SCHEDULER_CAP_ENABLED (1ul << 0)
|
||||
#define I915_SCHEDULER_CAP_PRIORITY (1ul << 1)
|
||||
#define I915_SCHEDULER_CAP_PREEMPTION (1ul << 2)
|
||||
#define I915_SCHEDULER_CAP_SEMAPHORES (1ul << 3)
|
||||
|
||||
#define I915_PARAM_HUC_STATUS 42
|
||||
|
||||
@ -559,6 +598,8 @@ typedef struct drm_i915_irq_wait {
|
||||
*/
|
||||
#define I915_PARAM_MMAP_GTT_COHERENT 52
|
||||
|
||||
/* Must be kept compact -- no holes and well documented */
|
||||
|
||||
typedef struct drm_i915_getparam {
|
||||
__s32 param;
|
||||
/*
|
||||
@ -574,6 +615,7 @@ typedef struct drm_i915_getparam {
|
||||
#define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
|
||||
#define I915_SETPARAM_ALLOW_BATCHBUFFER 3
|
||||
#define I915_SETPARAM_NUM_USED_FENCES 4
|
||||
/* Must be kept compact -- no holes */
|
||||
|
||||
typedef struct drm_i915_setparam {
|
||||
int param;
|
||||
@ -972,7 +1014,7 @@ struct drm_i915_gem_execbuffer2 {
|
||||
* struct drm_i915_gem_exec_fence *fences.
|
||||
*/
|
||||
__u64 cliprects_ptr;
|
||||
#define I915_EXEC_RING_MASK (7<<0)
|
||||
#define I915_EXEC_RING_MASK (0x3f)
|
||||
#define I915_EXEC_DEFAULT (0<<0)
|
||||
#define I915_EXEC_RENDER (1<<0)
|
||||
#define I915_EXEC_BSD (2<<0)
|
||||
@ -1120,32 +1162,34 @@ struct drm_i915_gem_busy {
|
||||
* as busy may become idle before the ioctl is completed.
|
||||
*
|
||||
* Furthermore, if the object is busy, which engine is busy is only
|
||||
* provided as a guide. There are race conditions which prevent the
|
||||
* report of which engines are busy from being always accurate.
|
||||
* However, the converse is not true. If the object is idle, the
|
||||
* result of the ioctl, that all engines are idle, is accurate.
|
||||
* provided as a guide and only indirectly by reporting its class
|
||||
* (there may be more than one engine in each class). There are race
|
||||
* conditions which prevent the report of which engines are busy from
|
||||
* being always accurate. However, the converse is not true. If the
|
||||
* object is idle, the result of the ioctl, that all engines are idle,
|
||||
* is accurate.
|
||||
*
|
||||
* The returned dword is split into two fields to indicate both
|
||||
* the engines on which the object is being read, and the
|
||||
* engine on which it is currently being written (if any).
|
||||
* the engine classess on which the object is being read, and the
|
||||
* engine class on which it is currently being written (if any).
|
||||
*
|
||||
* The low word (bits 0:15) indicate if the object is being written
|
||||
* to by any engine (there can only be one, as the GEM implicit
|
||||
* synchronisation rules force writes to be serialised). Only the
|
||||
* engine for the last write is reported.
|
||||
* engine class (offset by 1, I915_ENGINE_CLASS_RENDER is reported as
|
||||
* 1 not 0 etc) for the last write is reported.
|
||||
*
|
||||
* The high word (bits 16:31) are a bitmask of which engines are
|
||||
* currently reading from the object. Multiple engines may be
|
||||
* The high word (bits 16:31) are a bitmask of which engines classes
|
||||
* are currently reading from the object. Multiple engines may be
|
||||
* reading from the object simultaneously.
|
||||
*
|
||||
* The value of each engine is the same as specified in the
|
||||
* EXECBUFFER2 ioctl, i.e. I915_EXEC_RENDER, I915_EXEC_BSD etc.
|
||||
* Note I915_EXEC_DEFAULT is a symbolic value and is mapped to
|
||||
* the I915_EXEC_RENDER engine for execution, and so it is never
|
||||
* The value of each engine class is the same as specified in the
|
||||
* I915_CONTEXT_SET_ENGINES parameter and via perf, i.e.
|
||||
* I915_ENGINE_CLASS_RENDER, I915_ENGINE_CLASS_COPY, etc.
|
||||
* reported as active itself. Some hardware may have parallel
|
||||
* execution engines, e.g. multiple media engines, which are
|
||||
* mapped to the same identifier in the EXECBUFFER2 ioctl and
|
||||
* so are not separately reported for busyness.
|
||||
* mapped to the same class identifier and so are not separately
|
||||
* reported for busyness.
|
||||
*
|
||||
* Caveat emptor:
|
||||
* Only the boolean result of this query is reliable; that is whether
|
||||
@ -1412,16 +1456,158 @@ struct drm_i915_gem_wait {
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_create {
|
||||
/* output: id of new context*/
|
||||
__u32 ctx_id;
|
||||
__u32 ctx_id; /* output: id of new context*/
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_create_ext {
|
||||
__u32 ctx_id; /* output: id of new context*/
|
||||
__u32 flags;
|
||||
#define I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS (1u << 0)
|
||||
#define I915_CONTEXT_CREATE_FLAGS_UNKNOWN \
|
||||
(-(I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS << 1))
|
||||
__u64 extensions;
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_param {
|
||||
__u32 ctx_id;
|
||||
__u32 size;
|
||||
__u64 param;
|
||||
#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1
|
||||
#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2
|
||||
#define I915_CONTEXT_PARAM_GTT_SIZE 0x3
|
||||
#define I915_CONTEXT_PARAM_NO_ERROR_CAPTURE 0x4
|
||||
#define I915_CONTEXT_PARAM_BANNABLE 0x5
|
||||
#define I915_CONTEXT_PARAM_PRIORITY 0x6
|
||||
#define I915_CONTEXT_MAX_USER_PRIORITY 1023 /* inclusive */
|
||||
#define I915_CONTEXT_DEFAULT_PRIORITY 0
|
||||
#define I915_CONTEXT_MIN_USER_PRIORITY -1023 /* inclusive */
|
||||
/*
|
||||
* When using the following param, value should be a pointer to
|
||||
* drm_i915_gem_context_param_sseu.
|
||||
*/
|
||||
#define I915_CONTEXT_PARAM_SSEU 0x7
|
||||
|
||||
/*
|
||||
* Not all clients may want to attempt automatic recover of a context after
|
||||
* a hang (for example, some clients may only submit very small incremental
|
||||
* batches relying on known logical state of previous batches which will never
|
||||
* recover correctly and each attempt will hang), and so would prefer that
|
||||
* the context is forever banned instead.
|
||||
*
|
||||
* If set to false (0), after a reset, subsequent (and in flight) rendering
|
||||
* from this context is discarded, and the client will need to create a new
|
||||
* context to use instead.
|
||||
*
|
||||
* If set to true (1), the kernel will automatically attempt to recover the
|
||||
* context by skipping the hanging batch and executing the next batch starting
|
||||
* from the default context state (discarding the incomplete logical context
|
||||
* state lost due to the reset).
|
||||
*
|
||||
* On creation, all new contexts are marked as recoverable.
|
||||
*/
|
||||
#define I915_CONTEXT_PARAM_RECOVERABLE 0x8
|
||||
/* Must be kept compact -- no holes and well documented */
|
||||
|
||||
__u64 value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Context SSEU programming
|
||||
*
|
||||
* It may be necessary for either functional or performance reason to configure
|
||||
* a context to run with a reduced number of SSEU (where SSEU stands for Slice/
|
||||
* Sub-slice/EU).
|
||||
*
|
||||
* This is done by configuring SSEU configuration using the below
|
||||
* @struct drm_i915_gem_context_param_sseu for every supported engine which
|
||||
* userspace intends to use.
|
||||
*
|
||||
* Not all GPUs or engines support this functionality in which case an error
|
||||
* code -ENODEV will be returned.
|
||||
*
|
||||
* Also, flexibility of possible SSEU configuration permutations varies between
|
||||
* GPU generations and software imposed limitations. Requesting such a
|
||||
* combination will return an error code of -EINVAL.
|
||||
*
|
||||
* NOTE: When perf/OA is active the context's SSEU configuration is ignored in
|
||||
* favour of a single global setting.
|
||||
*/
|
||||
struct drm_i915_gem_context_param_sseu {
|
||||
/*
|
||||
* Engine class & instance to be configured or queried.
|
||||
*/
|
||||
struct i915_engine_class_instance engine;
|
||||
|
||||
/*
|
||||
* Unused for now. Must be cleared to zero.
|
||||
*/
|
||||
__u32 flags;
|
||||
|
||||
/*
|
||||
* Mask of slices to enable for the context. Valid values are a subset
|
||||
* of the bitmask value returned for I915_PARAM_SLICE_MASK.
|
||||
*/
|
||||
__u64 slice_mask;
|
||||
|
||||
/*
|
||||
* Mask of subslices to enable for the context. Valid values are a
|
||||
* subset of the bitmask value return by I915_PARAM_SUBSLICE_MASK.
|
||||
*/
|
||||
__u64 subslice_mask;
|
||||
|
||||
/*
|
||||
* Minimum/Maximum number of EUs to enable per subslice for the
|
||||
* context. min_eus_per_subslice must be inferior or equal to
|
||||
* max_eus_per_subslice.
|
||||
*/
|
||||
__u16 min_eus_per_subslice;
|
||||
__u16 max_eus_per_subslice;
|
||||
|
||||
/*
|
||||
* Unused for now. Must be cleared to zero.
|
||||
*/
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_create_ext_setparam {
|
||||
#define I915_CONTEXT_CREATE_EXT_SETPARAM 0
|
||||
struct i915_user_extension base;
|
||||
struct drm_i915_gem_context_param param;
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_destroy {
|
||||
__u32 ctx_id;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
/*
|
||||
* DRM_I915_GEM_VM_CREATE -
|
||||
*
|
||||
* Create a new virtual memory address space (ppGTT) for use within a context
|
||||
* on the same file. Extensions can be provided to configure exactly how the
|
||||
* address space is setup upon creation.
|
||||
*
|
||||
* The id of new VM (bound to the fd) for use with I915_CONTEXT_PARAM_VM is
|
||||
* returned in the outparam @id.
|
||||
*
|
||||
* No flags are defined, with all bits reserved and must be zero.
|
||||
*
|
||||
* An extension chain maybe provided, starting with @extensions, and terminated
|
||||
* by the @next_extension being 0. Currently, no extensions are defined.
|
||||
*
|
||||
* DRM_I915_GEM_VM_DESTROY -
|
||||
*
|
||||
* Destroys a previously created VM id, specified in @id.
|
||||
*
|
||||
* No extensions or flags are allowed currently, and so must be zero.
|
||||
*/
|
||||
struct drm_i915_gem_vm_control {
|
||||
__u64 extensions;
|
||||
__u32 flags;
|
||||
__u32 vm_id;
|
||||
};
|
||||
|
||||
struct drm_i915_reg_read {
|
||||
/*
|
||||
* Register offset.
|
||||
@ -1434,6 +1620,7 @@ struct drm_i915_reg_read {
|
||||
|
||||
__u64 val; /* Return value */
|
||||
};
|
||||
|
||||
/* Known registers:
|
||||
*
|
||||
* Render engine timestamp - 0x2358 + 64bit - gen7+
|
||||
@ -1473,86 +1660,6 @@ struct drm_i915_gem_userptr {
|
||||
__u32 handle;
|
||||
};
|
||||
|
||||
struct drm_i915_gem_context_param {
|
||||
__u32 ctx_id;
|
||||
__u32 size;
|
||||
__u64 param;
|
||||
#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1
|
||||
#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2
|
||||
#define I915_CONTEXT_PARAM_GTT_SIZE 0x3
|
||||
#define I915_CONTEXT_PARAM_NO_ERROR_CAPTURE 0x4
|
||||
#define I915_CONTEXT_PARAM_BANNABLE 0x5
|
||||
#define I915_CONTEXT_PARAM_PRIORITY 0x6
|
||||
#define I915_CONTEXT_MAX_USER_PRIORITY 1023 /* inclusive */
|
||||
#define I915_CONTEXT_DEFAULT_PRIORITY 0
|
||||
#define I915_CONTEXT_MIN_USER_PRIORITY -1023 /* inclusive */
|
||||
/*
|
||||
* When using the following param, value should be a pointer to
|
||||
* drm_i915_gem_context_param_sseu.
|
||||
*/
|
||||
#define I915_CONTEXT_PARAM_SSEU 0x7
|
||||
__u64 value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Context SSEU programming
|
||||
*
|
||||
* It may be necessary for either functional or performance reason to configure
|
||||
* a context to run with a reduced number of SSEU (where SSEU stands for Slice/
|
||||
* Sub-slice/EU).
|
||||
*
|
||||
* This is done by configuring SSEU configuration using the below
|
||||
* @struct drm_i915_gem_context_param_sseu for every supported engine which
|
||||
* userspace intends to use.
|
||||
*
|
||||
* Not all GPUs or engines support this functionality in which case an error
|
||||
* code -ENODEV will be returned.
|
||||
*
|
||||
* Also, flexibility of possible SSEU configuration permutations varies between
|
||||
* GPU generations and software imposed limitations. Requesting such a
|
||||
* combination will return an error code of -EINVAL.
|
||||
*
|
||||
* NOTE: When perf/OA is active the context's SSEU configuration is ignored in
|
||||
* favour of a single global setting.
|
||||
*/
|
||||
struct drm_i915_gem_context_param_sseu {
|
||||
/*
|
||||
* Engine class & instance to be configured or queried.
|
||||
*/
|
||||
__u16 engine_class;
|
||||
__u16 engine_instance;
|
||||
|
||||
/*
|
||||
* Unused for now. Must be cleared to zero.
|
||||
*/
|
||||
__u32 flags;
|
||||
|
||||
/*
|
||||
* Mask of slices to enable for the context. Valid values are a subset
|
||||
* of the bitmask value returned for I915_PARAM_SLICE_MASK.
|
||||
*/
|
||||
__u64 slice_mask;
|
||||
|
||||
/*
|
||||
* Mask of subslices to enable for the context. Valid values are a
|
||||
* subset of the bitmask value return by I915_PARAM_SUBSLICE_MASK.
|
||||
*/
|
||||
__u64 subslice_mask;
|
||||
|
||||
/*
|
||||
* Minimum/Maximum number of EUs to enable per subslice for the
|
||||
* context. min_eus_per_subslice must be inferior or equal to
|
||||
* max_eus_per_subslice.
|
||||
*/
|
||||
__u16 min_eus_per_subslice;
|
||||
__u16 max_eus_per_subslice;
|
||||
|
||||
/*
|
||||
* Unused for now. Must be cleared to zero.
|
||||
*/
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
enum drm_i915_oa_format {
|
||||
I915_OA_FORMAT_A13 = 1, /* HSW only */
|
||||
I915_OA_FORMAT_A29, /* HSW only */
|
||||
@ -1714,6 +1821,7 @@ struct drm_i915_perf_oa_config {
|
||||
struct drm_i915_query_item {
|
||||
__u64 query_id;
|
||||
#define DRM_I915_QUERY_TOPOLOGY_INFO 1
|
||||
/* Must be kept compact -- no holes and well documented */
|
||||
|
||||
/*
|
||||
* When set to zero by userspace, this is filled with the size of the
|
||||
|
@ -83,7 +83,7 @@ struct btf_type {
|
||||
* is the 32 bits arrangement:
|
||||
*/
|
||||
#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL & 0x00ff0000)) >> 16)
|
||||
#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16)
|
||||
#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff)
|
||||
|
||||
/* Attributes stored in the BTF_INT_ENCODING */
|
||||
|
@ -91,5 +91,7 @@
|
||||
#define AT_STATX_FORCE_SYNC 0x2000 /* - Force the attributes to be sync'd with the server */
|
||||
#define AT_STATX_DONT_SYNC 0x4000 /* - Don't sync attributes with the server */
|
||||
|
||||
#define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */
|
||||
|
||||
|
||||
#endif /* _UAPI_LINUX_FCNTL_H */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user