mirror of
https://github.com/torvalds/linux.git
synced 2026-05-04 06:22:40 -04:00
Pull networking updates from Jakub Kicinski:
"Core & protocols:
- Replace busylock at the Tx queuing layer with a lockless list.
Resulting in a 300% (4x) improvement on heavy TX workloads, sending
twice the number of packets per second, for half the cpu cycles.
- Allow constantly busy flows to migrate to a more suitable CPU/NIC
queue.
Normally we perform queue re-selection when flow comes out of idle,
but under extreme circumstances the flows may be constantly busy.
Add sysctl to allow periodic rehashing even if it'd risk packet
reordering.
- Optimize the NAPI skb cache, make it larger, use it in more paths.
- Attempt returning Tx skbs to the originating CPU (like we already
did for Rx skbs).
- Various data structure layout and prefetch optimizations from Eric.
- Remove ktime_get() from the recvmsg() fast path, ktime_get() is
sadly quite expensive on recent AMD machines.
- Extend threaded NAPI polling to allow the kthread busy poll for
packets.
- Make MPTCP use Rx backlog processing. This lowers the lock
pressure, improving the Rx performance.
- Support memcg accounting of MPTCP socket memory.
- Allow admin to opt sockets out of global protocol memory accounting
(using a sysctl or BPF-based policy). The global limits are a poor
fit for modern container workloads, where limits are imposed using
cgroups.
- Improve heuristics for when to kick off AF_UNIX garbage collection.
- Allow users to control TCP SACK compression, and default to 33% of
RTT.
- Add tcp_rcvbuf_low_rtt sysctl to let datacenter users avoid
unnecessarily aggressive rcvbuf growth and overshot when the
connection RTT is low.
- Preserve skb metadata space across skb_push / skb_pull operations.
- Support for IPIP encapsulation in the nftables flowtable offload.
- Support appending IP interface information to ICMP messages (RFC
5837).
- Support setting max record size in TLS (RFC 8449).
- Remove taking rtnl_lock from RTM_GETNEIGHTBL and RTM_SETNEIGHTBL.
- Use a dedicated lock (and RCU) in MPLS, instead of rtnl_lock.
- Let users configure the number of write buffers in SMC.
- Add new struct sockaddr_unsized for sockaddr of unknown length,
from Kees.
- Some conversions away from the crypto_ahash API, from Eric Biggers.
- Some preparations for slimming down struct page.
- YAML Netlink protocol spec for WireGuard.
- Add a tool on top of YAML Netlink specs/lib for reporting commonly
computed derived statistics and summarized system state.
Driver API:
- Add CAN XL support to the CAN Netlink interface.
- Add uAPI for reporting PHY Mean Square Error (MSE) diagnostics, as
defined by the OPEN Alliance's "Advanced diagnostic features for
100BASE-T1 automotive Ethernet PHYs" specification.
- Add DPLL phase-adjust-gran pin attribute (and implement it in
zl3073x).
- Refactor xfrm_input lock to reduce contention when NIC offloads
IPsec and performs RSS.
- Add info to devlink params whether the current setting is the
default or a user override. Allow resetting back to default.
- Add standard device stats for PSP crypto offload.
- Leverage DSA frame broadcast to implement simple HSR frame
duplication for a lot of switches without dedicated HSR offload.
- Add uAPI defines for 1.6Tbps link modes.
Device drivers:
- Add Motorcomm YT921x gigabit Ethernet switch support.
- Add MUCSE driver for N500/N210 1GbE NIC series.
- Convert drivers to support dedicated ops for timestamping control,
and away from the direct IOCTL handling. While at it support GET
operations for PHY timestamping.
- Add (and convert most drivers to) a dedicated ethtool callback for
reading the Rx ring count.
- Significant refactoring efforts in the STMMAC driver, which
supports Synopsys turn-key MAC IP integrated into a ton of SoCs.
- Ethernet high-speed NICs:
- Broadcom (bnxt):
- support PPS in/out on all pins
- Intel (100G, ice, idpf):
- ice: implement standard ethtool and timestamping stats
- i40e: support setting the max number of MAC addresses per VF
- iavf: support RSS of GTP tunnels for 5G and LTE deployments
- nVidia/Mellanox (mlx5):
- reduce downtime on interface reconfiguration
- disable being an XDP redirect target by default (same as
other drivers) to avoid wasting resources if feature is
unused
- Meta (fbnic):
- add support for Linux-managed PCS on 25G, 50G, and 100G links
- Wangxun:
- support Rx descriptor merge, and Tx head writeback
- support Rx coalescing offload
- support 25G SPF and 40G QSFP modules
- Ethernet virtual:
- Google (gve):
- allow ethtool to configure rx_buf_len
- implement XDP HW RX Timestamping support for DQ descriptor
format
- Microsoft vNIC (mana):
- support HW link state events
- handle hardware recovery events when probing the device
- Ethernet NICs consumer, and embedded:
- usbnet: add support for Byte Queue Limits (BQL)
- AMD (amd-xgbe):
- add device selftests
- NXP (enetc):
- add i.MX94 support
- Broadcom integrated MACs (bcmgenet, bcmasp):
- bcmasp: add support for PHY-based Wake-on-LAN
- Broadcom switches (b53):
- support port isolation
- support BCM5389/97/98 and BCM63XX ARL formats
- Lantiq/MaxLinear switches:
- support bridge FDB entries on the CPU port
- use regmap for register access
- allow user to enable/disable learning
- support Energy Efficient Ethernet
- support configuring RMII clock delays
- add tagging driver for MaxLinear GSW1xx switches
- Synopsys (stmmac):
- support using the HW clock in free running mode
- add Eswin EIC7700 support
- add Rockchip RK3506 support
- add Altera Agilex5 support
- Cadence (macb):
- cleanup and consolidate descriptor and DMA address handling
- add EyeQ5 support
- TI:
- icssg-prueth: support AF_XDP
- Airoha access points:
- add missing Ethernet stats and link state callback
- add AN7583 support
- support out-of-order Tx completion processing
- Power over Ethernet:
- pd692x0: preserve PSE configuration across reboots
- add support for TPS23881B devices
- Ethernet PHYs:
- Open Alliance OATC14 10BASE-T1S PHY cable diagnostic support
- Support 50G SerDes and 100G interfaces in Linux-managed PHYs
- micrel:
- support for non PTP SKUs of lan8814
- enable in-band auto-negotiation on lan8814
- realtek:
- cable testing support on RTL8224
- interrupt support on RTL8221B
- motorcomm: support for PHY LEDs on YT853
- microchip: support for LAN867X Rev.D0 PHYs w/ SQI and cable diag
- mscc: support for PHY LED control
- CAN drivers:
- m_can: add support for optional reset and system wake up
- remove can_change_mtu() obsoleted by core handling
- mcp251xfd: support GPIO controller functionality
- Bluetooth:
- add initial support for PASTa
- WiFi:
- split ieee80211.h file, it's way too big
- improvements in VHT radiotap reporting, S1G, Channel Switch
Announcement handling, rate tracking in mesh networks
- improve multi-radio monitor mode support, and add a cfg80211
debugfs interface for it
- HT action frame handling on 6 GHz
- initial chanctx work towards NAN
- MU-MIMO sniffer improvements
- WiFi drivers:
- RealTek (rtw89):
- support USB devices RTL8852AU and RTL8852CU
- initial work for RTL8922DE
- improved injection support
- Intel:
- iwlwifi: new sniffer API support
- MediaTek (mt76):
- WED support for >32-bit DMA
- airoha NPU support
- regdomain improvements
- continued WiFi7/MLO work
- Qualcomm/Atheros:
- ath10k: factory test support
- ath11k: TX power insertion support
- ath12k: BSS color change support
- ath12k: statistics improvements
- brcmfmac: Acer A1 840 tablet quirk
- rtl8xxxu: 40 MHz connection fixes/support"
* tag 'net-next-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (1381 commits)
net: page_pool: sanitise allocation order
net: page pool: xa init with destroy on pp init
net/mlx5e: Support XDP target xmit with dummy program
net/mlx5e: Update XDP features in switch channels
selftests/tc-testing: Test CAKE scheduler when enqueue drops packets
net/sched: sch_cake: Fix incorrect qlen reduction in cake_drop
wireguard: netlink: generate netlink code
wireguard: uapi: generate header with ynl-gen
wireguard: uapi: move flag enums
wireguard: uapi: move enum wg_cmd
wireguard: netlink: add YNL specification
selftests: drv-net: Fix tolerance calculation in devlink_rate_tc_bw.py
selftests: drv-net: Fix and clarify TC bandwidth split in devlink_rate_tc_bw.py
selftests: drv-net: Set shell=True for sysfs writes in devlink_rate_tc_bw.py
selftests: drv-net: Use Iperf3Runner in devlink_rate_tc_bw.py
selftests: drv-net: introduce Iperf3Runner for measurement use cases
selftests: drv-net: Add devlink_rate_tc_bw.py to TEST_PROGS
net: ps3_gelic_net: Use napi_alloc_skb() and napi_gro_receive()
Documentation: net: dsa: mention simple HSR offload helpers
Documentation: net: dsa: mention availability of RedBox
...
210 lines
5.1 KiB
C
210 lines
5.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Deliver z/VM CP special messages (SMSG) as uevents.
|
|
*
|
|
* The driver registers for z/VM CP special messages with the
|
|
* "APP" prefix. Incoming messages are delivered to user space
|
|
* as uevents.
|
|
*
|
|
* Copyright IBM Corp. 2010
|
|
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
|
*
|
|
*/
|
|
#define pr_fmt(fmt) "smsgiucv_app: " fmt
|
|
|
|
#include <linux/ctype.h>
|
|
#include <linux/err.h>
|
|
#include <linux/device.h>
|
|
#include <linux/list.h>
|
|
#include <linux/kobject.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/workqueue.h>
|
|
#include <net/iucv/iucv.h>
|
|
#include <asm/machine.h>
|
|
#include "smsgiucv.h"
|
|
|
|
/* prefix used for SMSG registration */
|
|
#define SMSG_PREFIX "APP"
|
|
|
|
/* SMSG related uevent environment variables */
|
|
#define ENV_SENDER_STR "SMSG_SENDER="
|
|
#define ENV_SENDER_LEN (strlen(ENV_SENDER_STR) + 8 + 1)
|
|
#define ENV_PREFIX_STR "SMSG_ID="
|
|
#define ENV_PREFIX_LEN (strlen(ENV_PREFIX_STR) + \
|
|
strlen(SMSG_PREFIX) + 1)
|
|
#define ENV_TEXT_STR "SMSG_TEXT="
|
|
#define ENV_TEXT_LEN(msg) (strlen(ENV_TEXT_STR) + strlen((msg)) + 1)
|
|
|
|
/* z/VM user ID which is permitted to send SMSGs
|
|
* If the value is undefined or empty (""), special messages are
|
|
* accepted from any z/VM user ID. */
|
|
static char *sender;
|
|
module_param(sender, charp, 0400);
|
|
MODULE_PARM_DESC(sender, "z/VM user ID from which CP SMSGs are accepted");
|
|
|
|
/* SMSG device representation */
|
|
static struct device *smsg_app_dev;
|
|
|
|
/* list element for queuing received messages for delivery */
|
|
struct smsg_app_event {
|
|
struct list_head list;
|
|
char *buf;
|
|
char *envp[4];
|
|
};
|
|
|
|
/* queue for outgoing uevents */
|
|
static LIST_HEAD(smsg_event_queue);
|
|
static DEFINE_SPINLOCK(smsg_event_queue_lock);
|
|
|
|
static void smsg_app_event_free(struct smsg_app_event *ev)
|
|
{
|
|
kfree(ev->buf);
|
|
kfree(ev);
|
|
}
|
|
|
|
static struct smsg_app_event *smsg_app_event_alloc(const char *from,
|
|
const char *msg)
|
|
{
|
|
struct smsg_app_event *ev;
|
|
|
|
ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
|
|
if (!ev)
|
|
return NULL;
|
|
|
|
ev->buf = kzalloc(ENV_SENDER_LEN + ENV_PREFIX_LEN +
|
|
ENV_TEXT_LEN(msg), GFP_ATOMIC);
|
|
if (!ev->buf) {
|
|
kfree(ev);
|
|
return NULL;
|
|
}
|
|
|
|
/* setting up environment pointers into buf */
|
|
ev->envp[0] = ev->buf;
|
|
ev->envp[1] = ev->envp[0] + ENV_SENDER_LEN;
|
|
ev->envp[2] = ev->envp[1] + ENV_PREFIX_LEN;
|
|
ev->envp[3] = NULL;
|
|
|
|
/* setting up environment: sender, prefix name, and message text */
|
|
scnprintf(ev->envp[0], ENV_SENDER_LEN, ENV_SENDER_STR "%s", from);
|
|
scnprintf(ev->envp[1], ENV_PREFIX_LEN, ENV_PREFIX_STR "%s",
|
|
SMSG_PREFIX);
|
|
scnprintf(ev->envp[2], ENV_TEXT_LEN(msg), ENV_TEXT_STR "%s", msg);
|
|
|
|
return ev;
|
|
}
|
|
|
|
static void smsg_event_work_fn(struct work_struct *work)
|
|
{
|
|
LIST_HEAD(event_queue);
|
|
struct smsg_app_event *p, *n;
|
|
struct device *dev;
|
|
|
|
dev = get_device(smsg_app_dev);
|
|
if (!dev)
|
|
return;
|
|
|
|
spin_lock_bh(&smsg_event_queue_lock);
|
|
list_splice_init(&smsg_event_queue, &event_queue);
|
|
spin_unlock_bh(&smsg_event_queue_lock);
|
|
|
|
list_for_each_entry_safe(p, n, &event_queue, list) {
|
|
list_del(&p->list);
|
|
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, p->envp);
|
|
smsg_app_event_free(p);
|
|
}
|
|
|
|
put_device(dev);
|
|
}
|
|
static DECLARE_WORK(smsg_event_work, smsg_event_work_fn);
|
|
|
|
static void smsg_app_callback(const char *from, char *msg)
|
|
{
|
|
struct smsg_app_event *se;
|
|
|
|
/* check if the originating z/VM user ID matches
|
|
* the configured sender. */
|
|
if (sender && strlen(sender) > 0 && strcmp(from, sender) != 0)
|
|
return;
|
|
|
|
/* get start of message text (skip prefix and leading blanks) */
|
|
msg += strlen(SMSG_PREFIX);
|
|
while (*msg && isspace(*msg))
|
|
msg++;
|
|
if (*msg == '\0')
|
|
return;
|
|
|
|
/* allocate event list element and its environment */
|
|
se = smsg_app_event_alloc(from, msg);
|
|
if (!se)
|
|
return;
|
|
|
|
/* queue event and schedule work function */
|
|
spin_lock(&smsg_event_queue_lock);
|
|
list_add_tail(&se->list, &smsg_event_queue);
|
|
spin_unlock(&smsg_event_queue_lock);
|
|
|
|
schedule_work(&smsg_event_work);
|
|
return;
|
|
}
|
|
|
|
static int __init smsgiucv_app_init(void)
|
|
{
|
|
struct device_driver *smsgiucv_drv;
|
|
int rc;
|
|
|
|
if (!machine_is_vm())
|
|
return -ENODEV;
|
|
|
|
smsgiucv_drv = driver_find(SMSGIUCV_DRV_NAME, &iucv_bus);
|
|
if (!smsgiucv_drv)
|
|
return -ENODEV;
|
|
|
|
smsg_app_dev = iucv_alloc_device(NULL, smsgiucv_drv, NULL, "smsgiucv_app");
|
|
if (!smsg_app_dev)
|
|
return -ENOMEM;
|
|
|
|
rc = device_register(smsg_app_dev);
|
|
if (rc) {
|
|
put_device(smsg_app_dev);
|
|
goto fail;
|
|
}
|
|
|
|
/* convert sender to uppercase characters */
|
|
if (sender) {
|
|
int len = strlen(sender);
|
|
while (len--)
|
|
sender[len] = toupper(sender[len]);
|
|
}
|
|
|
|
/* register with the smsgiucv device driver */
|
|
rc = smsg_register_callback(SMSG_PREFIX, smsg_app_callback);
|
|
if (rc) {
|
|
device_unregister(smsg_app_dev);
|
|
goto fail;
|
|
}
|
|
|
|
rc = 0;
|
|
fail:
|
|
return rc;
|
|
}
|
|
module_init(smsgiucv_app_init);
|
|
|
|
static void __exit smsgiucv_app_exit(void)
|
|
{
|
|
/* unregister callback */
|
|
smsg_unregister_callback(SMSG_PREFIX, smsg_app_callback);
|
|
|
|
/* cancel pending work and flush any queued event work */
|
|
cancel_work_sync(&smsg_event_work);
|
|
smsg_event_work_fn(&smsg_event_work);
|
|
|
|
device_unregister(smsg_app_dev);
|
|
}
|
|
module_exit(smsgiucv_app_exit);
|
|
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_DESCRIPTION("Deliver z/VM CP SMSG as uevents");
|
|
MODULE_AUTHOR("Hendrik Brueckner <brueckner@linux.vnet.ibm.com>");
|