mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
Networking fixes for 6.1-rc6, including fixes from bpf
Current release - regressions: - tls: fix memory leak in tls_enc_skb() and tls_sw_fallback_init() Previous releases - regressions: - bridge: fix memory leaks when changing VLAN protocol - dsa: make dsa_master_ioctl() see through port_hwtstamp_get() shims - dsa: don't leak tagger-owned storage on switch driver unbind - eth: mlxsw: avoid warnings when not offloaded FDB entry with IPv6 is removed - eth: stmmac: ensure tx function is not running in stmmac_xdp_release() - eth: hns3: fix return value check bug of rx copybreak Previous releases - always broken: - kcm: close race conditions on sk_receive_queue - bpf: fix alignment problem in bpf_prog_test_run_skb() - bpf: fix writing offset in case of fault in strncpy_from_kernel_nofault - eth: macvlan: use built-in RCU list checking - eth: marvell: add sleep time after enabling the loopback bit - eth: octeon_ep: fix potential memory leak in octep_device_setup() Misc: - tcp: configurable source port perturb table size - bpf: Convert BPF_DISPATCHER to use static_call() (not ftrace) Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmN2FlMSHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkWAwQAJcV7XEB7bEssgabFkEmC4uvS/sFlyHC uSwFRn5ojaB2c56T1CnNYmitg9Wr4arC6Vca28iai6BgqB6t4qLRI/WWTsZiEPhi mt/pjNN2u9JMyaafHFHYfXnbSDWRF7kPMpNw4l3uL0vkGyjSI7LGAOP4Qh8C1h/d tNVSDZnj4Laj/3JtDf7Rk6ydCqPYnNdWxFfoZ/SQkjYZKD3Ze9tml7WJykAzCTLp yUiPC6TvHOnWIZYbB04sVVOQD4V+95TSOgEhB6wzs/CXB7iBEY+N+oCedjP9Xrfw n3ea4anBoTleDnJXJI57LhdJBkyoXncfbpbYLwXljyIgosr7XVTALvOG8XUhg/DW FzN5DWQ54jzTsx2eXFJzjQQcDIgyxazk9EdoHdqF8byCasP+fofq1JvzyqtvNSyh h8Ps6jdMZrWpXuFDVApXUhP32A/+9q+dFSYHJO681m6mf4CIaUXdm4aB1dkxDAvg PSlk797U94RQCzJgqxhrgsq1PGQPBb+qadZrAiD3aQi26g0NWCTg7uFpCeCEK2ZF fLwc2XxrwLQm1q7xQVoEg4UxPIIf0mUesvOD9sLDYop0rFIw8x0v7jdYM4kyhN3o 6FWAXKxBe3LJ9jTTsVTbZbfHYpTnS8Q2KSclBN+/dZNHwwsUPHjy17Z2Ct3o3Jlm lNbiiD30BgsD =vVJk -----END PGP SIGNATURE----- Merge tag 'net-6.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from bpf. Current release - regressions: - tls: fix memory leak in tls_enc_skb() and tls_sw_fallback_init() Previous releases - regressions: - bridge: fix memory leaks when changing VLAN protocol - dsa: make dsa_master_ioctl() see through port_hwtstamp_get() shims - dsa: don't leak tagger-owned storage on switch driver unbind - eth: mlxsw: avoid warnings when not offloaded FDB entry with IPv6 is removed - eth: stmmac: ensure tx function is not running in stmmac_xdp_release() - eth: hns3: fix return value check bug of rx copybreak Previous releases - always broken: - kcm: close race conditions on sk_receive_queue - bpf: fix alignment problem in bpf_prog_test_run_skb() - bpf: fix writing offset in case of fault in strncpy_from_kernel_nofault - eth: macvlan: use built-in RCU list checking - eth: marvell: add sleep time after enabling the loopback bit - eth: octeon_ep: fix potential memory leak in octep_device_setup() Misc: - tcp: configurable source port perturb table size - bpf: Convert BPF_DISPATCHER to use static_call() (not ftrace)" * tag 'net-6.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (51 commits) net: use struct_group to copy ip/ipv6 header addresses net: usb: smsc95xx: fix external PHY reset net: usb: qmi_wwan: add Telit 0x103a composition netdevsim: Fix memory leak of nsim_dev->fa_cookie tcp: configurable source port perturb table size l2tp: Serialize access to sk_user_data with sk_callback_lock net: thunderbolt: Fix error handling in tbnet_init() net: microchip: sparx5: Fix potential null-ptr-deref in sparx_stats_init() and sparx5_start() net: lan966x: Fix potential null-ptr-deref in lan966x_stats_init() net: dsa: don't leak tagger-owned storage on switch driver unbind net/x25: Fix skb leak in x25_lapb_receive_frame() net: ag71xx: call phylink_disconnect_phy if ag71xx_hw_enable() fail in ag71xx_open() bridge: switchdev: Fix memory leaks when changing VLAN protocol net: hns3: fix setting incorrect phy link ksettings for firmware in resetting process net: hns3: fix return value check bug of rx copybreak net: hns3: fix incorrect hw rss hash type of rx packet net: phy: marvell: add sleep time after enabling the loopback bit net: ena: Fix error handling in ena_init() kcm: close race conditions on sk_receive_queue net: ionic: Fix error handling in ionic_init_module() ...
This commit is contained in:
commit
847ccab8fd
@ -11,7 +11,6 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/sort.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/extable.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/nospec-branch.h>
|
||||
@ -389,18 +388,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int __init bpf_arch_init_dispatcher_early(void *ip)
|
||||
{
|
||||
const u8 *nop_insn = x86_nops[5];
|
||||
|
||||
if (is_endbr(*(u32 *)ip))
|
||||
ip += ENDBR_INSN_SIZE;
|
||||
|
||||
if (memcmp(ip, nop_insn, X86_PATCH_SIZE))
|
||||
text_poke_early(ip, nop_insn, X86_PATCH_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
|
||||
void *old_addr, void *new_addr)
|
||||
{
|
||||
|
@ -222,7 +222,7 @@ mISDN_register_device(struct mISDNdevice *dev,
|
||||
|
||||
err = get_free_devid();
|
||||
if (err < 0)
|
||||
goto error1;
|
||||
return err;
|
||||
dev->id = err;
|
||||
|
||||
device_initialize(&dev->dev);
|
||||
|
@ -77,6 +77,7 @@ int mISDN_dsp_element_register(struct mISDN_dsp_element *elem)
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&entry->list);
|
||||
entry->elem = elem;
|
||||
|
||||
entry->dev.class = elements_class;
|
||||
@ -107,7 +108,7 @@ err2:
|
||||
device_unregister(&entry->dev);
|
||||
return ret;
|
||||
err1:
|
||||
kfree(entry);
|
||||
put_device(&entry->dev);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(mISDN_dsp_element_register);
|
||||
|
@ -4543,13 +4543,19 @@ static struct pci_driver ena_pci_driver = {
|
||||
|
||||
static int __init ena_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ena_wq = create_singlethread_workqueue(DRV_MODULE_NAME);
|
||||
if (!ena_wq) {
|
||||
pr_err("Failed to create workqueue\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return pci_register_driver(&ena_pci_driver);
|
||||
ret = pci_register_driver(&ena_pci_driver);
|
||||
if (ret)
|
||||
destroy_workqueue(ena_wq);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ena_cleanup(void)
|
||||
|
@ -1427,7 +1427,7 @@ static int ag71xx_open(struct net_device *ndev)
|
||||
if (ret) {
|
||||
netif_err(ag, link, ndev, "phylink_of_phy_connect filed with err: %i\n",
|
||||
ret);
|
||||
goto err;
|
||||
return ret;
|
||||
}
|
||||
|
||||
max_frame_len = ag71xx_max_frame_len(ndev->mtu);
|
||||
@ -1448,6 +1448,7 @@ static int ag71xx_open(struct net_device *ndev)
|
||||
|
||||
err:
|
||||
ag71xx_rings_cleanup(ag);
|
||||
phylink_disconnect_phy(ag->phylink);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1568,7 +1568,6 @@ void bgmac_enet_remove(struct bgmac *bgmac)
|
||||
phy_disconnect(bgmac->net_dev->phydev);
|
||||
netif_napi_del(&bgmac->napi);
|
||||
bgmac_dma_free(bgmac);
|
||||
free_netdev(bgmac->net_dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bgmac_enet_remove);
|
||||
|
||||
|
@ -14037,8 +14037,16 @@ static struct pci_driver bnxt_pci_driver = {
|
||||
|
||||
static int __init bnxt_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
bnxt_debug_init();
|
||||
return pci_register_driver(&bnxt_pci_driver);
|
||||
err = pci_register_driver(&bnxt_pci_driver);
|
||||
if (err) {
|
||||
bnxt_debug_exit();
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit bnxt_exit(void)
|
||||
|
@ -1794,13 +1794,10 @@ static int liquidio_open(struct net_device *netdev)
|
||||
|
||||
ifstate_set(lio, LIO_IFSTATE_RUNNING);
|
||||
|
||||
if (OCTEON_CN23XX_PF(oct)) {
|
||||
if (!oct->msix_on)
|
||||
if (setup_tx_poll_fn(netdev))
|
||||
return -1;
|
||||
} else {
|
||||
if (setup_tx_poll_fn(netdev))
|
||||
return -1;
|
||||
if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on)) {
|
||||
ret = setup_tx_poll_fn(netdev);
|
||||
if (ret)
|
||||
goto err_poll;
|
||||
}
|
||||
|
||||
netif_tx_start_all_queues(netdev);
|
||||
@ -1813,7 +1810,7 @@ static int liquidio_open(struct net_device *netdev)
|
||||
/* tell Octeon to start forwarding packets to host */
|
||||
ret = send_rx_ctrl_cmd(lio, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_rx_ctrl;
|
||||
|
||||
/* start periodical statistics fetch */
|
||||
INIT_DELAYED_WORK(&lio->stats_wk.work, lio_fetch_stats);
|
||||
@ -1824,6 +1821,27 @@ static int liquidio_open(struct net_device *netdev)
|
||||
dev_info(&oct->pci_dev->dev, "%s interface is opened\n",
|
||||
netdev->name);
|
||||
|
||||
return 0;
|
||||
|
||||
err_rx_ctrl:
|
||||
if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on))
|
||||
cleanup_tx_poll_fn(netdev);
|
||||
err_poll:
|
||||
if (lio->ptp_clock) {
|
||||
ptp_clock_unregister(lio->ptp_clock);
|
||||
lio->ptp_clock = NULL;
|
||||
}
|
||||
|
||||
if (oct->props[lio->ifidx].napi_enabled == 1) {
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
napi_disable(napi);
|
||||
|
||||
oct->props[lio->ifidx].napi_enabled = 0;
|
||||
|
||||
if (OCTEON_CN23XX_PF(oct))
|
||||
oct->droq[0]->ops.poll_mode = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -819,7 +819,6 @@ struct hnae3_knic_private_info {
|
||||
const struct hnae3_dcb_ops *dcb_ops;
|
||||
|
||||
u16 int_rl_setting;
|
||||
enum pkt_hash_types rss_type;
|
||||
void __iomem *io_base;
|
||||
};
|
||||
|
||||
|
@ -191,23 +191,6 @@ u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle)
|
||||
return HCLGE_COMM_RSS_KEY_SIZE;
|
||||
}
|
||||
|
||||
void hclge_comm_get_rss_type(struct hnae3_handle *nic,
|
||||
struct hclge_comm_rss_tuple_cfg *rss_tuple_sets)
|
||||
{
|
||||
if (rss_tuple_sets->ipv4_tcp_en ||
|
||||
rss_tuple_sets->ipv4_udp_en ||
|
||||
rss_tuple_sets->ipv4_sctp_en ||
|
||||
rss_tuple_sets->ipv6_tcp_en ||
|
||||
rss_tuple_sets->ipv6_udp_en ||
|
||||
rss_tuple_sets->ipv6_sctp_en)
|
||||
nic->kinfo.rss_type = PKT_HASH_TYPE_L4;
|
||||
else if (rss_tuple_sets->ipv4_fragment_en ||
|
||||
rss_tuple_sets->ipv6_fragment_en)
|
||||
nic->kinfo.rss_type = PKT_HASH_TYPE_L3;
|
||||
else
|
||||
nic->kinfo.rss_type = PKT_HASH_TYPE_NONE;
|
||||
}
|
||||
|
||||
int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
|
||||
const u8 hfunc, u8 *hash_algo)
|
||||
{
|
||||
@ -344,9 +327,6 @@ int hclge_comm_set_rss_input_tuple(struct hnae3_handle *nic,
|
||||
req->ipv6_sctp_en = rss_cfg->rss_tuple_sets.ipv6_sctp_en;
|
||||
req->ipv6_fragment_en = rss_cfg->rss_tuple_sets.ipv6_fragment_en;
|
||||
|
||||
if (is_pf)
|
||||
hclge_comm_get_rss_type(nic, &rss_cfg->rss_tuple_sets);
|
||||
|
||||
ret = hclge_comm_cmd_send(hw, &desc, 1);
|
||||
if (ret)
|
||||
dev_err(&hw->cmq.csq.pdev->dev,
|
||||
|
@ -95,8 +95,6 @@ struct hclge_comm_rss_tc_mode_cmd {
|
||||
};
|
||||
|
||||
u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle);
|
||||
void hclge_comm_get_rss_type(struct hnae3_handle *nic,
|
||||
struct hclge_comm_rss_tuple_cfg *rss_tuple_sets);
|
||||
void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
|
||||
struct hclge_comm_rss_cfg *rss_cfg);
|
||||
int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
|
||||
|
@ -105,26 +105,28 @@ static const struct pci_device_id hns3_pci_tbl[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, hns3_pci_tbl);
|
||||
|
||||
#define HNS3_RX_PTYPE_ENTRY(ptype, l, s, t) \
|
||||
#define HNS3_RX_PTYPE_ENTRY(ptype, l, s, t, h) \
|
||||
{ ptype, \
|
||||
l, \
|
||||
CHECKSUM_##s, \
|
||||
HNS3_L3_TYPE_##t, \
|
||||
1 }
|
||||
1, \
|
||||
h}
|
||||
|
||||
#define HNS3_RX_PTYPE_UNUSED_ENTRY(ptype) \
|
||||
{ ptype, 0, CHECKSUM_NONE, HNS3_L3_TYPE_PARSE_FAIL, 0 }
|
||||
{ ptype, 0, CHECKSUM_NONE, HNS3_L3_TYPE_PARSE_FAIL, 0, \
|
||||
PKT_HASH_TYPE_NONE }
|
||||
|
||||
static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(0),
|
||||
HNS3_RX_PTYPE_ENTRY(1, 0, COMPLETE, ARP),
|
||||
HNS3_RX_PTYPE_ENTRY(2, 0, COMPLETE, RARP),
|
||||
HNS3_RX_PTYPE_ENTRY(3, 0, COMPLETE, LLDP),
|
||||
HNS3_RX_PTYPE_ENTRY(4, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(5, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(6, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(7, 0, COMPLETE, CNM),
|
||||
HNS3_RX_PTYPE_ENTRY(8, 0, NONE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(1, 0, COMPLETE, ARP, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(2, 0, COMPLETE, RARP, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(3, 0, COMPLETE, LLDP, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(4, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(5, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(6, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(7, 0, COMPLETE, CNM, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(8, 0, NONE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(9),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(10),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(11),
|
||||
@ -132,36 +134,36 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(13),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(14),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(15),
|
||||
HNS3_RX_PTYPE_ENTRY(16, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(17, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(18, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(19, 0, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(20, 0, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(21, 0, NONE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(22, 0, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(23, 0, NONE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(24, 0, NONE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(25, 0, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(16, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(17, 0, COMPLETE, IPV4, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(18, 0, COMPLETE, IPV4, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(19, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(20, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(21, 0, NONE, IPV4, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(22, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(23, 0, NONE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(24, 0, NONE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(25, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(26),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(27),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(28),
|
||||
HNS3_RX_PTYPE_ENTRY(29, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(30, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(31, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(32, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(33, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(34, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(35, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(36, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(37, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(29, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(30, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(31, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(32, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(33, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(34, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(35, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(36, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(37, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(38),
|
||||
HNS3_RX_PTYPE_ENTRY(39, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(40, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(41, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(42, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(43, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(44, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(45, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(39, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(40, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(41, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(42, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(43, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(44, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(45, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(46),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(47),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(48),
|
||||
@ -227,35 +229,35 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(108),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(109),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(110),
|
||||
HNS3_RX_PTYPE_ENTRY(111, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(112, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(113, 0, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(114, 0, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(115, 0, NONE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(116, 0, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(117, 0, NONE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(118, 0, NONE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(119, 0, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(111, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(112, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(113, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(114, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(115, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(116, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(117, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(118, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(119, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(120),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(121),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(122),
|
||||
HNS3_RX_PTYPE_ENTRY(123, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(124, 0, COMPLETE, PARSE_FAIL),
|
||||
HNS3_RX_PTYPE_ENTRY(125, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(126, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(127, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(128, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(129, 1, UNNECESSARY, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(130, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(131, 0, COMPLETE, IPV4),
|
||||
HNS3_RX_PTYPE_ENTRY(123, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(124, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
|
||||
HNS3_RX_PTYPE_ENTRY(125, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(126, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(127, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(128, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(129, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(130, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(131, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(132),
|
||||
HNS3_RX_PTYPE_ENTRY(133, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(134, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(135, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(136, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(137, 1, UNNECESSARY, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(138, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(139, 0, COMPLETE, IPV6),
|
||||
HNS3_RX_PTYPE_ENTRY(133, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(134, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(135, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(136, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(137, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
|
||||
HNS3_RX_PTYPE_ENTRY(138, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_ENTRY(139, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(140),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(141),
|
||||
HNS3_RX_PTYPE_UNUSED_ENTRY(142),
|
||||
@ -3776,8 +3778,8 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
|
||||
desc_cb->reuse_flag = 1;
|
||||
} else if (frag_size <= ring->rx_copybreak) {
|
||||
ret = hns3_handle_rx_copybreak(skb, i, ring, pull_len, desc_cb);
|
||||
if (ret)
|
||||
goto out;
|
||||
if (!ret)
|
||||
return;
|
||||
}
|
||||
|
||||
out:
|
||||
@ -4171,15 +4173,35 @@ static int hns3_set_gro_and_checksum(struct hns3_enet_ring *ring,
|
||||
}
|
||||
|
||||
static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
|
||||
struct sk_buff *skb, u32 rss_hash)
|
||||
struct sk_buff *skb, u32 rss_hash,
|
||||
u32 l234info, u32 ol_info)
|
||||
{
|
||||
struct hnae3_handle *handle = ring->tqp->handle;
|
||||
enum pkt_hash_types rss_type;
|
||||
enum pkt_hash_types rss_type = PKT_HASH_TYPE_NONE;
|
||||
struct net_device *netdev = ring_to_netdev(ring);
|
||||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
|
||||
if (rss_hash)
|
||||
rss_type = handle->kinfo.rss_type;
|
||||
else
|
||||
rss_type = PKT_HASH_TYPE_NONE;
|
||||
if (test_bit(HNS3_NIC_STATE_RXD_ADV_LAYOUT_ENABLE, &priv->state)) {
|
||||
u32 ptype = hnae3_get_field(ol_info, HNS3_RXD_PTYPE_M,
|
||||
HNS3_RXD_PTYPE_S);
|
||||
|
||||
rss_type = hns3_rx_ptype_tbl[ptype].hash_type;
|
||||
} else {
|
||||
int l3_type = hnae3_get_field(l234info, HNS3_RXD_L3ID_M,
|
||||
HNS3_RXD_L3ID_S);
|
||||
int l4_type = hnae3_get_field(l234info, HNS3_RXD_L4ID_M,
|
||||
HNS3_RXD_L4ID_S);
|
||||
|
||||
if (l3_type == HNS3_L3_TYPE_IPV4 ||
|
||||
l3_type == HNS3_L3_TYPE_IPV6) {
|
||||
if (l4_type == HNS3_L4_TYPE_UDP ||
|
||||
l4_type == HNS3_L4_TYPE_TCP ||
|
||||
l4_type == HNS3_L4_TYPE_SCTP)
|
||||
rss_type = PKT_HASH_TYPE_L4;
|
||||
else if (l4_type == HNS3_L4_TYPE_IGMP ||
|
||||
l4_type == HNS3_L4_TYPE_ICMP)
|
||||
rss_type = PKT_HASH_TYPE_L3;
|
||||
}
|
||||
}
|
||||
|
||||
skb_set_hash(skb, rss_hash, rss_type);
|
||||
}
|
||||
@ -4282,7 +4304,8 @@ static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb)
|
||||
|
||||
ring->tqp_vector->rx_group.total_bytes += len;
|
||||
|
||||
hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash));
|
||||
hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash),
|
||||
l234info, ol_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -404,6 +404,7 @@ struct hns3_rx_ptype {
|
||||
u32 ip_summed : 2;
|
||||
u32 l3_type : 4;
|
||||
u32 valid : 1;
|
||||
u32 hash_type: 3;
|
||||
};
|
||||
|
||||
struct ring_stats {
|
||||
|
@ -3443,6 +3443,7 @@ static int hclge_update_tp_port_info(struct hclge_dev *hdev)
|
||||
hdev->hw.mac.autoneg = cmd.base.autoneg;
|
||||
hdev->hw.mac.speed = cmd.base.speed;
|
||||
hdev->hw.mac.duplex = cmd.base.duplex;
|
||||
linkmode_copy(hdev->hw.mac.advertising, cmd.link_modes.advertising);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4859,7 +4860,6 @@ static int hclge_set_rss_tuple(struct hnae3_handle *handle,
|
||||
return ret;
|
||||
}
|
||||
|
||||
hclge_comm_get_rss_type(&vport->nic, &hdev->rss_cfg.rss_tuple_sets);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -11587,9 +11587,12 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||
if (ret)
|
||||
goto err_msi_irq_uninit;
|
||||
|
||||
if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER &&
|
||||
!hnae3_dev_phy_imp_supported(hdev)) {
|
||||
ret = hclge_mac_mdio_config(hdev);
|
||||
if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER) {
|
||||
if (hnae3_dev_phy_imp_supported(hdev))
|
||||
ret = hclge_update_tp_port_info(hdev);
|
||||
else
|
||||
ret = hclge_mac_mdio_config(hdev);
|
||||
|
||||
if (ret)
|
||||
goto err_msi_irq_uninit;
|
||||
}
|
||||
|
@ -1474,8 +1474,15 @@ static struct pci_driver hinic_driver = {
|
||||
|
||||
static int __init hinic_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
hinic_dbg_register_debugfs(HINIC_DRV_NAME);
|
||||
return pci_register_driver(&hinic_driver);
|
||||
|
||||
ret = pci_register_driver(&hinic_driver);
|
||||
if (ret)
|
||||
hinic_dbg_unregister_debugfs();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit hinic_module_exit(void)
|
||||
|
@ -521,14 +521,12 @@ static int octep_open(struct net_device *netdev)
|
||||
octep_oq_dbell_init(oct);
|
||||
|
||||
ret = octep_get_link_status(oct);
|
||||
if (ret)
|
||||
if (ret > 0)
|
||||
octep_link_up(netdev);
|
||||
|
||||
return 0;
|
||||
|
||||
set_queues_err:
|
||||
octep_napi_disable(oct);
|
||||
octep_napi_delete(oct);
|
||||
octep_clean_irqs(oct);
|
||||
setup_irq_err:
|
||||
octep_free_oqs(oct);
|
||||
@ -958,7 +956,7 @@ int octep_device_setup(struct octep_device *oct)
|
||||
ret = octep_ctrl_mbox_init(ctrl_mbox);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to initialize control mbox\n");
|
||||
return -1;
|
||||
goto unsupported_dev;
|
||||
}
|
||||
oct->ctrl_mbox_ifstats_offset = OCTEP_CTRL_MBOX_SZ(ctrl_mbox->h2fq.elem_sz,
|
||||
ctrl_mbox->h2fq.elem_cnt,
|
||||
@ -968,6 +966,10 @@ int octep_device_setup(struct octep_device *oct)
|
||||
return 0;
|
||||
|
||||
unsupported_dev:
|
||||
for (i = 0; i < OCTEP_MMIO_REGIONS; i++)
|
||||
iounmap(oct->mmio[i].hw_addr);
|
||||
|
||||
kfree(oct->conf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1070,7 +1072,11 @@ static int octep_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
netdev->max_mtu = OCTEP_MAX_MTU;
|
||||
netdev->mtu = OCTEP_DEFAULT_MTU;
|
||||
|
||||
octep_get_mac_addr(octep_dev, octep_dev->mac_addr);
|
||||
err = octep_get_mac_addr(octep_dev, octep_dev->mac_addr);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Failed to get mac address\n");
|
||||
goto register_dev_err;
|
||||
}
|
||||
eth_hw_addr_set(netdev, octep_dev->mac_addr);
|
||||
|
||||
err = register_netdev(netdev);
|
||||
|
@ -3470,6 +3470,8 @@ mlxsw_sp_switchdev_vxlan_fdb_del(struct mlxsw_sp *mlxsw_sp,
|
||||
u16 vid;
|
||||
|
||||
vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
|
||||
if (!vxlan_fdb_info->offloaded)
|
||||
return;
|
||||
|
||||
bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
|
||||
if (!bridge_device)
|
||||
|
@ -716,6 +716,9 @@ int lan966x_stats_init(struct lan966x *lan966x)
|
||||
snprintf(queue_name, sizeof(queue_name), "%s-stats",
|
||||
dev_name(lan966x->dev));
|
||||
lan966x->stats_queue = create_singlethread_workqueue(queue_name);
|
||||
if (!lan966x->stats_queue)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_DELAYED_WORK(&lan966x->stats_work, lan966x_check_stats_work);
|
||||
queue_delayed_work(lan966x->stats_queue, &lan966x->stats_work,
|
||||
LAN966X_STATS_CHECK_DELAY);
|
||||
|
@ -1253,6 +1253,9 @@ int sparx_stats_init(struct sparx5 *sparx5)
|
||||
snprintf(queue_name, sizeof(queue_name), "%s-stats",
|
||||
dev_name(sparx5->dev));
|
||||
sparx5->stats_queue = create_singlethread_workqueue(queue_name);
|
||||
if (!sparx5->stats_queue)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_DELAYED_WORK(&sparx5->stats_work, sparx5_check_stats_work);
|
||||
queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work,
|
||||
SPX5_STATS_CHECK_DELAY);
|
||||
|
@ -659,6 +659,9 @@ static int sparx5_start(struct sparx5 *sparx5)
|
||||
snprintf(queue_name, sizeof(queue_name), "%s-mact",
|
||||
dev_name(sparx5->dev));
|
||||
sparx5->mact_queue = create_singlethread_workqueue(queue_name);
|
||||
if (!sparx5->mact_queue)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_DELAYED_WORK(&sparx5->mact_work, sparx5_mact_pull_work);
|
||||
queue_delayed_work(sparx5->mact_queue, &sparx5->mact_work,
|
||||
SPX5_MACT_PULL_DELAY);
|
||||
|
@ -1477,15 +1477,15 @@ nfp_port_get_module_info(struct net_device *netdev,
|
||||
|
||||
if (data < 0x3) {
|
||||
modinfo->type = ETH_MODULE_SFF_8436;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
|
||||
} else {
|
||||
modinfo->type = ETH_MODULE_SFF_8636;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
|
||||
}
|
||||
break;
|
||||
case NFP_INTERFACE_QSFP28:
|
||||
modinfo->type = ETH_MODULE_SFF_8636;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN;
|
||||
modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
|
||||
break;
|
||||
default:
|
||||
netdev_err(netdev, "Unsupported module 0x%x detected\n",
|
||||
|
@ -687,8 +687,14 @@ int ionic_port_reset(struct ionic *ionic)
|
||||
|
||||
static int __init ionic_init_module(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ionic_debugfs_create();
|
||||
return ionic_bus_register_driver();
|
||||
ret = ionic_bus_register_driver();
|
||||
if (ret)
|
||||
ionic_debugfs_destroy();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ionic_cleanup_module(void)
|
||||
|
@ -6548,6 +6548,9 @@ void stmmac_xdp_release(struct net_device *dev)
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
u32 chan;
|
||||
|
||||
/* Ensure tx function is not running */
|
||||
netif_tx_disable(dev);
|
||||
|
||||
/* Disable NAPI process */
|
||||
stmmac_disable_all_queues(priv);
|
||||
|
||||
|
@ -141,7 +141,7 @@ static struct macvlan_source_entry *macvlan_hash_lookup_source(
|
||||
u32 idx = macvlan_eth_hash(addr);
|
||||
struct hlist_head *h = &vlan->port->vlan_source_hash[idx];
|
||||
|
||||
hlist_for_each_entry_rcu(entry, h, hlist) {
|
||||
hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
|
||||
if (ether_addr_equal_64bits(entry->addr, addr) &&
|
||||
entry->vlan == vlan)
|
||||
return entry;
|
||||
@ -1647,7 +1647,7 @@ static int macvlan_fill_info_macaddr(struct sk_buff *skb,
|
||||
struct hlist_head *h = &vlan->port->vlan_source_hash[i];
|
||||
struct macvlan_source_entry *entry;
|
||||
|
||||
hlist_for_each_entry_rcu(entry, h, hlist) {
|
||||
hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
|
||||
if (entry->vlan != vlan)
|
||||
continue;
|
||||
if (nla_put(skb, IFLA_MACVLAN_MACADDR, ETH_ALEN, entry->addr))
|
||||
|
@ -43,6 +43,7 @@
|
||||
enum {
|
||||
MCTP_I2C_FLOW_STATE_NEW = 0,
|
||||
MCTP_I2C_FLOW_STATE_ACTIVE,
|
||||
MCTP_I2C_FLOW_STATE_INVALID,
|
||||
};
|
||||
|
||||
/* List of all struct mctp_i2c_client
|
||||
@ -374,12 +375,18 @@ mctp_i2c_get_tx_flow_state(struct mctp_i2c_dev *midev, struct sk_buff *skb)
|
||||
*/
|
||||
if (!key->valid) {
|
||||
state = MCTP_I2C_TX_FLOW_INVALID;
|
||||
|
||||
} else if (key->dev_flow_state == MCTP_I2C_FLOW_STATE_NEW) {
|
||||
key->dev_flow_state = MCTP_I2C_FLOW_STATE_ACTIVE;
|
||||
state = MCTP_I2C_TX_FLOW_NEW;
|
||||
} else {
|
||||
state = MCTP_I2C_TX_FLOW_EXISTING;
|
||||
switch (key->dev_flow_state) {
|
||||
case MCTP_I2C_FLOW_STATE_NEW:
|
||||
key->dev_flow_state = MCTP_I2C_FLOW_STATE_ACTIVE;
|
||||
state = MCTP_I2C_TX_FLOW_NEW;
|
||||
break;
|
||||
case MCTP_I2C_FLOW_STATE_ACTIVE:
|
||||
state = MCTP_I2C_TX_FLOW_EXISTING;
|
||||
break;
|
||||
default:
|
||||
state = MCTP_I2C_TX_FLOW_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&key->lock, flags);
|
||||
@ -617,21 +624,31 @@ static void mctp_i2c_release_flow(struct mctp_dev *mdev,
|
||||
|
||||
{
|
||||
struct mctp_i2c_dev *midev = netdev_priv(mdev->dev);
|
||||
bool queue_release = false;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&midev->lock, flags);
|
||||
midev->release_count++;
|
||||
/* if we have seen the flow/key previously, we need to pair the
|
||||
* original lock with a release
|
||||
*/
|
||||
if (key->dev_flow_state == MCTP_I2C_FLOW_STATE_ACTIVE) {
|
||||
midev->release_count++;
|
||||
queue_release = true;
|
||||
}
|
||||
key->dev_flow_state = MCTP_I2C_FLOW_STATE_INVALID;
|
||||
spin_unlock_irqrestore(&midev->lock, flags);
|
||||
|
||||
/* Ensure we have a release operation queued, through the fake
|
||||
* marker skb
|
||||
*/
|
||||
spin_lock(&midev->tx_queue.lock);
|
||||
if (!midev->unlock_marker.next)
|
||||
__skb_queue_tail(&midev->tx_queue, &midev->unlock_marker);
|
||||
spin_unlock(&midev->tx_queue.lock);
|
||||
|
||||
wake_up(&midev->tx_wq);
|
||||
if (queue_release) {
|
||||
/* Ensure we have a release operation queued, through the fake
|
||||
* marker skb
|
||||
*/
|
||||
spin_lock(&midev->tx_queue.lock);
|
||||
if (!midev->unlock_marker.next)
|
||||
__skb_queue_tail(&midev->tx_queue,
|
||||
&midev->unlock_marker);
|
||||
spin_unlock(&midev->tx_queue.lock);
|
||||
wake_up(&midev->tx_wq);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct net_device_ops mctp_i2c_ops = {
|
||||
|
@ -343,6 +343,8 @@ static void mhi_net_dellink(struct mhi_device *mhi_dev, struct net_device *ndev)
|
||||
|
||||
kfree_skb(mhi_netdev->skbagg_head);
|
||||
|
||||
free_netdev(ndev);
|
||||
|
||||
dev_set_drvdata(&mhi_dev->dev, NULL);
|
||||
}
|
||||
|
||||
|
@ -1683,6 +1683,7 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
devl_resources_unregister(devlink);
|
||||
kfree(nsim_dev->vfconfigs);
|
||||
kfree(nsim_dev->fa_cookie);
|
||||
devl_unlock(devlink);
|
||||
devlink_free(devlink);
|
||||
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
|
||||
|
@ -682,6 +682,13 @@ static int dp83867_of_init(struct phy_device *phydev)
|
||||
*/
|
||||
dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
|
||||
|
||||
/* For non-OF device, the RX and TX FIFO depths are taken from
|
||||
* default value. So, we init RX & TX FIFO depths here
|
||||
* so that it is configured correctly later in dp83867_config_init();
|
||||
*/
|
||||
dp83867->tx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
|
||||
dp83867->rx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_OF_MDIO */
|
||||
|
@ -2015,14 +2015,16 @@ static int m88e1510_loopback(struct phy_device *phydev, bool enable)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* FIXME: Based on trial and error test, it seem 1G need to have
|
||||
* delay between soft reset and loopback enablement.
|
||||
*/
|
||||
if (phydev->speed == SPEED_1000)
|
||||
msleep(1000);
|
||||
err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
|
||||
BMCR_LOOPBACK);
|
||||
|
||||
return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
|
||||
BMCR_LOOPBACK);
|
||||
if (!err) {
|
||||
/* It takes some time for PHY device to switch
|
||||
* into/out-of loopback mode.
|
||||
*/
|
||||
msleep(1000);
|
||||
}
|
||||
return err;
|
||||
} else {
|
||||
err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0);
|
||||
if (err < 0)
|
||||
|
@ -1391,12 +1391,21 @@ static int __init tbnet_init(void)
|
||||
tb_property_add_immediate(tbnet_dir, "prtcstns", flags);
|
||||
|
||||
ret = tb_register_property_dir("network", tbnet_dir);
|
||||
if (ret) {
|
||||
tb_property_free_dir(tbnet_dir);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err_free_dir;
|
||||
|
||||
return tb_register_service_driver(&tbnet_driver);
|
||||
ret = tb_register_service_driver(&tbnet_driver);
|
||||
if (ret)
|
||||
goto err_unregister;
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister:
|
||||
tb_unregister_property_dir("network", tbnet_dir);
|
||||
err_free_dir:
|
||||
tb_property_free_dir(tbnet_dir);
|
||||
|
||||
return ret;
|
||||
}
|
||||
module_init(tbnet_init);
|
||||
|
||||
|
@ -1357,6 +1357,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
||||
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1057, 2)}, /* Telit FN980 */
|
||||
|
@ -66,6 +66,7 @@ struct smsc95xx_priv {
|
||||
spinlock_t mac_cr_lock;
|
||||
u8 features;
|
||||
u8 suspend_flags;
|
||||
bool is_internal_phy;
|
||||
struct irq_chip irqchip;
|
||||
struct irq_domain *irqdomain;
|
||||
struct fwnode_handle *irqfwnode;
|
||||
@ -252,6 +253,43 @@ done:
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
}
|
||||
|
||||
static int smsc95xx_mdiobus_reset(struct mii_bus *bus)
|
||||
{
|
||||
struct smsc95xx_priv *pdata;
|
||||
struct usbnet *dev;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
dev = bus->priv;
|
||||
pdata = dev->driver_priv;
|
||||
|
||||
if (pdata->is_internal_phy)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&dev->phy_mutex);
|
||||
|
||||
ret = smsc95xx_read_reg(dev, PM_CTRL, &val);
|
||||
if (ret < 0)
|
||||
goto reset_out;
|
||||
|
||||
val |= PM_CTL_PHY_RST_;
|
||||
|
||||
ret = smsc95xx_write_reg(dev, PM_CTRL, val);
|
||||
if (ret < 0)
|
||||
goto reset_out;
|
||||
|
||||
/* Driver has no knowledge at this point about the external PHY.
|
||||
* The 802.3 specifies that the reset process shall
|
||||
* be completed within 0.5 s.
|
||||
*/
|
||||
fsleep(500000);
|
||||
|
||||
reset_out:
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx)
|
||||
{
|
||||
struct usbnet *dev = bus->priv;
|
||||
@ -1052,7 +1090,6 @@ static void smsc95xx_handle_link_change(struct net_device *net)
|
||||
static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct smsc95xx_priv *pdata;
|
||||
bool is_internal_phy;
|
||||
char usb_path[64];
|
||||
int ret, phy_irq;
|
||||
u32 val;
|
||||
@ -1133,13 +1170,14 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
if (ret < 0)
|
||||
goto free_mdio;
|
||||
|
||||
is_internal_phy = !(val & HW_CFG_PSEL_);
|
||||
if (is_internal_phy)
|
||||
pdata->is_internal_phy = !(val & HW_CFG_PSEL_);
|
||||
if (pdata->is_internal_phy)
|
||||
pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID);
|
||||
|
||||
pdata->mdiobus->priv = dev;
|
||||
pdata->mdiobus->read = smsc95xx_mdiobus_read;
|
||||
pdata->mdiobus->write = smsc95xx_mdiobus_write;
|
||||
pdata->mdiobus->reset = smsc95xx_mdiobus_reset;
|
||||
pdata->mdiobus->name = "smsc95xx-mdiobus";
|
||||
pdata->mdiobus->parent = &dev->udev->dev;
|
||||
|
||||
@ -1160,7 +1198,7 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
}
|
||||
|
||||
pdata->phydev->irq = phy_irq;
|
||||
pdata->phydev->is_internal = is_internal_phy;
|
||||
pdata->phydev->is_internal = pdata->is_internal_phy;
|
||||
|
||||
/* detect device revision as different features may be available */
|
||||
ret = smsc95xx_read_reg(dev, ID_REV, &val);
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include <linux/bpfptr.h>
|
||||
#include <linux/btf.h>
|
||||
#include <linux/rcupdate_trace.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/static_call.h>
|
||||
|
||||
struct bpf_verifier_env;
|
||||
struct bpf_verifier_log;
|
||||
@ -315,7 +315,7 @@ static inline void __copy_map_value(struct bpf_map *map, void *dst, void *src, b
|
||||
u32 next_off = map->off_arr->field_off[i];
|
||||
|
||||
memcpy(dst + curr_off, src + curr_off, next_off - curr_off);
|
||||
curr_off += map->off_arr->field_sz[i];
|
||||
curr_off = next_off + map->off_arr->field_sz[i];
|
||||
}
|
||||
memcpy(dst + curr_off, src + curr_off, map->value_size - curr_off);
|
||||
}
|
||||
@ -344,7 +344,7 @@ static inline void zero_map_value(struct bpf_map *map, void *dst)
|
||||
u32 next_off = map->off_arr->field_off[i];
|
||||
|
||||
memset(dst + curr_off, 0, next_off - curr_off);
|
||||
curr_off += map->off_arr->field_sz[i];
|
||||
curr_off = next_off + map->off_arr->field_sz[i];
|
||||
}
|
||||
memset(dst + curr_off, 0, map->value_size - curr_off);
|
||||
}
|
||||
@ -954,6 +954,10 @@ struct bpf_dispatcher {
|
||||
void *rw_image;
|
||||
u32 image_off;
|
||||
struct bpf_ksym ksym;
|
||||
#ifdef CONFIG_HAVE_STATIC_CALL
|
||||
struct static_call_key *sc_key;
|
||||
void *sc_tramp;
|
||||
#endif
|
||||
};
|
||||
|
||||
static __always_inline __nocfi unsigned int bpf_dispatcher_nop_func(
|
||||
@ -971,7 +975,33 @@ struct bpf_trampoline *bpf_trampoline_get(u64 key,
|
||||
struct bpf_attach_target_info *tgt_info);
|
||||
void bpf_trampoline_put(struct bpf_trampoline *tr);
|
||||
int arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int num_funcs);
|
||||
int __init bpf_arch_init_dispatcher_early(void *ip);
|
||||
|
||||
/*
|
||||
* When the architecture supports STATIC_CALL replace the bpf_dispatcher_fn
|
||||
* indirection with a direct call to the bpf program. If the architecture does
|
||||
* not have STATIC_CALL, avoid a double-indirection.
|
||||
*/
|
||||
#ifdef CONFIG_HAVE_STATIC_CALL
|
||||
|
||||
#define __BPF_DISPATCHER_SC_INIT(_name) \
|
||||
.sc_key = &STATIC_CALL_KEY(_name), \
|
||||
.sc_tramp = STATIC_CALL_TRAMP_ADDR(_name),
|
||||
|
||||
#define __BPF_DISPATCHER_SC(name) \
|
||||
DEFINE_STATIC_CALL(bpf_dispatcher_##name##_call, bpf_dispatcher_nop_func)
|
||||
|
||||
#define __BPF_DISPATCHER_CALL(name) \
|
||||
static_call(bpf_dispatcher_##name##_call)(ctx, insnsi, bpf_func)
|
||||
|
||||
#define __BPF_DISPATCHER_UPDATE(_d, _new) \
|
||||
__static_call_update((_d)->sc_key, (_d)->sc_tramp, (_new))
|
||||
|
||||
#else
|
||||
#define __BPF_DISPATCHER_SC_INIT(name)
|
||||
#define __BPF_DISPATCHER_SC(name)
|
||||
#define __BPF_DISPATCHER_CALL(name) bpf_func(ctx, insnsi)
|
||||
#define __BPF_DISPATCHER_UPDATE(_d, _new)
|
||||
#endif
|
||||
|
||||
#define BPF_DISPATCHER_INIT(_name) { \
|
||||
.mutex = __MUTEX_INITIALIZER(_name.mutex), \
|
||||
@ -984,34 +1014,21 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
|
||||
.name = #_name, \
|
||||
.lnode = LIST_HEAD_INIT(_name.ksym.lnode), \
|
||||
}, \
|
||||
__BPF_DISPATCHER_SC_INIT(_name##_call) \
|
||||
}
|
||||
|
||||
#define BPF_DISPATCHER_INIT_CALL(_name) \
|
||||
static int __init _name##_init(void) \
|
||||
{ \
|
||||
return bpf_arch_init_dispatcher_early(_name##_func); \
|
||||
} \
|
||||
early_initcall(_name##_init)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define BPF_DISPATCHER_ATTRIBUTES __attribute__((patchable_function_entry(5)))
|
||||
#else
|
||||
#define BPF_DISPATCHER_ATTRIBUTES
|
||||
#endif
|
||||
|
||||
#define DEFINE_BPF_DISPATCHER(name) \
|
||||
notrace BPF_DISPATCHER_ATTRIBUTES \
|
||||
__BPF_DISPATCHER_SC(name); \
|
||||
noinline __nocfi unsigned int bpf_dispatcher_##name##_func( \
|
||||
const void *ctx, \
|
||||
const struct bpf_insn *insnsi, \
|
||||
bpf_func_t bpf_func) \
|
||||
{ \
|
||||
return bpf_func(ctx, insnsi); \
|
||||
return __BPF_DISPATCHER_CALL(name); \
|
||||
} \
|
||||
EXPORT_SYMBOL(bpf_dispatcher_##name##_func); \
|
||||
struct bpf_dispatcher bpf_dispatcher_##name = \
|
||||
BPF_DISPATCHER_INIT(bpf_dispatcher_##name); \
|
||||
BPF_DISPATCHER_INIT_CALL(bpf_dispatcher_##name);
|
||||
BPF_DISPATCHER_INIT(bpf_dispatcher_##name);
|
||||
|
||||
#define DECLARE_BPF_DISPATCHER(name) \
|
||||
unsigned int bpf_dispatcher_##name##_func( \
|
||||
@ -1019,6 +1036,7 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
|
||||
const struct bpf_insn *insnsi, \
|
||||
bpf_func_t bpf_func); \
|
||||
extern struct bpf_dispatcher bpf_dispatcher_##name;
|
||||
|
||||
#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_##name##_func
|
||||
#define BPF_DISPATCHER_PTR(name) (&bpf_dispatcher_##name)
|
||||
void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,
|
||||
|
@ -563,7 +563,7 @@ static inline void iph_to_flow_copy_v4addrs(struct flow_keys *flow,
|
||||
BUILD_BUG_ON(offsetof(typeof(flow->addrs), v4addrs.dst) !=
|
||||
offsetof(typeof(flow->addrs), v4addrs.src) +
|
||||
sizeof(flow->addrs.v4addrs.src));
|
||||
memcpy(&flow->addrs.v4addrs, &iph->saddr, sizeof(flow->addrs.v4addrs));
|
||||
memcpy(&flow->addrs.v4addrs, &iph->addrs, sizeof(flow->addrs.v4addrs));
|
||||
flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
|
||||
}
|
||||
|
||||
|
@ -897,7 +897,7 @@ static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
|
||||
BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
|
||||
offsetof(typeof(flow->addrs), v6addrs.src) +
|
||||
sizeof(flow->addrs.v6addrs.src));
|
||||
memcpy(&flow->addrs.v6addrs, &iph->saddr, sizeof(flow->addrs.v6addrs));
|
||||
memcpy(&flow->addrs.v6addrs, &iph->addrs, sizeof(flow->addrs.v6addrs));
|
||||
flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
|
||||
}
|
||||
|
||||
|
@ -323,7 +323,7 @@ struct sk_filter;
|
||||
* @sk_tskey: counter to disambiguate concurrent tstamp requests
|
||||
* @sk_zckey: counter to order MSG_ZEROCOPY notifications
|
||||
* @sk_socket: Identd and reporting IO signals
|
||||
* @sk_user_data: RPC layer private data
|
||||
* @sk_user_data: RPC layer private data. Write-protected by @sk_callback_lock.
|
||||
* @sk_frag: cached page frag
|
||||
* @sk_peek_off: current peek_offset value
|
||||
* @sk_send_head: front of stuff to transmit
|
||||
|
@ -100,8 +100,10 @@ struct iphdr {
|
||||
__u8 ttl;
|
||||
__u8 protocol;
|
||||
__sum16 check;
|
||||
__be32 saddr;
|
||||
__be32 daddr;
|
||||
__struct_group(/* no tag */, addrs, /* no attrs */,
|
||||
__be32 saddr;
|
||||
__be32 daddr;
|
||||
);
|
||||
/*The options start here. */
|
||||
};
|
||||
|
||||
|
@ -130,8 +130,10 @@ struct ipv6hdr {
|
||||
__u8 nexthdr;
|
||||
__u8 hop_limit;
|
||||
|
||||
struct in6_addr saddr;
|
||||
struct in6_addr daddr;
|
||||
__struct_group(/* no tag */, addrs, /* no attrs */,
|
||||
struct in6_addr saddr;
|
||||
struct in6_addr daddr;
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <linux/hash.h>
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/static_call.h>
|
||||
|
||||
/* The BPF dispatcher is a multiway branch code generator. The
|
||||
* dispatcher is a mechanism to avoid the performance penalty of an
|
||||
@ -91,11 +91,6 @@ int __weak arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int n
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
int __weak __init bpf_arch_init_dispatcher_early(void *ip)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *buf)
|
||||
{
|
||||
s64 ips[BPF_DISPATCHER_MAX] = {}, *ipsp = &ips[0];
|
||||
@ -110,17 +105,11 @@ static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *b
|
||||
|
||||
static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)
|
||||
{
|
||||
void *old, *new, *tmp;
|
||||
u32 noff;
|
||||
int err;
|
||||
void *new, *tmp;
|
||||
u32 noff = 0;
|
||||
|
||||
if (!prev_num_progs) {
|
||||
old = NULL;
|
||||
noff = 0;
|
||||
} else {
|
||||
old = d->image + d->image_off;
|
||||
if (prev_num_progs)
|
||||
noff = d->image_off ^ (PAGE_SIZE / 2);
|
||||
}
|
||||
|
||||
new = d->num_progs ? d->image + noff : NULL;
|
||||
tmp = d->num_progs ? d->rw_image + noff : NULL;
|
||||
@ -134,11 +123,10 @@ static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)
|
||||
return;
|
||||
}
|
||||
|
||||
err = bpf_arch_text_poke(d->func, BPF_MOD_JUMP, old, new);
|
||||
if (err || !new)
|
||||
return;
|
||||
__BPF_DISPATCHER_UPDATE(d, new ?: (void *)&bpf_dispatcher_nop_func);
|
||||
|
||||
d->image_off = noff;
|
||||
if (new)
|
||||
d->image_off = noff;
|
||||
}
|
||||
|
||||
void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,
|
||||
|
@ -100,22 +100,21 @@ void pcpu_freelist_populate(struct pcpu_freelist *s, void *buf, u32 elem_size,
|
||||
u32 nr_elems)
|
||||
{
|
||||
struct pcpu_freelist_head *head;
|
||||
int i, cpu, pcpu_entries;
|
||||
unsigned int cpu, cpu_idx, i, j, n, m;
|
||||
|
||||
pcpu_entries = nr_elems / num_possible_cpus() + 1;
|
||||
i = 0;
|
||||
n = nr_elems / num_possible_cpus();
|
||||
m = nr_elems % num_possible_cpus();
|
||||
|
||||
cpu_idx = 0;
|
||||
for_each_possible_cpu(cpu) {
|
||||
again:
|
||||
head = per_cpu_ptr(s->freelist, cpu);
|
||||
/* No locking required as this is not visible yet. */
|
||||
pcpu_freelist_push_node(head, buf);
|
||||
i++;
|
||||
buf += elem_size;
|
||||
if (i == nr_elems)
|
||||
break;
|
||||
if (i % pcpu_entries)
|
||||
goto again;
|
||||
j = n + (cpu_idx < m ? 1 : 0);
|
||||
for (i = 0; i < j; i++) {
|
||||
/* No locking required as this is not visible yet. */
|
||||
pcpu_freelist_push_node(head, buf);
|
||||
buf += elem_size;
|
||||
}
|
||||
cpu_idx++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6745,11 +6745,11 @@ static int __check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn
|
||||
/* Transfer references to the callee */
|
||||
err = copy_reference_state(callee, caller);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_out;
|
||||
|
||||
err = set_callee_state_cb(env, caller, callee, *insn_idx);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_out;
|
||||
|
||||
clear_caller_saved_regs(env, caller->regs);
|
||||
|
||||
@ -6766,6 +6766,11 @@ static int __check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn
|
||||
print_verifier_state(env, callee, true);
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
free_func_state(callee);
|
||||
state->frame[state->curframe + 1] = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
int map_set_for_each_callback_args(struct bpf_verifier_env *env,
|
||||
@ -6979,8 +6984,7 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
state->curframe--;
|
||||
caller = state->frame[state->curframe];
|
||||
caller = state->frame[state->curframe - 1];
|
||||
if (callee->in_callback_fn) {
|
||||
/* enforce R0 return value range [0, 1]. */
|
||||
struct tnum range = callee->callback_ret_range;
|
||||
@ -7019,7 +7023,7 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
|
||||
}
|
||||
/* clear everything in the callee */
|
||||
free_func_state(callee);
|
||||
state->frame[state->curframe + 1] = NULL;
|
||||
state->frame[state->curframe--] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
|
||||
return src - unsafe_addr;
|
||||
Efault:
|
||||
pagefault_enable();
|
||||
dst[-1] = '\0';
|
||||
dst[0] = '\0';
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
@ -774,6 +774,7 @@ static void *bpf_test_init(const union bpf_attr *kattr, u32 user_size,
|
||||
if (user_size > size)
|
||||
return ERR_PTR(-EMSGSIZE);
|
||||
|
||||
size = SKB_DATA_ALIGN(size);
|
||||
data = kzalloc(size + headroom + tailroom, GFP_USER);
|
||||
if (!data)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
@ -959,6 +959,8 @@ int __br_vlan_set_proto(struct net_bridge *br, __be16 proto,
|
||||
list_for_each_entry(p, &br->port_list, list) {
|
||||
vg = nbp_vlan_group(p);
|
||||
list_for_each_entry(vlan, &vg->vlan_list, vlist) {
|
||||
if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
|
||||
continue;
|
||||
err = vlan_vid_add(p->dev, proto, vlan->vid);
|
||||
if (err)
|
||||
goto err_filt;
|
||||
@ -973,8 +975,11 @@ int __br_vlan_set_proto(struct net_bridge *br, __be16 proto,
|
||||
/* Delete VLANs for the old proto from the device filter. */
|
||||
list_for_each_entry(p, &br->port_list, list) {
|
||||
vg = nbp_vlan_group(p);
|
||||
list_for_each_entry(vlan, &vg->vlan_list, vlist)
|
||||
list_for_each_entry(vlan, &vg->vlan_list, vlist) {
|
||||
if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
|
||||
continue;
|
||||
vlan_vid_del(p->dev, oldproto, vlan->vid);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -983,13 +988,19 @@ err_filt:
|
||||
attr.u.vlan_protocol = ntohs(oldproto);
|
||||
switchdev_port_attr_set(br->dev, &attr, NULL);
|
||||
|
||||
list_for_each_entry_continue_reverse(vlan, &vg->vlan_list, vlist)
|
||||
list_for_each_entry_continue_reverse(vlan, &vg->vlan_list, vlist) {
|
||||
if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
|
||||
continue;
|
||||
vlan_vid_del(p->dev, proto, vlan->vid);
|
||||
}
|
||||
|
||||
list_for_each_entry_continue_reverse(p, &br->port_list, list) {
|
||||
vg = nbp_vlan_group(p);
|
||||
list_for_each_entry(vlan, &vg->vlan_list, vlist)
|
||||
list_for_each_entry(vlan, &vg->vlan_list, vlist) {
|
||||
if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
|
||||
continue;
|
||||
vlan_vid_del(p->dev, proto, vlan->vid);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
|
@ -310,9 +310,6 @@ static int chnl_net_open(struct net_device *dev)
|
||||
|
||||
if (result == 0) {
|
||||
pr_debug("connect timeout\n");
|
||||
caif_disconnect_client(dev_net(dev), &priv->chnl);
|
||||
priv->state = CAIF_DISCONNECTED;
|
||||
pr_debug("state disconnected\n");
|
||||
result = -ETIMEDOUT;
|
||||
goto error;
|
||||
}
|
||||
|
@ -864,6 +864,14 @@ disconnect:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void dsa_switch_teardown_tag_protocol(struct dsa_switch *ds)
|
||||
{
|
||||
const struct dsa_device_ops *tag_ops = ds->dst->tag_ops;
|
||||
|
||||
if (tag_ops->disconnect)
|
||||
tag_ops->disconnect(ds);
|
||||
}
|
||||
|
||||
static int dsa_switch_setup(struct dsa_switch *ds)
|
||||
{
|
||||
struct dsa_devlink_priv *dl_priv;
|
||||
@ -953,6 +961,8 @@ static void dsa_switch_teardown(struct dsa_switch *ds)
|
||||
ds->slave_mii_bus = NULL;
|
||||
}
|
||||
|
||||
dsa_switch_teardown_tag_protocol(ds);
|
||||
|
||||
if (ds->ops->teardown)
|
||||
ds->ops->teardown(ds);
|
||||
|
||||
|
@ -210,6 +210,7 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev,
|
||||
extern struct rtnl_link_ops dsa_link_ops __read_mostly;
|
||||
|
||||
/* port.c */
|
||||
bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr);
|
||||
void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
|
||||
const struct dsa_device_ops *tag_ops);
|
||||
int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age);
|
||||
|
@ -204,8 +204,7 @@ static int dsa_master_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
* switch in the tree that is PTP capable.
|
||||
*/
|
||||
list_for_each_entry(dp, &dst->ports, list)
|
||||
if (dp->ds->ops->port_hwtstamp_get ||
|
||||
dp->ds->ops->port_hwtstamp_set)
|
||||
if (dsa_port_supports_hwtstamp(dp, ifr))
|
||||
return -EBUSY;
|
||||
break;
|
||||
}
|
||||
|
@ -110,6 +110,22 @@ static bool dsa_port_can_configure_learning(struct dsa_port *dp)
|
||||
return !err;
|
||||
}
|
||||
|
||||
bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr)
|
||||
{
|
||||
struct dsa_switch *ds = dp->ds;
|
||||
int err;
|
||||
|
||||
if (!ds->ops->port_hwtstamp_get || !ds->ops->port_hwtstamp_set)
|
||||
return false;
|
||||
|
||||
/* "See through" shim implementations of the "get" method.
|
||||
* This will clobber the ifreq structure, but we will either return an
|
||||
* error, or the master will overwrite it with proper values.
|
||||
*/
|
||||
err = ds->ops->port_hwtstamp_get(ds, dp->index, ifr);
|
||||
return err != -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)
|
||||
{
|
||||
struct dsa_switch *ds = dp->ds;
|
||||
|
@ -402,6 +402,16 @@ config INET_IPCOMP
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config INET_TABLE_PERTURB_ORDER
|
||||
int "INET: Source port perturbation table size (as power of 2)" if EXPERT
|
||||
default 16
|
||||
help
|
||||
Source port perturbation table size (as power of 2) for
|
||||
RFC 6056 3.3.4. Algorithm 4: Double-Hash Port Selection Algorithm.
|
||||
|
||||
The default is almost always what you want.
|
||||
Only change this if you know what you are doing.
|
||||
|
||||
config INET_XFRM_TUNNEL
|
||||
tristate
|
||||
select INET_TUNNEL
|
||||
|
@ -906,13 +906,13 @@ EXPORT_SYMBOL_GPL(inet_bhash2_update_saddr);
|
||||
* Note that we use 32bit integers (vs RFC 'short integers')
|
||||
* because 2^16 is not a multiple of num_ephemeral and this
|
||||
* property might be used by clever attacker.
|
||||
*
|
||||
* RFC claims using TABLE_LENGTH=10 buckets gives an improvement, though
|
||||
* attacks were since demonstrated, thus we use 65536 instead to really
|
||||
* give more isolation and privacy, at the expense of 256kB of kernel
|
||||
* memory.
|
||||
* attacks were since demonstrated, thus we use 65536 by default instead
|
||||
* to really give more isolation and privacy, at the expense of 256kB
|
||||
* of kernel memory.
|
||||
*/
|
||||
#define INET_TABLE_PERTURB_SHIFT 16
|
||||
#define INET_TABLE_PERTURB_SIZE (1 << INET_TABLE_PERTURB_SHIFT)
|
||||
#define INET_TABLE_PERTURB_SIZE (1 << CONFIG_INET_TABLE_PERTURB_ORDER)
|
||||
static u32 *table_perturb;
|
||||
|
||||
int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
||||
|
@ -222,7 +222,7 @@ static void requeue_rx_msgs(struct kcm_mux *mux, struct sk_buff_head *head)
|
||||
struct sk_buff *skb;
|
||||
struct kcm_sock *kcm;
|
||||
|
||||
while ((skb = __skb_dequeue(head))) {
|
||||
while ((skb = skb_dequeue(head))) {
|
||||
/* Reset destructor to avoid calling kcm_rcv_ready */
|
||||
skb->destructor = sock_rfree;
|
||||
skb_orphan(skb);
|
||||
@ -1085,53 +1085,17 @@ out_error:
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct sk_buff *kcm_wait_data(struct sock *sk, int flags,
|
||||
long timeo, int *err)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
while (!(skb = skb_peek(&sk->sk_receive_queue))) {
|
||||
if (sk->sk_err) {
|
||||
*err = sock_error(sk);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (sock_flag(sk, SOCK_DONE))
|
||||
return NULL;
|
||||
|
||||
if ((flags & MSG_DONTWAIT) || !timeo) {
|
||||
*err = -EAGAIN;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sk_wait_data(sk, &timeo, NULL);
|
||||
|
||||
/* Handle signals */
|
||||
if (signal_pending(current)) {
|
||||
*err = sock_intr_errno(timeo);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static int kcm_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
size_t len, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct kcm_sock *kcm = kcm_sk(sk);
|
||||
int err = 0;
|
||||
long timeo;
|
||||
struct strp_msg *stm;
|
||||
int copied = 0;
|
||||
struct sk_buff *skb;
|
||||
|
||||
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
skb = kcm_wait_data(sk, flags, timeo, &err);
|
||||
skb = skb_recv_datagram(sk, flags, &err);
|
||||
if (!skb)
|
||||
goto out;
|
||||
|
||||
@ -1162,14 +1126,11 @@ msg_finished:
|
||||
/* Finished with message */
|
||||
msg->msg_flags |= MSG_EOR;
|
||||
KCM_STATS_INCR(kcm->stats.rx_msgs);
|
||||
skb_unlink(skb, &sk->sk_receive_queue);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
release_sock(sk);
|
||||
|
||||
skb_free_datagram(sk, skb);
|
||||
return copied ? : err;
|
||||
}
|
||||
|
||||
@ -1179,7 +1140,6 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct kcm_sock *kcm = kcm_sk(sk);
|
||||
long timeo;
|
||||
struct strp_msg *stm;
|
||||
int err = 0;
|
||||
ssize_t copied;
|
||||
@ -1187,11 +1147,7 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
|
||||
|
||||
/* Only support splice for SOCKSEQPACKET */
|
||||
|
||||
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
skb = kcm_wait_data(sk, flags, timeo, &err);
|
||||
skb = skb_recv_datagram(sk, flags, &err);
|
||||
if (!skb)
|
||||
goto err_out;
|
||||
|
||||
@ -1219,13 +1175,11 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
|
||||
* finish reading the message.
|
||||
*/
|
||||
|
||||
release_sock(sk);
|
||||
|
||||
skb_free_datagram(sk, skb);
|
||||
return copied;
|
||||
|
||||
err_out:
|
||||
release_sock(sk);
|
||||
|
||||
skb_free_datagram(sk, skb);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1150,8 +1150,10 @@ static void l2tp_tunnel_destruct(struct sock *sk)
|
||||
}
|
||||
|
||||
/* Remove hooks into tunnel socket */
|
||||
write_lock_bh(&sk->sk_callback_lock);
|
||||
sk->sk_destruct = tunnel->old_sk_destruct;
|
||||
sk->sk_user_data = NULL;
|
||||
write_unlock_bh(&sk->sk_callback_lock);
|
||||
|
||||
/* Call the original destructor */
|
||||
if (sk->sk_destruct)
|
||||
@ -1469,16 +1471,18 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
|
||||
sock = sockfd_lookup(tunnel->fd, &ret);
|
||||
if (!sock)
|
||||
goto err;
|
||||
|
||||
ret = l2tp_validate_socket(sock->sk, net, tunnel->encap);
|
||||
if (ret < 0)
|
||||
goto err_sock;
|
||||
}
|
||||
|
||||
sk = sock->sk;
|
||||
write_lock(&sk->sk_callback_lock);
|
||||
|
||||
ret = l2tp_validate_socket(sk, net, tunnel->encap);
|
||||
if (ret < 0)
|
||||
goto err_sock;
|
||||
|
||||
tunnel->l2tp_net = net;
|
||||
pn = l2tp_pernet(net);
|
||||
|
||||
sk = sock->sk;
|
||||
sock_hold(sk);
|
||||
tunnel->sock = sk;
|
||||
|
||||
@ -1504,7 +1508,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
|
||||
|
||||
setup_udp_tunnel_sock(net, sock, &udp_cfg);
|
||||
} else {
|
||||
sk->sk_user_data = tunnel;
|
||||
rcu_assign_sk_user_data(sk, tunnel);
|
||||
}
|
||||
|
||||
tunnel->old_sk_destruct = sk->sk_destruct;
|
||||
@ -1518,6 +1522,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
|
||||
if (tunnel->fd >= 0)
|
||||
sockfd_put(sock);
|
||||
|
||||
write_unlock(&sk->sk_callback_lock);
|
||||
return 0;
|
||||
|
||||
err_sock:
|
||||
@ -1525,6 +1530,8 @@ err_sock:
|
||||
sock_release(sock);
|
||||
else
|
||||
sockfd_put(sock);
|
||||
|
||||
write_unlock(&sk->sk_callback_lock);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
@ -346,7 +346,7 @@ static struct sk_buff *tls_enc_skb(struct tls_context *tls_ctx,
|
||||
salt = tls_ctx->crypto_send.aes_gcm_256.salt;
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
goto free_req;
|
||||
}
|
||||
cipher_sz = &tls_cipher_size_desc[tls_ctx->crypto_send.info.cipher_type];
|
||||
buf_len = cipher_sz->salt + cipher_sz->iv + TLS_AAD_SPACE_SIZE +
|
||||
@ -492,7 +492,8 @@ int tls_sw_fallback_init(struct sock *sk,
|
||||
key = ((struct tls12_crypto_info_aes_gcm_256 *)crypto_info)->key;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto free_aead;
|
||||
}
|
||||
cipher_sz = &tls_cipher_size_desc[crypto_info->cipher_type];
|
||||
|
||||
|
@ -117,7 +117,7 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
if (!pskb_may_pull(skb, 1)) {
|
||||
x25_neigh_put(nb);
|
||||
return 0;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
switch (skb->data[0]) {
|
||||
|
@ -63,6 +63,13 @@ void test_varlen(void)
|
||||
CHECK_VAL(data->total4, size1 + size2);
|
||||
CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!\n");
|
||||
|
||||
CHECK_VAL(bss->ret_bad_read, -EFAULT);
|
||||
CHECK_VAL(data->payload_bad[0], 0x42);
|
||||
CHECK_VAL(data->payload_bad[1], 0x42);
|
||||
CHECK_VAL(data->payload_bad[2], 0);
|
||||
CHECK_VAL(data->payload_bad[3], 0x42);
|
||||
CHECK_VAL(data->payload_bad[4], 0x42);
|
||||
cleanup:
|
||||
test_varlen__destroy(skel);
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ __u64 payload1_len1 = 0;
|
||||
__u64 payload1_len2 = 0;
|
||||
__u64 total1 = 0;
|
||||
char payload1[MAX_LEN + MAX_LEN] = {};
|
||||
__u64 ret_bad_read = 0;
|
||||
|
||||
/* .data */
|
||||
int payload2_len1 = -1;
|
||||
@ -36,6 +37,8 @@ int payload4_len2 = -1;
|
||||
int total4= -1;
|
||||
char payload4[MAX_LEN + MAX_LEN] = { 1 };
|
||||
|
||||
char payload_bad[5] = { 0x42, 0x42, 0x42, 0x42, 0x42 };
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler64_unsigned(void *regs)
|
||||
{
|
||||
@ -61,6 +64,8 @@ int handler64_unsigned(void *regs)
|
||||
|
||||
total1 = payload - (void *)payload1;
|
||||
|
||||
ret_bad_read = bpf_probe_read_kernel_str(payload_bad + 2, 1, (void *) -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1010,7 +1010,7 @@ static inline const char *str_msg(const struct msg *msg, char *buf)
|
||||
msg->subtest_done.have_log);
|
||||
break;
|
||||
case MSG_TEST_LOG:
|
||||
sprintf(buf, "MSG_TEST_LOG (cnt: %ld, last: %d)",
|
||||
sprintf(buf, "MSG_TEST_LOG (cnt: %zu, last: %d)",
|
||||
strlen(msg->test_log.log_buf),
|
||||
msg->test_log.is_last);
|
||||
break;
|
||||
|
@ -1260,7 +1260,7 @@ static int get_xlated_program(int fd_prog, struct bpf_insn **buf, int *cnt)
|
||||
|
||||
bzero(&info, sizeof(info));
|
||||
info.xlated_prog_len = xlated_prog_len;
|
||||
info.xlated_prog_insns = (__u64)*buf;
|
||||
info.xlated_prog_insns = (__u64)(unsigned long)*buf;
|
||||
if (bpf_obj_get_info_by_fd(fd_prog, &info, &info_len)) {
|
||||
perror("second bpf_obj_get_info_by_fd failed");
|
||||
goto out_free_buf;
|
||||
|
Loading…
Reference in New Issue
Block a user