mirror of
https://github.com/OpenVoiceOS/OpenVoiceOS
synced 2025-02-10 00:40:43 +01:00
The work of the last week
This commit is contained in:
parent
569fa2859f
commit
2181fc8575
@ -1 +1 @@
|
||||
Subproject commit c82edb58b41b15627ef7262118477122b3e99c34
|
||||
Subproject commit afbbc1095dc4c698774686cd17f03a20a0cf63c2
|
@ -116,6 +116,7 @@ endmenu
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/respeaker/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/rnnnoise-ladspa/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/roc-toolkit/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/rpi-bluetooth/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/rpi-eeprom/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ruy/Config.in"
|
||||
source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/snapcast/Config.in"
|
||||
|
@ -1 +1 @@
|
||||
numa=fake=4 numa_policy=interleave mitigations=off 8250.nr_uarts=1 snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1 snd_bcm2835.enable_compat_alsa=0 dwc_otg.lpm_enable=0 acpi=off cgroup_enable=memory psi=1 usb-storage.quirks=174c:55aa:u,2109:0715:u,152d:0578:u,152d:0579:u,152d:1561:u,174c:0829:u,14b0:0206:u
|
||||
numa=fake=4 numa_policy=interleave mitigations=off 8250.nr_uarts=1 snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1 dwc_otg.lpm_enable=0 acpi=off cgroup_enable=memory psi=1 usb-storage.quirks=174c:55aa:u,2109:0715:u,152d:0578:u,152d:0579:u,152d:1561:u,174c:0829:u,14b0:0206:u
|
||||
|
@ -11,7 +11,7 @@ set menu_color_highlight=white/red
|
||||
|
||||
load_env
|
||||
|
||||
default_cmdline="systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=console consoleblank=0 loglevel=0 vt.global_cursor_default=0 logo.nologo systemd.show_status=0 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait quiet"
|
||||
default_cmdline="systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=console consoleblank=0 loglevel=0 vt.global_cursor_default=0 logo.nologo systemd.show_status=0 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait quiet toram"
|
||||
file_env -f ($root)/cmdline.txt cmdline
|
||||
|
||||
regexp --set 1:boothd (.+),.+ ${root}
|
||||
|
@ -1,5 +1,3 @@
|
||||
CONFIG_ACPI=ACPI
|
||||
|
||||
CONFIG_EFI=y
|
||||
CONFIG_EFI_STUB=y
|
||||
|
||||
@ -18,26 +16,10 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_EFIVAR_FS=m
|
||||
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_VIRTIO_INPUT=m
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_VIRTIO_CONSOLE=m
|
||||
CONFIG_VIRTIO_VSOCKETS=m
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_SCSI_VIRTIO=y
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
|
||||
CONFIG_NVME_CORE=y
|
||||
CONFIG_BLK_DEV_NVME=y
|
||||
CONFIG_NVME_HWMON=y
|
||||
|
||||
CONFIG_DRM_VIRTIO_GPU=m
|
||||
|
||||
CONFIG_HYPERVISOR_GUEST=HYPERVISOR_GUEST
|
||||
|
||||
# Disabling devices that are non commonly used for smart speaker/devices
|
||||
# CONFIG_CDROM is not set
|
||||
# CONFIG_VIDEO_IRS1125 is not set
|
||||
|
Binary file not shown.
@ -8,7 +8,7 @@ CONFIG_HAVE_DOT_CONFIG=y
|
||||
#
|
||||
# Settings
|
||||
#
|
||||
# CONFIG_DESKTOP is not set
|
||||
CONFIG_DESKTOP=y
|
||||
# CONFIG_EXTRA_COMPAT is not set
|
||||
# CONFIG_FEDORA_COMPAT is not set
|
||||
# CONFIG_INCLUDE_SUSv2 is not set
|
||||
@ -53,7 +53,7 @@ CONFIG_EXTRA_CFLAGS=""
|
||||
CONFIG_EXTRA_LDFLAGS=""
|
||||
CONFIG_EXTRA_LDLIBS=""
|
||||
# CONFIG_USE_PORTABLE_CODE is not set
|
||||
# CONFIG_STACK_OPTIMIZATION_386 is not set
|
||||
CONFIG_STACK_OPTIMIZATION_386=y
|
||||
CONFIG_STATIC_LIBGCC=y
|
||||
|
||||
#
|
||||
|
@ -15,13 +15,14 @@ BR2_TARGET_GENERIC_HOSTNAME="OpenVoiceOS"
|
||||
BR2_TARGET_GENERIC_ISSUE="Welcome to OpenVoiceOS"
|
||||
BR2_TARGET_GENERIC_PASSWD_SHA512=y
|
||||
BR2_INIT_SYSTEMD=y
|
||||
BR2_INIT_SYSTEMD_VAR_NONE=y
|
||||
BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES=y
|
||||
# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
|
||||
BR2_SYSTEM_BIN_SH_BASH=y
|
||||
# BR2_TARGET_GENERIC_GETTY is not set
|
||||
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
|
||||
BR2_SYSTEM_DHCP="eth0"
|
||||
# BR2_ENABLE_LOCALE_PURGE is not set
|
||||
BR2_GENERATE_LOCALE="en_US.UTF-8"
|
||||
BR2_GENERATE_LOCALE=" C en_US"
|
||||
BR2_SYSTEM_ENABLE_NLS=y
|
||||
BR2_ROOTFS_USERS_TABLES="$(BR2_EXTERNAL)/user_table.txt"
|
||||
BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL)/rootfs-overlay $(BR2_EXTERNAL)/board/ovos/raspberrypi/rootfs-overlay $(BR2_EXTERNAL)/board/ovos/raspberrypi/rpi4/rootfs-overlay"
|
||||
@ -30,7 +31,7 @@ BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL)/scripts/post-image.sh"
|
||||
BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_EXTERNAL)/board/ovos/raspberrypi/rpi4"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,d24229dcef58e0162780ceffa02eb5f6a01b9a4d)/linux-d24229dcef58e0162780ceffa02eb5f6a01b9a4d.tar.gz"
|
||||
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,16d0ee22d2c0b32cc67db73ce03263b740bba2a7)/linux-16d0ee22d2c0b32cc67db73ce03263b740bba2a7.tar.gz"
|
||||
BR2_LINUX_KERNEL_DEFCONFIG="bcm2711"
|
||||
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL)/kernel/ovos.config $(BR2_EXTERNAL)/kernel/device-drivers.config $(BR2_EXTERNAL)/kernel/docker.config $(BR2_EXTERNAL)/board/ovos/raspberrypi/kernel.config"
|
||||
BR2_LINUX_KERNEL_LZ4=y
|
||||
@ -58,6 +59,10 @@ BR2_PACKAGE_ALSA_UTILS_ASEQNET=y
|
||||
BR2_PACKAGE_ALSA_UTILS_BAT=y
|
||||
BR2_PACKAGE_ALSA_UTILS_IECSET=y
|
||||
BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y
|
||||
BR2_PACKAGE_FFMPEG=y
|
||||
BR2_PACKAGE_FFMPEG_GPL=y
|
||||
BR2_PACKAGE_FFMPEG_NONFREE=y
|
||||
BR2_PACKAGE_FFMPEG_AVRESAMPLE=y
|
||||
# BR2_PACKAGE_GSTREAMER1_PARSE is not set
|
||||
# BR2_PACKAGE_GSTREAMER1_TRACE is not set
|
||||
# BR2_PACKAGE_GSTREAMER1_GST_DEBUG is not set
|
||||
@ -88,6 +93,7 @@ BR2_PACKAGE_GREP=y
|
||||
BR2_PACKAGE_JO=y
|
||||
BR2_PACKAGE_JQ=y
|
||||
BR2_PACKAGE_PATCH=y
|
||||
BR2_PACKAGE_PKGCONF=y
|
||||
BR2_PACKAGE_CPIO=y
|
||||
BR2_PACKAGE_DOSFSTOOLS=y
|
||||
BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y
|
||||
@ -95,13 +101,11 @@ BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
|
||||
BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y
|
||||
BR2_PACKAGE_E2FSPROGS=y
|
||||
BR2_PACKAGE_E2FSPROGS_FUSE2FS=y
|
||||
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
|
||||
BR2_PACKAGE_EROFS_UTILS=y
|
||||
BR2_PACKAGE_EROFS_UTILS_LZ4=y
|
||||
BR2_PACKAGE_EROFS_UTILS_LZMA=y
|
||||
BR2_PACKAGE_EROFS_UTILS_EROFSFUSE=y
|
||||
BR2_PACKAGE_FUSE_OVERLAYFS=y
|
||||
BR2_PACKAGE_NFS_UTILS=y
|
||||
BR2_PACKAGE_NTFS_3G=y
|
||||
BR2_PACKAGE_MESA3D=y
|
||||
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D=y
|
||||
@ -121,20 +125,22 @@ BR2_PACKAGE_GPTFDISK=y
|
||||
BR2_PACKAGE_GPTFDISK_GDISK=y
|
||||
BR2_PACKAGE_GPTFDISK_SGDISK=y
|
||||
BR2_PACKAGE_I2C_TOOLS=y
|
||||
BR2_PACKAGE_KBD=y
|
||||
BR2_PACKAGE_PARTED=y
|
||||
BR2_PACKAGE_RNG_TOOLS=y
|
||||
BR2_PACKAGE_SPI_TOOLS=y
|
||||
BR2_PACKAGE_USB_MODESWITCH_DATA=y
|
||||
BR2_PACKAGE_JIMTCL=y
|
||||
BR2_PACKAGE_LUAJIT=y
|
||||
BR2_PACKAGE_PYTHON3=y
|
||||
BR2_PACKAGE_PYTHON3_PY_PYC=y
|
||||
BR2_PACKAGE_PYTHON_GOBJECT=y
|
||||
# BR2_PACKAGE_PYTHON3_UNICODEDATA is not set
|
||||
BR2_PACKAGE_PYTHON_PIP=y
|
||||
BR2_PACKAGE_PYTHON_PODMAN_COMPOSE=y
|
||||
BR2_PACKAGE_PYTHON_SPIDEV=y
|
||||
BR2_PACKAGE_ALSA_LIB_PYTHON=y
|
||||
BR2_PACKAGE_ALSA_PLUGINS=y
|
||||
BR2_PACKAGE_LIBSAMPLERATE=y
|
||||
BR2_PACKAGE_LV2=y
|
||||
BR2_PACKAGE_LIBSOXR=y
|
||||
BR2_PACKAGE_LILV=y
|
||||
BR2_PACKAGE_OPUS=y
|
||||
BR2_PACKAGE_PORTAUDIO=y
|
||||
BR2_PACKAGE_SPEEXDSP=y
|
||||
BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y
|
||||
@ -146,6 +152,7 @@ BR2_PACKAGE_LIBKSBA=y
|
||||
BR2_PACKAGE_LIBSSH2=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBOPENSSL_ENGINES=y
|
||||
BR2_PACKAGE_SQLITE=y
|
||||
BR2_PACKAGE_LIBCONFIG=y
|
||||
BR2_PACKAGE_LIBLOCKFILE=y
|
||||
BR2_PACKAGE_LIBNFS=y
|
||||
@ -153,6 +160,8 @@ BR2_PACKAGE_LIBSYSFS=y
|
||||
BR2_PACKAGE_LOCKDEV=y
|
||||
BR2_PACKAGE_PHYSFS=y
|
||||
BR2_PACKAGE_JPEG=y
|
||||
BR2_PACKAGE_JITTERENTROPY_LIBRARY=y
|
||||
BR2_PACKAGE_LIBAIO=y
|
||||
BR2_PACKAGE_LIBGPIOD2=y
|
||||
BR2_PACKAGE_LIBGPIOD2_TOOLS=y
|
||||
BR2_PACKAGE_LIBINPUT=y
|
||||
@ -161,7 +170,7 @@ BR2_PACKAGE_LIBV4L=y
|
||||
BR2_PACKAGE_LIBV4L_UTILS=y
|
||||
BR2_PACKAGE_JSON_GLIB=y
|
||||
BR2_PACKAGE_LIBFASTJSON=y
|
||||
BR2_PACKAGE_SORD=y
|
||||
BR2_PACKAGE_LIBXML2=y
|
||||
BR2_PACKAGE_LIBCAMERA=y
|
||||
BR2_PACKAGE_LIBCAMERA_V4L2=y
|
||||
BR2_PACKAGE_LIBCAMERA_PIPELINE_RPI_VC4=y
|
||||
@ -173,14 +182,15 @@ BR2_PACKAGE_LIBCURL=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
BR2_PACKAGE_LIBPSL=y
|
||||
BR2_PACKAGE_SLIRP4NETNS=y
|
||||
BR2_PACKAGE_FFTW=y
|
||||
BR2_PACKAGE_GOBJECT_INTROSPECTION=y
|
||||
BR2_PACKAGE_JEMALLOC=y
|
||||
BR2_PACKAGE_LIBCAP_TOOLS=y
|
||||
BR2_PACKAGE_LIBDAEMON=y
|
||||
BR2_PACKAGE_LIBEVENT=y
|
||||
BR2_PACKAGE_LIBUNWIND=y
|
||||
BR2_PACKAGE_LIBUV=y
|
||||
BR2_PACKAGE_NCURSES_WCHAR=y
|
||||
BR2_PACKAGE_GSETTINGS_DESKTOP_SCHEMAS=y
|
||||
BR2_PACKAGE_SHARED_MIME_INFO=y
|
||||
BR2_PACKAGE_AARDVARK_DNS=y
|
||||
BR2_PACKAGE_BLUEZ_TOOLS=y
|
||||
BR2_PACKAGE_BLUEZ5_UTILS=y
|
||||
@ -194,7 +204,7 @@ BR2_PACKAGE_BLUEZ5_UTILS_PLUGINS_SAP=y
|
||||
BR2_PACKAGE_BLUEZ5_UTILS_PLUGINS_SIXAXIS=y
|
||||
BR2_PACKAGE_BLUEZ5_UTILS_TOOLS_HID2HCI=y
|
||||
BR2_PACKAGE_CRDA=y
|
||||
# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set
|
||||
BR2_PACKAGE_IFUPDOWN=y
|
||||
BR2_PACKAGE_IPROUTE2=y
|
||||
BR2_PACKAGE_IPUTILS=y
|
||||
BR2_PACKAGE_IW=y
|
||||
@ -206,6 +216,7 @@ BR2_PACKAGE_NETWORK_MANAGER_CLI=y
|
||||
BR2_PACKAGE_NETWORK_MANAGER_MODEM_MANAGER=y
|
||||
BR2_PACKAGE_OPENSSH=y
|
||||
# BR2_PACKAGE_OPENSSH_SANDBOX is not set
|
||||
BR2_PACKAGE_RPCBIND=y
|
||||
BR2_PACKAGE_WGET=y
|
||||
BR2_PACKAGE_WIRELESS_TOOLS=y
|
||||
BR2_PACKAGE_WIRELESS_TOOLS_LIB=y
|
||||
@ -230,13 +241,13 @@ BR2_PACKAGE_SUDO=y
|
||||
BR2_PACKAGE_TIME=y
|
||||
BR2_PACKAGE_TINI=y
|
||||
BR2_PACKAGE_WHICH=y
|
||||
BR2_PACKAGE_ACL=y
|
||||
BR2_PACKAGE_COREUTILS=y
|
||||
BR2_PACKAGE_COREUTILS_INDIVIDUAL_BINARIES=y
|
||||
BR2_PACKAGE_EFIBOOTMGR=y
|
||||
BR2_PACKAGE_HTOP=y
|
||||
BR2_PACKAGE_NUMACTL=y
|
||||
BR2_PACKAGE_PODMAN=y
|
||||
BR2_PACKAGE_PODMAN_DRIVER_DEVICEMAPPER=y
|
||||
BR2_PACKAGE_PROCPS_NG=y
|
||||
BR2_PACKAGE_SHADOW=y
|
||||
BR2_PACKAGE_SHADOW_SHADOWGRP=y
|
||||
@ -262,6 +273,7 @@ BR2_PACKAGE_SYSTEMD_POLKIT=y
|
||||
BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
|
||||
BR2_PACKAGE_SYSTEMD_REPART=y
|
||||
BR2_PACKAGE_SYSTEMD_UTMP=y
|
||||
# BR2_PACKAGE_SYSTEMD_VCONSOLE is not set
|
||||
BR2_PACKAGE_TAR=y
|
||||
BR2_PACKAGE_UTIL_LINUX_BINARIES=y
|
||||
BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
|
||||
@ -298,24 +310,17 @@ BR2_PACKAGE_HOST_MKPASSWD=y
|
||||
BR2_PACKAGE_HOST_MTOOLS=y
|
||||
BR2_PACKAGE_HOST_PKGCONF=y
|
||||
BR2_PACKAGE_BTSPEAKER=y
|
||||
BR2_PACKAGE_HOSTNAME_SERVICE=y
|
||||
BR2_PACKAGE_CK=y
|
||||
BR2_PACKAGE_KSM_PRELOAD=y
|
||||
BR2_PACKAGE_KSMTUNED=y
|
||||
BR2_PACKAGE_NCPAMIXER=y
|
||||
BR2_PACKAGE_OPENFEC=y
|
||||
BR2_PACKAGE_OVOS_BUS_SERVER=y
|
||||
BR2_PACKAGE_OVOS_CONTAINERS=y
|
||||
BR2_PACKAGE_OVOS_CONTAINERS_ARCH="arm64"
|
||||
BR2_PACKAGE_OVOS_CONTAINERS_GUI=y
|
||||
BR2_PACKAGE_OVOS_SPLASH=y
|
||||
BR2_PACKAGE_RESPEAKER=y
|
||||
BR2_PACKAGE_RNNNOISE_LADSPA=y
|
||||
BR2_PACKAGE_RPI_BLUETOOTH=y
|
||||
BR2_PACKAGE_RPI_EEPROM=y
|
||||
BR2_PACKAGE_SYSBENCH=y
|
||||
BR2_PACKAGE_USERLAND_TOOLS=y
|
||||
BR2_PACKAGE_VOCALFUSION=y
|
||||
BR2_PACKAGE_PYTHON_ADAFRUIT_BLINKA=y
|
||||
BR2_PACKAGE_PYTHON_SMBUS2=y
|
||||
BR2_PACKAGE_PYTHON_OVOS_GUI=y
|
||||
BR2_PACKAGE_PYTHON_OVOS_BACKEND_CLIENT=y
|
||||
BR2_PACKAGE_PYTHON_OVOS_GUI_PLUGIN_SHELL_COMPANION=y
|
||||
|
@ -1,4 +1,4 @@
|
||||
CONFIG_LOCALVERSION="-ovos-buildroot"
|
||||
CONFIG_LOCALVERSION="-ovos"
|
||||
CONFIG_EXPERT=y
|
||||
|
||||
# GCC plugins are disabled by linux.mk, disable them here to reduce
|
||||
@ -8,12 +8,8 @@ CONFIG_GCC_PLUGINS=n
|
||||
CONFIG_CMDLINE=""
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_RT=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
CONFIG_PREEMPTION=y
|
||||
|
||||
CONFIG_PSI=y
|
||||
CONFIG_IKCONFIG=y
|
||||
@ -56,12 +52,19 @@ CONFIG_TMPFS_XATTR=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_SECCOMP_FILTER=y
|
||||
|
||||
CONFIG_AUDIT=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITY_SELINUX is not set
|
||||
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_LZ4=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
|
||||
CONFIG_CRYPTO_USER=m
|
||||
CONFIG_CRYPTO_USER_API_HASH=m
|
||||
CONFIG_CRYPTO_USER_API_SKCIPHER=m
|
||||
CONFIG_CRYPTO_USER_API_RNG=m
|
||||
CONFIG_CRYPTO_USER_API_AEAD=m
|
||||
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_EFI_PARTITION=y
|
||||
@ -70,7 +73,7 @@ CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
|
||||
CONFIG_BT=m
|
||||
CONFIG_BT=y
|
||||
CONFIG_BT_BREDR=y
|
||||
CONFIG_BT_RFCOMM=m
|
||||
CONFIG_BT_RFCOMM_TTY=y
|
||||
@ -78,16 +81,24 @@ CONFIG_BT_LE=y
|
||||
CONFIG_BT_BNEP=m
|
||||
CONFIG_BT_BNEP_MC_FILTER=y
|
||||
CONFIG_BT_BNEP_PROTO_FILTER=y
|
||||
CONFIG_BT_CMTP=m
|
||||
CONFIG_BT_HIDP=m
|
||||
CONFIG_BT_LEDS=y
|
||||
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_IPV6_ROUTER_PREF=y
|
||||
CONFIG_IPV6_REACHABILITY_PROBE=y
|
||||
CONFIG_IPV6_SIT=m
|
||||
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
|
||||
CONFIG_MPTCP=y
|
||||
CONFIG_MPTCP_IPV6=y
|
||||
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NF_TABLES_NETDEV=y
|
||||
@ -138,6 +149,7 @@ CONFIG_NFT_BRIDGE_REJECT=m
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
|
||||
CONFIG_NETFILTER_XT_MARK=m
|
||||
|
||||
CONFIG_IP_SET=m
|
||||
CONFIG_IP_SET_BITMAP_IP=m
|
||||
|
@ -1,16 +0,0 @@
|
||||
Bluetooth: hci0: Frame reassembly failed (-84)
|
||||
https://github.com/raspberrypi/firmware/issues/1150
|
||||
|
||||
Signed-off-by: Luca Giovenzana <luca@giovenzana.org>
|
||||
|
||||
--- btuart.orig 2020-03-25 03:05:24.491176583 +0100
|
||||
+++ btuart 2020-03-25 03:05:43.603107833 +0100
|
||||
@@ -19,7 +19,7 @@ if [ "$uart0" = "$serial1" ] ; then
|
||||
if [ "$uart0_pins" = "16" ] ; then
|
||||
$HCIATTACH /dev/serial1 bcm43xx 3000000 flow - $BDADDR
|
||||
else
|
||||
- $HCIATTACH /dev/serial1 bcm43xx 921600 noflow - $BDADDR
|
||||
+ $HCIATTACH /dev/serial1 bcm43xx 460800 noflow - $BDADDR
|
||||
fi
|
||||
else
|
||||
$HCIATTACH /dev/serial1 bcm43xx 460800 noflow - $BDADDR
|
@ -1,14 +0,0 @@
|
||||
[Unit]
|
||||
Description=Broadcom BCM4343* bluetooth HCI
|
||||
Before=bluetooth.service
|
||||
Before=btspeaker.service
|
||||
Requires=dev-serial1.device
|
||||
After=dev-serial1.device
|
||||
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStart=/usr/bin/btuart
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -1,8 +0,0 @@
|
||||
[Unit]
|
||||
Description=Raspberry Pi bluetooth helper
|
||||
Requires=bluetooth.service
|
||||
After=bluetooth.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/bthelper %I
|
@ -10,41 +10,16 @@ BTSPEAKER_SITE_METHOD = local
|
||||
BTSPEAKER_LICENSE = Apache License 2.0
|
||||
BTSPEAKER_LICENSE_FILES = LICENSE
|
||||
|
||||
define BTSPEAKER_BUILD_CMDS
|
||||
curl -L -o $(@D)/BCM43430A1.hcd https://raw.githubusercontent.com/RPi-Distro/bluez-firmware/e7fd166981ab4bb9a36c2d1500205a078a35714d/broadcom/BCM43430A1.hcd
|
||||
curl -L -o $(@D)/BCM4345C0.hcd https://raw.githubusercontent.com/RPi-Distro/bluez-firmware/e7fd166981ab4bb9a36c2d1500205a078a35714d/broadcom/BCM4345C0.hcd
|
||||
curl -L -o $(@D)/btuart https://raw.githubusercontent.com/RPi-Distro/pi-bluetooth/6f6386e91e33966d3c4a3cfee72d61e14c6a11ef/usr/bin/btuart
|
||||
curl -L -o $(@D)/bthelper https://raw.githubusercontent.com/RPi-Distro/pi-bluetooth/6f6386e91e33966d3c4a3cfee72d61e14c6a11ef/usr/bin/bthelper
|
||||
curl -L -o $(@D)/90-pi-bluetooth.rules https://raw.githubusercontent.com/RPi-Distro/pi-bluetooth/6f6386e91e33966d3c4a3cfee72d61e14c6a11ef/lib/udev/rules.d/90-pi-bluetooth.rules
|
||||
|
||||
patch $(@D)/btuart $(@D)/0001-btuart-reduced-baud-rate-rpi3b.patch
|
||||
endef
|
||||
|
||||
define BTSPEAKER_INSTALL_TARGET_CMDS
|
||||
$(INSTALL) -D -m 644 $(@D)/btspeaker.service \
|
||||
$(TARGET_DIR)/usr/lib/systemd/system/btspeaker.service
|
||||
|
||||
$(INSTALL) -D -m 644 $(@D)/brcm_bt.service \
|
||||
$(TARGET_DIR)/usr/lib/systemd/system/brcm_bt.service
|
||||
|
||||
$(INSTALL) -D -m 644 $(@D)/bthelper@.service \
|
||||
$(TARGET_DIR)/usr/lib/systemd/system/bthelper@.service
|
||||
|
||||
mkdir -p $(TARGET_DIR)/etc/bluetooth
|
||||
$(INSTALL) -D -m 644 $(@D)/main.conf \
|
||||
$(TARGET_DIR)/etc/bluetooth/main.conf
|
||||
$(INSTALL) -D -m 600 $(@D)/pin.conf \
|
||||
$(TARGET_DIR)/etc/bluetooth/pin.conf
|
||||
|
||||
$(INSTALL) -d $(TARGET_DIR)/usr/bin
|
||||
$(INSTALL) -m 0755 $(@D)/btuart $(TARGET_DIR)/usr/bin/
|
||||
$(INSTALL) -m 0755 $(@D)/bthelper $(TARGET_DIR)/usr/bin/
|
||||
|
||||
$(INSTALL) -d $(TARGET_DIR)/lib/firmware/brcm
|
||||
$(INSTALL) -m 0644 $(@D)/*.hcd $(TARGET_DIR)/lib/firmware/brcm/
|
||||
|
||||
$(INSTALL) -d $(TARGET_DIR)/usr/lib/udev/rules.d
|
||||
$(INSTALL) -m 0644 $(@D)/90-pi-bluetooth.rules $(TARGET_DIR)/usr/lib/udev/rules.d/
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
||||
|
@ -2,3 +2,7 @@
|
||||
Name = OpenVoiceOS
|
||||
Class = 0x41C
|
||||
DiscoverableTimeout = 0
|
||||
Experimental=true
|
||||
|
||||
[Policy]
|
||||
AutoEnable=true
|
||||
|
@ -0,0 +1,30 @@
|
||||
From b74ac4e14e4fcbb76b4cea86573cf602f2b28f8b Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b74ac4e14e4fcbb76b4cea86573cf602f2b28f8b.1649951264.git.stefan@agner.ch>
|
||||
From: Luca Giovenzana <luca@giovenzana.org>
|
||||
Date: Thu, 14 Apr 2022 14:55:56 +0200
|
||||
Subject: [PATCH] Fix Bluetooth: hci0: Frame reassembly failed (-84)
|
||||
|
||||
Lower UART baudrate to fix Frame reassembly failed (-84) issues.
|
||||
https://github.com/raspberrypi/firmware/issues/1150
|
||||
|
||||
Signed-off-by: Luca Giovenzana <luca@giovenzana.org>
|
||||
---
|
||||
usr/bin/btuart | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/usr/bin/btuart b/usr/bin/btuart
|
||||
index 493fd86..cb99a4f 100755
|
||||
--- a/usr/bin/btuart
|
||||
+++ b/usr/bin/btuart
|
||||
@@ -25,7 +25,7 @@ if [ "$uart0" = "$serial1" ] ; then
|
||||
if [ "$uart0_pins" = "16" ] ; then
|
||||
$HCIATTACH /dev/serial1 bcm43xx 3000000 flow - $BDADDR
|
||||
else
|
||||
- $HCIATTACH /dev/serial1 bcm43xx 921600 noflow - $BDADDR
|
||||
+ $HCIATTACH /dev/serial1 bcm43xx 460800 noflow - $BDADDR
|
||||
fi
|
||||
else
|
||||
$HCIATTACH /dev/serial1 bcm43xx 460800 noflow - $BDADDR
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 2bfc211b1dc619cce4ea500227576ce1d59c404e Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <2bfc211b1dc619cce4ea500227576ce1d59c404e.1649951264.git.stefan@agner.ch>
|
||||
In-Reply-To: <b74ac4e14e4fcbb76b4cea86573cf602f2b28f8b.1649951264.git.stefan@agner.ch>
|
||||
References: <b74ac4e14e4fcbb76b4cea86573cf602f2b28f8b.1649951264.git.stefan@agner.ch>
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Thu, 14 Apr 2022 15:29:39 +0200
|
||||
Subject: [PATCH] Test if WiFi/Bluetooth module is fitted on Compute Module 4
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
---
|
||||
usr/bin/btuart | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/usr/bin/btuart b/usr/bin/btuart
|
||||
index cb99a4f..046227c 100755
|
||||
--- a/usr/bin/btuart
|
||||
+++ b/usr/bin/btuart
|
||||
@@ -11,6 +11,15 @@ else
|
||||
BDADDR=`printf b8:27:eb:%02x:%02x:%02x $((0x$B1 ^ 0xaa)) $((0x$B2 ^ 0xaa)) $((0x$B3 ^ 0xaa))`
|
||||
fi
|
||||
|
||||
+if grep -q "raspberrypi,4-compute-module" /proc/device-tree/compatible; then
|
||||
+ BOARDREV_EXT=$(xxd -p -g4 /proc/device-tree/chosen/rpi-boardrev-ext)
|
||||
+ # Ceck Bit 30: Whether the Compute Module has a WiFi module fitted
|
||||
+ if [ $((16#${BOARDREV_EXT} & 16#40000000)) -gt 0 ]; then
|
||||
+ # No WiFi/Bluetooth
|
||||
+ exit 0
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
# Bail out if the kernel is managing the Bluetooth modem initialisation
|
||||
if ( dmesg | grep -q -E "hci[0-9]+: BCM: chip" ); then
|
||||
# On-board bluetooth is already enabled
|
||||
--
|
||||
2.35.1
|
||||
|
7
buildroot-external/package/rpi-bluetooth/Config.in
Normal file
7
buildroot-external/package/rpi-bluetooth/Config.in
Normal file
@ -0,0 +1,7 @@
|
||||
config BR2_PACKAGE_RPI_BLUETOOTH
|
||||
bool "Bluetooth scripts for Raspberry Pi"
|
||||
depends on BR2_PACKAGE_BLUEZ5_UTILS_CLIENT
|
||||
depends on BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_BT
|
||||
select BR2_PACKAGE_BLUEZ5_UTILS_DEPRECATED
|
||||
help
|
||||
Install Bluetooth scripts for Raspberry Pi
|
11
buildroot-external/package/rpi-bluetooth/bthelper@.service
Normal file
11
buildroot-external/package/rpi-bluetooth/bthelper@.service
Normal file
@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=Raspberry Pi bluetooth helper
|
||||
Requires=hciuart.service bluetooth.service
|
||||
After=hciuart.service
|
||||
Before=bluetooth.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecCondition=/bin/sh -c '[ "$(cat /proc/device-tree/$(cat /proc/device-tree/aliases/bluetooth)/status)" != "okay" ]'
|
||||
ExecStart=/usr/bin/bthelper %I
|
||||
RemainAfterExit=yes
|
10
buildroot-external/package/rpi-bluetooth/hcidisable.service
Normal file
10
buildroot-external/package/rpi-bluetooth/hcidisable.service
Normal file
@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Remove HCI kernel driver if WiFi/Bluetooth module is not present
|
||||
ConditionPathExists=!/sys/bus/sdio/devices/mmc1:0001:1
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStart=/usr/sbin/modprobe -r hci_uart
|
||||
|
||||
[Install]
|
||||
WantedBy=ovos-hardware.target
|
12
buildroot-external/package/rpi-bluetooth/hciuart.service
Normal file
12
buildroot-external/package/rpi-bluetooth/hciuart.service
Normal file
@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=Configure Bluetooth Modems connected by UART
|
||||
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins
|
||||
After=dev-serial1.device
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecCondition=/bin/sh -c '[ "$(cat /proc/device-tree/$(cat /proc/device-tree/aliases/bluetooth)/status)" != "okay" ]'
|
||||
ExecStart=/usr/bin/btuart
|
||||
|
||||
[Install]
|
||||
WantedBy=ovos-hardware.target
|
26
buildroot-external/package/rpi-bluetooth/rpi-bluetooth.mk
Normal file
26
buildroot-external/package/rpi-bluetooth/rpi-bluetooth.mk
Normal file
@ -0,0 +1,26 @@
|
||||
################################################################################
|
||||
#
|
||||
# rpi-bluetooth
|
||||
#
|
||||
################################################################################
|
||||
|
||||
RPI_BLUETOOTH_VERSION = 23af66cff597c80523bf9581d7f75d387227f183
|
||||
RPI_BLUETOOTH_SITE = $(call github,RPi-Distro,pi-bluetooth,$(RPI_BLUETOOTH_VERSION))
|
||||
RPI_BLUETOOTH_LICENSE = BSD-3-Clause
|
||||
RPI_BLUETOOTH_LICENSE_FILES = debian/copyright
|
||||
|
||||
define RPI_BLUETOOTH_INSTALL_TARGET_CMDS
|
||||
$(INSTALL) -d $(TARGET_DIR)/etc/systemd/system/ovos-hardware.target.wants
|
||||
$(INSTALL) -m 0644 $(BR2_EXTERNAL_HASSOS_PATH)/package/rpi-bluetooth/hciuart.service $(TARGET_DIR)/usr/lib/systemd/system/
|
||||
$(INSTALL) -m 0644 $(BR2_EXTERNAL_HASSOS_PATH)/package/pi-bluetooth/hcidisable.service $(TARGET_DIR)/usr/lib/systemd/system/
|
||||
$(INSTALL) -m 0644 $(BR2_EXTERNAL_HASSOS_PATH)/package/rpi-bluetooth/bthelper@.service $(TARGET_DIR)/usr/lib/systemd/system/
|
||||
|
||||
$(INSTALL) -d $(TARGET_DIR)/usr/bin
|
||||
$(INSTALL) -m 0755 $(@D)/usr/bin/btuart $(TARGET_DIR)/usr/bin/
|
||||
$(INSTALL) -m 0755 $(@D)/usr/bin/bthelper $(TARGET_DIR)/usr/bin/
|
||||
|
||||
$(INSTALL) -d $(TARGET_DIR)/usr/lib/udev/rules.d
|
||||
$(INSTALL) -m 0644 $(@D)/lib/udev/rules.d/90-pi-bluetooth.rules $(TARGET_DIR)/usr/lib/udev/rules.d/
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
@ -3,16 +3,16 @@
|
||||
# rpi-eeprom
|
||||
#
|
||||
#############################################################
|
||||
RPI_EEPROM_VERSION = e430a41e7323a1e28fb42b53cf79e5ba9b5ee975
|
||||
RPI_EEPROM_VERSION = 945d708fd0b200e62fcedd48236c7f9c43a44062
|
||||
RPI_EEPROM_SITE = $(call github,raspberrypi,rpi-eeprom,$(RPI_EEPROM_VERSION))
|
||||
RPI_EEPROM_LICENSE = BSD-3-Clause
|
||||
RPI_EEPROM_LICENSE_FILES = LICENSE
|
||||
RPI_EEPROM_INSTALL_IMAGES = YES
|
||||
|
||||
ifeq ($(BR2_PACKAGE_RPI_EEPROM_RPI4),y)
|
||||
RPI_EEPROM_FIRMWARE_PATH = firmware-2711/stable/pieeprom-2024-05-17.bin
|
||||
RPI_EEPROM_FIRMWARE_PATH = firmware-2711/stable/pieeprom-2024-07-30.bin
|
||||
else ifeq ($(BR2_PACKAGE_RPI_EEPROM_RPI5),y) # Raspberry Pi 5
|
||||
RPI_EEPROM_FIRMWARE_PATH = firmware-2712/stable/pieeprom-2024-06-05.bin
|
||||
RPI_EEPROM_FIRMWARE_PATH = firmware-2712/stable/pieeprom-2024-07-30.bin
|
||||
endif
|
||||
|
||||
define RPI_EEPROM_BUILD_CMDS
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 76591e4075194cf717dc085b8285912f706bcd46 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Tue, 28 Mar 2023 12:02:10 +0200
|
||||
Subject: [PATCH] ipv6: add option to explicitly enable reachability test
|
||||
|
||||
Systems which act as host as well as router might prefer the host
|
||||
behavior. Currently the kernel does not allow to use IPv6 forwarding
|
||||
globally and at the same time use route reachability probing.
|
||||
|
||||
Add a compile time flag to enable route reachability probe in any
|
||||
case.
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
---
|
||||
net/ipv6/Kconfig | 9 +++++++++
|
||||
net/ipv6/route.c | 3 ++-
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig
|
||||
index 08d4b7132d4c..242bf2eeb7ae 100644
|
||||
--- a/net/ipv6/Kconfig
|
||||
+++ b/net/ipv6/Kconfig
|
||||
@@ -48,6 +48,15 @@ config IPV6_OPTIMISTIC_DAD
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
+config IPV6_REACHABILITY_PROBE
|
||||
+ bool "IPv6: Always use reachability probing (RFC 4191)"
|
||||
+ help
|
||||
+ By default reachability probing is disabled on router devices (when
|
||||
+ IPv6 forwarding is enabled). This option explicitly enables
|
||||
+ reachability probing always.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
config INET6_AH
|
||||
tristate "IPv6: AH transformation"
|
||||
select XFRM_AH
|
||||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
|
||||
index 56525b5b95a2..916769b9a772 100644
|
||||
--- a/net/ipv6/route.c
|
||||
+++ b/net/ipv6/route.c
|
||||
@@ -2211,7 +2211,8 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
|
||||
|
||||
strict |= flags & RT6_LOOKUP_F_IFACE;
|
||||
strict |= flags & RT6_LOOKUP_F_IGNORE_LINKSTATE;
|
||||
- if (net->ipv6.devconf_all->forwarding == 0)
|
||||
+ if (net->ipv6.devconf_all->forwarding == 0 ||
|
||||
+ IS_ENABLED(CONFIG_IPV6_REACHABILITY_PROBE))
|
||||
strict |= RT6_LOOKUP_F_REACHABLE;
|
||||
|
||||
rcu_read_lock();
|
@ -1,54 +0,0 @@
|
||||
From 587ff8c1e0d4260e84573d21d2387b7bc3f6c055 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Fri, 8 Sep 2023 18:22:48 +0200
|
||||
Subject: [PATCH 001/198] sched: Constrain locks in sched_submit_work()
|
||||
|
||||
Even though sched_submit_work() is ran from preemptible context,
|
||||
it is discouraged to have it use blocking locks due to the recursion
|
||||
potential.
|
||||
|
||||
Enforce this.
|
||||
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-2-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/sched/core.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||
index 820880960513..3593fa308098 100644
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -6724,11 +6724,18 @@ void __noreturn do_task_dead(void)
|
||||
|
||||
static inline void sched_submit_work(struct task_struct *tsk)
|
||||
{
|
||||
+ static DEFINE_WAIT_OVERRIDE_MAP(sched_map, LD_WAIT_CONFIG);
|
||||
unsigned int task_flags;
|
||||
|
||||
if (task_is_running(tsk))
|
||||
return;
|
||||
|
||||
+ /*
|
||||
+ * Establish LD_WAIT_CONFIG context to ensure none of the code called
|
||||
+ * will use a blocking primitive -- which would lead to recursion.
|
||||
+ */
|
||||
+ lock_map_acquire_try(&sched_map);
|
||||
+
|
||||
task_flags = tsk->flags;
|
||||
/*
|
||||
* If a worker goes to sleep, notify and ask workqueue whether it
|
||||
@@ -6753,6 +6760,8 @@ static inline void sched_submit_work(struct task_struct *tsk)
|
||||
* make sure to submit it to avoid deadlocks.
|
||||
*/
|
||||
blk_flush_plug(tsk->plug, true);
|
||||
+
|
||||
+ lock_map_release(&sched_map);
|
||||
}
|
||||
|
||||
static void sched_update_worker(struct task_struct *tsk)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,86 +0,0 @@
|
||||
From eda74bfb4606440876eee1775a1bb23923fb02cc Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 8 Sep 2023 18:22:49 +0200
|
||||
Subject: [PATCH 002/198] locking/rtmutex: Avoid unconditional slowpath for
|
||||
DEBUG_RT_MUTEXES
|
||||
|
||||
With DEBUG_RT_MUTEXES enabled the fast-path rt_mutex_cmpxchg_acquire()
|
||||
always fails and all lock operations take the slow path.
|
||||
|
||||
Provide a new helper inline rt_mutex_try_acquire() which maps to
|
||||
rt_mutex_cmpxchg_acquire() in the non-debug case. For the debug case
|
||||
it invokes rt_mutex_slowtrylock() which can acquire a non-contended
|
||||
rtmutex under full debug coverage.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-3-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/locking/rtmutex.c | 21 ++++++++++++++++++++-
|
||||
kernel/locking/ww_rt_mutex.c | 2 +-
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
|
||||
index 21db0df0eb00..bcec0533a0cc 100644
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -218,6 +218,11 @@ static __always_inline bool rt_mutex_cmpxchg_acquire(struct rt_mutex_base *lock,
|
||||
return try_cmpxchg_acquire(&lock->owner, &old, new);
|
||||
}
|
||||
|
||||
+static __always_inline bool rt_mutex_try_acquire(struct rt_mutex_base *lock)
|
||||
+{
|
||||
+ return rt_mutex_cmpxchg_acquire(lock, NULL, current);
|
||||
+}
|
||||
+
|
||||
static __always_inline bool rt_mutex_cmpxchg_release(struct rt_mutex_base *lock,
|
||||
struct task_struct *old,
|
||||
struct task_struct *new)
|
||||
@@ -297,6 +302,20 @@ static __always_inline bool rt_mutex_cmpxchg_acquire(struct rt_mutex_base *lock,
|
||||
|
||||
}
|
||||
|
||||
+static int __sched rt_mutex_slowtrylock(struct rt_mutex_base *lock);
|
||||
+
|
||||
+static __always_inline bool rt_mutex_try_acquire(struct rt_mutex_base *lock)
|
||||
+{
|
||||
+ /*
|
||||
+ * With debug enabled rt_mutex_cmpxchg trylock() will always fail.
|
||||
+ *
|
||||
+ * Avoid unconditionally taking the slow path by using
|
||||
+ * rt_mutex_slow_trylock() which is covered by the debug code and can
|
||||
+ * acquire a non-contended rtmutex.
|
||||
+ */
|
||||
+ return rt_mutex_slowtrylock(lock);
|
||||
+}
|
||||
+
|
||||
static __always_inline bool rt_mutex_cmpxchg_release(struct rt_mutex_base *lock,
|
||||
struct task_struct *old,
|
||||
struct task_struct *new)
|
||||
@@ -1755,7 +1774,7 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock,
|
||||
static __always_inline int __rt_mutex_lock(struct rt_mutex_base *lock,
|
||||
unsigned int state)
|
||||
{
|
||||
- if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
|
||||
+ if (likely(rt_mutex_try_acquire(lock)))
|
||||
return 0;
|
||||
|
||||
return rt_mutex_slowlock(lock, NULL, state);
|
||||
diff --git a/kernel/locking/ww_rt_mutex.c b/kernel/locking/ww_rt_mutex.c
|
||||
index d1473c624105..c7196de838ed 100644
|
||||
--- a/kernel/locking/ww_rt_mutex.c
|
||||
+++ b/kernel/locking/ww_rt_mutex.c
|
||||
@@ -62,7 +62,7 @@ __ww_rt_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ww_ctx,
|
||||
}
|
||||
mutex_acquire_nest(&rtm->dep_map, 0, 0, nest_lock, ip);
|
||||
|
||||
- if (likely(rt_mutex_cmpxchg_acquire(&rtm->rtmutex, NULL, current))) {
|
||||
+ if (likely(rt_mutex_try_acquire(&rtm->rtmutex))) {
|
||||
if (ww_ctx)
|
||||
ww_mutex_set_context_fastpath(lock, ww_ctx);
|
||||
return 0;
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,63 +0,0 @@
|
||||
From 105d9b72e13aab3277bd67e131719c4ed0ca94b5 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 8 Sep 2023 18:22:50 +0200
|
||||
Subject: [PATCH 003/198] sched: Extract __schedule_loop()
|
||||
|
||||
There are currently two implementations of this basic __schedule()
|
||||
loop, and there is soon to be a third.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-4-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/sched/core.c | 21 +++++++++++----------
|
||||
1 file changed, 11 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||
index 3593fa308098..30659d67daf6 100644
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -6774,16 +6774,21 @@ static void sched_update_worker(struct task_struct *tsk)
|
||||
}
|
||||
}
|
||||
|
||||
-asmlinkage __visible void __sched schedule(void)
|
||||
+static __always_inline void __schedule_loop(unsigned int sched_mode)
|
||||
{
|
||||
- struct task_struct *tsk = current;
|
||||
-
|
||||
- sched_submit_work(tsk);
|
||||
do {
|
||||
preempt_disable();
|
||||
- __schedule(SM_NONE);
|
||||
+ __schedule(sched_mode);
|
||||
sched_preempt_enable_no_resched();
|
||||
} while (need_resched());
|
||||
+}
|
||||
+
|
||||
+asmlinkage __visible void __sched schedule(void)
|
||||
+{
|
||||
+ struct task_struct *tsk = current;
|
||||
+
|
||||
+ sched_submit_work(tsk);
|
||||
+ __schedule_loop(SM_NONE);
|
||||
sched_update_worker(tsk);
|
||||
}
|
||||
EXPORT_SYMBOL(schedule);
|
||||
@@ -6847,11 +6852,7 @@ void __sched schedule_preempt_disabled(void)
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
void __sched notrace schedule_rtlock(void)
|
||||
{
|
||||
- do {
|
||||
- preempt_disable();
|
||||
- __schedule(SM_RTLOCK_WAIT);
|
||||
- sched_preempt_enable_no_resched();
|
||||
- } while (need_resched());
|
||||
+ __schedule_loop(SM_RTLOCK_WAIT);
|
||||
}
|
||||
NOKPROBE_SYMBOL(schedule_rtlock);
|
||||
#endif
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,137 +0,0 @@
|
||||
From 92d2f65eb79154dc9a01fee79cfb29b8c7c643c0 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Fri, 8 Sep 2023 18:22:51 +0200
|
||||
Subject: [PATCH 004/198] sched: Provide rt_mutex specific scheduler helpers
|
||||
|
||||
With PREEMPT_RT there is a rt_mutex recursion problem where
|
||||
sched_submit_work() can use an rtlock (aka spinlock_t). More
|
||||
specifically what happens is:
|
||||
|
||||
mutex_lock() /* really rt_mutex */
|
||||
...
|
||||
__rt_mutex_slowlock_locked()
|
||||
task_blocks_on_rt_mutex()
|
||||
// enqueue current task as waiter
|
||||
// do PI chain walk
|
||||
rt_mutex_slowlock_block()
|
||||
schedule()
|
||||
sched_submit_work()
|
||||
...
|
||||
spin_lock() /* really rtlock */
|
||||
...
|
||||
__rt_mutex_slowlock_locked()
|
||||
task_blocks_on_rt_mutex()
|
||||
// enqueue current task as waiter *AGAIN*
|
||||
// *CONFUSION*
|
||||
|
||||
Fix this by making rt_mutex do the sched_submit_work() early, before
|
||||
it enqueues itself as a waiter -- before it even knows *if* it will
|
||||
wait.
|
||||
|
||||
[[ basically Thomas' patch but with different naming and a few asserts
|
||||
added ]]
|
||||
|
||||
Originally-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-5-bigeasy@linutronix.de
|
||||
---
|
||||
include/linux/sched.h | 3 +++
|
||||
include/linux/sched/rt.h | 4 ++++
|
||||
kernel/sched/core.c | 36 ++++++++++++++++++++++++++++++++----
|
||||
3 files changed, 39 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 77f01ac385f7..67623ffd4a8e 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -911,6 +911,9 @@ struct task_struct {
|
||||
* ->sched_remote_wakeup gets used, so it can be in this word.
|
||||
*/
|
||||
unsigned sched_remote_wakeup:1;
|
||||
+#ifdef CONFIG_RT_MUTEXES
|
||||
+ unsigned sched_rt_mutex:1;
|
||||
+#endif
|
||||
|
||||
/* Bit to tell LSMs we're in execve(): */
|
||||
unsigned in_execve:1;
|
||||
diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h
|
||||
index 994c25640e15..b2b9e6eb9683 100644
|
||||
--- a/include/linux/sched/rt.h
|
||||
+++ b/include/linux/sched/rt.h
|
||||
@@ -30,6 +30,10 @@ static inline bool task_is_realtime(struct task_struct *tsk)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
+extern void rt_mutex_pre_schedule(void);
|
||||
+extern void rt_mutex_schedule(void);
|
||||
+extern void rt_mutex_post_schedule(void);
|
||||
+
|
||||
/*
|
||||
* Must hold either p->pi_lock or task_rq(p)->lock.
|
||||
*/
|
||||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||
index 30659d67daf6..a1fc8d66c7ac 100644
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -6727,9 +6727,6 @@ static inline void sched_submit_work(struct task_struct *tsk)
|
||||
static DEFINE_WAIT_OVERRIDE_MAP(sched_map, LD_WAIT_CONFIG);
|
||||
unsigned int task_flags;
|
||||
|
||||
- if (task_is_running(tsk))
|
||||
- return;
|
||||
-
|
||||
/*
|
||||
* Establish LD_WAIT_CONFIG context to ensure none of the code called
|
||||
* will use a blocking primitive -- which would lead to recursion.
|
||||
@@ -6787,7 +6784,12 @@ asmlinkage __visible void __sched schedule(void)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
- sched_submit_work(tsk);
|
||||
+#ifdef CONFIG_RT_MUTEXES
|
||||
+ lockdep_assert(!tsk->sched_rt_mutex);
|
||||
+#endif
|
||||
+
|
||||
+ if (!task_is_running(tsk))
|
||||
+ sched_submit_work(tsk);
|
||||
__schedule_loop(SM_NONE);
|
||||
sched_update_worker(tsk);
|
||||
}
|
||||
@@ -7048,6 +7050,32 @@ static void __setscheduler_prio(struct task_struct *p, int prio)
|
||||
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
|
||||
+/*
|
||||
+ * Would be more useful with typeof()/auto_type but they don't mix with
|
||||
+ * bit-fields. Since it's a local thing, use int. Keep the generic sounding
|
||||
+ * name such that if someone were to implement this function we get to compare
|
||||
+ * notes.
|
||||
+ */
|
||||
+#define fetch_and_set(x, v) ({ int _x = (x); (x) = (v); _x; })
|
||||
+
|
||||
+void rt_mutex_pre_schedule(void)
|
||||
+{
|
||||
+ lockdep_assert(!fetch_and_set(current->sched_rt_mutex, 1));
|
||||
+ sched_submit_work(current);
|
||||
+}
|
||||
+
|
||||
+void rt_mutex_schedule(void)
|
||||
+{
|
||||
+ lockdep_assert(current->sched_rt_mutex);
|
||||
+ __schedule_loop(SM_NONE);
|
||||
+}
|
||||
+
|
||||
+void rt_mutex_post_schedule(void)
|
||||
+{
|
||||
+ sched_update_worker(current);
|
||||
+ lockdep_assert(fetch_and_set(current->sched_rt_mutex, 0));
|
||||
+}
|
||||
+
|
||||
static inline int __rt_effective_prio(struct task_struct *pi_task, int prio)
|
||||
{
|
||||
if (pi_task)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,191 +0,0 @@
|
||||
From 12c75059e5431cc6e68f1b77e4e248040cd8779c Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 8 Sep 2023 18:22:52 +0200
|
||||
Subject: [PATCH 005/198] locking/rtmutex: Use rt_mutex specific scheduler
|
||||
helpers
|
||||
|
||||
Have rt_mutex use the rt_mutex specific scheduler helpers to avoid
|
||||
recursion vs rtlock on the PI state.
|
||||
|
||||
[[ peterz: adapted to new names ]]
|
||||
|
||||
Reported-by: Crystal Wood <swood@redhat.com>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-6-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/futex/pi.c | 11 +++++++++++
|
||||
kernel/locking/rtmutex.c | 14 ++++++++++++--
|
||||
kernel/locking/rwbase_rt.c | 6 ++++++
|
||||
kernel/locking/rwsem.c | 8 +++++++-
|
||||
kernel/locking/spinlock_rt.c | 4 ++++
|
||||
5 files changed, 40 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/futex/pi.c b/kernel/futex/pi.c
|
||||
index ce2889f12375..f8e65b27d9d6 100644
|
||||
--- a/kernel/futex/pi.c
|
||||
+++ b/kernel/futex/pi.c
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/sched/rt.h>
|
||||
#include <linux/sched/task.h>
|
||||
|
||||
#include "futex.h"
|
||||
@@ -1002,6 +1003,12 @@ int futex_lock_pi(u32 __user *uaddr, unsigned int flags, ktime_t *time, int tryl
|
||||
goto no_block;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Must be done before we enqueue the waiter, here is unfortunately
|
||||
+ * under the hb lock, but that *should* work because it does nothing.
|
||||
+ */
|
||||
+ rt_mutex_pre_schedule();
|
||||
+
|
||||
rt_mutex_init_waiter(&rt_waiter);
|
||||
|
||||
/*
|
||||
@@ -1052,6 +1059,10 @@ int futex_lock_pi(u32 __user *uaddr, unsigned int flags, ktime_t *time, int tryl
|
||||
if (ret && !rt_mutex_cleanup_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter))
|
||||
ret = 0;
|
||||
|
||||
+ /*
|
||||
+ * Waiter is unqueued.
|
||||
+ */
|
||||
+ rt_mutex_post_schedule();
|
||||
no_block:
|
||||
/*
|
||||
* Fixup the pi_state owner and possibly acquire the lock if we
|
||||
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
|
||||
index bcec0533a0cc..a3fe05dfd0d8 100644
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1632,7 +1632,7 @@ static int __sched rt_mutex_slowlock_block(struct rt_mutex_base *lock,
|
||||
raw_spin_unlock_irq(&lock->wait_lock);
|
||||
|
||||
if (!owner || !rtmutex_spin_on_owner(lock, waiter, owner))
|
||||
- schedule();
|
||||
+ rt_mutex_schedule();
|
||||
|
||||
raw_spin_lock_irq(&lock->wait_lock);
|
||||
set_current_state(state);
|
||||
@@ -1661,7 +1661,7 @@ static void __sched rt_mutex_handle_deadlock(int res, int detect_deadlock,
|
||||
WARN(1, "rtmutex deadlock detected\n");
|
||||
while (1) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
- schedule();
|
||||
+ rt_mutex_schedule();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1756,6 +1756,15 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock,
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
+ /*
|
||||
+ * Do all pre-schedule work here, before we queue a waiter and invoke
|
||||
+ * PI -- any such work that trips on rtlock (PREEMPT_RT spinlock) would
|
||||
+ * otherwise recurse back into task_blocks_on_rt_mutex() through
|
||||
+ * rtlock_slowlock() and will then enqueue a second waiter for this
|
||||
+ * same task and things get really confusing real fast.
|
||||
+ */
|
||||
+ rt_mutex_pre_schedule();
|
||||
+
|
||||
/*
|
||||
* Technically we could use raw_spin_[un]lock_irq() here, but this can
|
||||
* be called in early boot if the cmpxchg() fast path is disabled
|
||||
@@ -1767,6 +1776,7 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock,
|
||||
raw_spin_lock_irqsave(&lock->wait_lock, flags);
|
||||
ret = __rt_mutex_slowlock_locked(lock, ww_ctx, state);
|
||||
raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
|
||||
+ rt_mutex_post_schedule();
|
||||
|
||||
return ret;
|
||||
}
|
||||
diff --git a/kernel/locking/rwbase_rt.c b/kernel/locking/rwbase_rt.c
|
||||
index 25ec0239477c..c7258cb32d91 100644
|
||||
--- a/kernel/locking/rwbase_rt.c
|
||||
+++ b/kernel/locking/rwbase_rt.c
|
||||
@@ -71,6 +71,7 @@ static int __sched __rwbase_read_lock(struct rwbase_rt *rwb,
|
||||
struct rt_mutex_base *rtm = &rwb->rtmutex;
|
||||
int ret;
|
||||
|
||||
+ rwbase_pre_schedule();
|
||||
raw_spin_lock_irq(&rtm->wait_lock);
|
||||
|
||||
/*
|
||||
@@ -125,6 +126,7 @@ static int __sched __rwbase_read_lock(struct rwbase_rt *rwb,
|
||||
rwbase_rtmutex_unlock(rtm);
|
||||
|
||||
trace_contention_end(rwb, ret);
|
||||
+ rwbase_post_schedule();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -237,6 +239,8 @@ static int __sched rwbase_write_lock(struct rwbase_rt *rwb,
|
||||
/* Force readers into slow path */
|
||||
atomic_sub(READER_BIAS, &rwb->readers);
|
||||
|
||||
+ rwbase_pre_schedule();
|
||||
+
|
||||
raw_spin_lock_irqsave(&rtm->wait_lock, flags);
|
||||
if (__rwbase_write_trylock(rwb))
|
||||
goto out_unlock;
|
||||
@@ -248,6 +252,7 @@ static int __sched rwbase_write_lock(struct rwbase_rt *rwb,
|
||||
if (rwbase_signal_pending_state(state, current)) {
|
||||
rwbase_restore_current_state();
|
||||
__rwbase_write_unlock(rwb, 0, flags);
|
||||
+ rwbase_post_schedule();
|
||||
trace_contention_end(rwb, -EINTR);
|
||||
return -EINTR;
|
||||
}
|
||||
@@ -266,6 +271,7 @@ static int __sched rwbase_write_lock(struct rwbase_rt *rwb,
|
||||
|
||||
out_unlock:
|
||||
raw_spin_unlock_irqrestore(&rtm->wait_lock, flags);
|
||||
+ rwbase_post_schedule();
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
|
||||
index 9eabd585ce7a..2340b6d90ec6 100644
|
||||
--- a/kernel/locking/rwsem.c
|
||||
+++ b/kernel/locking/rwsem.c
|
||||
@@ -1427,8 +1427,14 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
|
||||
#define rwbase_signal_pending_state(state, current) \
|
||||
signal_pending_state(state, current)
|
||||
|
||||
+#define rwbase_pre_schedule() \
|
||||
+ rt_mutex_pre_schedule()
|
||||
+
|
||||
#define rwbase_schedule() \
|
||||
- schedule()
|
||||
+ rt_mutex_schedule()
|
||||
+
|
||||
+#define rwbase_post_schedule() \
|
||||
+ rt_mutex_post_schedule()
|
||||
|
||||
#include "rwbase_rt.c"
|
||||
|
||||
diff --git a/kernel/locking/spinlock_rt.c b/kernel/locking/spinlock_rt.c
|
||||
index 48a19ed8486d..842037b2ba54 100644
|
||||
--- a/kernel/locking/spinlock_rt.c
|
||||
+++ b/kernel/locking/spinlock_rt.c
|
||||
@@ -184,9 +184,13 @@ static __always_inline int rwbase_rtmutex_trylock(struct rt_mutex_base *rtm)
|
||||
|
||||
#define rwbase_signal_pending_state(state, current) (0)
|
||||
|
||||
+#define rwbase_pre_schedule()
|
||||
+
|
||||
#define rwbase_schedule() \
|
||||
schedule_rtlock()
|
||||
|
||||
+#define rwbase_post_schedule()
|
||||
+
|
||||
#include "rwbase_rt.c"
|
||||
/*
|
||||
* The common functions which get wrapped into the rwlock API.
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,66 +0,0 @@
|
||||
From 2356fd26aab66034283ab841530ee12d7f3c5a7b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 8 Sep 2023 18:22:53 +0200
|
||||
Subject: [PATCH 006/198] locking/rtmutex: Add a lockdep assert to catch
|
||||
potential nested blocking
|
||||
|
||||
There used to be a BUG_ON(current->pi_blocked_on) in the lock acquisition
|
||||
functions, but that vanished in one of the rtmutex overhauls.
|
||||
|
||||
Bring it back in form of a lockdep assert to catch code paths which take
|
||||
rtmutex based locks with current::pi_blocked_on != NULL.
|
||||
|
||||
Reported-by: Crystal Wood <swood@redhat.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: "Peter Zijlstra (Intel)" <peterz@infradead.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Link: https://lkml.kernel.org/r/20230908162254.999499-7-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/locking/rtmutex.c | 2 ++
|
||||
kernel/locking/rwbase_rt.c | 2 ++
|
||||
kernel/locking/spinlock_rt.c | 2 ++
|
||||
3 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
|
||||
index a3fe05dfd0d8..4a10e8c16fd2 100644
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1784,6 +1784,8 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock,
|
||||
static __always_inline int __rt_mutex_lock(struct rt_mutex_base *lock,
|
||||
unsigned int state)
|
||||
{
|
||||
+ lockdep_assert(!current->pi_blocked_on);
|
||||
+
|
||||
if (likely(rt_mutex_try_acquire(lock)))
|
||||
return 0;
|
||||
|
||||
diff --git a/kernel/locking/rwbase_rt.c b/kernel/locking/rwbase_rt.c
|
||||
index c7258cb32d91..34a59569db6b 100644
|
||||
--- a/kernel/locking/rwbase_rt.c
|
||||
+++ b/kernel/locking/rwbase_rt.c
|
||||
@@ -133,6 +133,8 @@ static int __sched __rwbase_read_lock(struct rwbase_rt *rwb,
|
||||
static __always_inline int rwbase_read_lock(struct rwbase_rt *rwb,
|
||||
unsigned int state)
|
||||
{
|
||||
+ lockdep_assert(!current->pi_blocked_on);
|
||||
+
|
||||
if (rwbase_read_trylock(rwb))
|
||||
return 0;
|
||||
|
||||
diff --git a/kernel/locking/spinlock_rt.c b/kernel/locking/spinlock_rt.c
|
||||
index 842037b2ba54..38e292454fcc 100644
|
||||
--- a/kernel/locking/spinlock_rt.c
|
||||
+++ b/kernel/locking/spinlock_rt.c
|
||||
@@ -37,6 +37,8 @@
|
||||
|
||||
static __always_inline void rtlock_lock(struct rt_mutex_base *rtm)
|
||||
{
|
||||
+ lockdep_assert(!current->pi_blocked_on);
|
||||
+
|
||||
if (unlikely(!rt_mutex_cmpxchg_acquire(rtm, NULL, current)))
|
||||
rtlock_slowlock(rtm);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,204 +0,0 @@
|
||||
From 429cfb6a297e8d300a412a4a5d3d934d013d0fab Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Fri, 15 Sep 2023 17:19:44 +0200
|
||||
Subject: [PATCH 007/198] futex/pi: Fix recursive rt_mutex waiter state
|
||||
|
||||
Some new assertions pointed out that the existing code has nested rt_mutex wait
|
||||
state in the futex code.
|
||||
|
||||
Specifically, the futex_lock_pi() cancel case uses spin_lock() while there
|
||||
still is a rt_waiter enqueued for this task, resulting in a state where there
|
||||
are two waiters for the same task (and task_struct::pi_blocked_on gets
|
||||
scrambled).
|
||||
|
||||
The reason to take hb->lock at this point is to avoid the wake_futex_pi()
|
||||
EAGAIN case.
|
||||
|
||||
This happens when futex_top_waiter() and rt_mutex_top_waiter() state becomes
|
||||
inconsistent. The current rules are such that this inconsistency will not be
|
||||
observed.
|
||||
|
||||
Notably the case that needs to be avoided is where futex_lock_pi() and
|
||||
futex_unlock_pi() interleave such that unlock will fail to observe a new
|
||||
waiter.
|
||||
|
||||
*However* the case at hand is where a waiter is leaving, in this case the race
|
||||
means a waiter that is going away is not observed -- which is harmless,
|
||||
provided this race is explicitly handled.
|
||||
|
||||
This is a somewhat dangerous proposition because the converse race is not
|
||||
observing a new waiter, which must absolutely not happen. But since the race is
|
||||
valid this cannot be asserted.
|
||||
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Tested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lkml.kernel.org/r/20230915151943.GD6743@noisy.programming.kicks-ass.net
|
||||
---
|
||||
kernel/futex/pi.c | 76 ++++++++++++++++++++++++++----------------
|
||||
kernel/futex/requeue.c | 6 ++--
|
||||
2 files changed, 52 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/kernel/futex/pi.c b/kernel/futex/pi.c
|
||||
index f8e65b27d9d6..d636a1bbd7d0 100644
|
||||
--- a/kernel/futex/pi.c
|
||||
+++ b/kernel/futex/pi.c
|
||||
@@ -611,29 +611,16 @@ int futex_lock_pi_atomic(u32 __user *uaddr, struct futex_hash_bucket *hb,
|
||||
/*
|
||||
* Caller must hold a reference on @pi_state.
|
||||
*/
|
||||
-static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_state)
|
||||
+static int wake_futex_pi(u32 __user *uaddr, u32 uval,
|
||||
+ struct futex_pi_state *pi_state,
|
||||
+ struct rt_mutex_waiter *top_waiter)
|
||||
{
|
||||
- struct rt_mutex_waiter *top_waiter;
|
||||
struct task_struct *new_owner;
|
||||
bool postunlock = false;
|
||||
DEFINE_RT_WAKE_Q(wqh);
|
||||
u32 curval, newval;
|
||||
int ret = 0;
|
||||
|
||||
- top_waiter = rt_mutex_top_waiter(&pi_state->pi_mutex);
|
||||
- if (WARN_ON_ONCE(!top_waiter)) {
|
||||
- /*
|
||||
- * As per the comment in futex_unlock_pi() this should not happen.
|
||||
- *
|
||||
- * When this happens, give up our locks and try again, giving
|
||||
- * the futex_lock_pi() instance time to complete, either by
|
||||
- * waiting on the rtmutex or removing itself from the futex
|
||||
- * queue.
|
||||
- */
|
||||
- ret = -EAGAIN;
|
||||
- goto out_unlock;
|
||||
- }
|
||||
-
|
||||
new_owner = top_waiter->task;
|
||||
|
||||
/*
|
||||
@@ -1046,19 +1033,33 @@ int futex_lock_pi(u32 __user *uaddr, unsigned int flags, ktime_t *time, int tryl
|
||||
ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter);
|
||||
|
||||
cleanup:
|
||||
- spin_lock(q.lock_ptr);
|
||||
/*
|
||||
* If we failed to acquire the lock (deadlock/signal/timeout), we must
|
||||
- * first acquire the hb->lock before removing the lock from the
|
||||
- * rt_mutex waitqueue, such that we can keep the hb and rt_mutex wait
|
||||
- * lists consistent.
|
||||
+ * must unwind the above, however we canont lock hb->lock because
|
||||
+ * rt_mutex already has a waiter enqueued and hb->lock can itself try
|
||||
+ * and enqueue an rt_waiter through rtlock.
|
||||
+ *
|
||||
+ * Doing the cleanup without holding hb->lock can cause inconsistent
|
||||
+ * state between hb and pi_state, but only in the direction of not
|
||||
+ * seeing a waiter that is leaving.
|
||||
+ *
|
||||
+ * See futex_unlock_pi(), it deals with this inconsistency.
|
||||
*
|
||||
- * In particular; it is important that futex_unlock_pi() can not
|
||||
- * observe this inconsistency.
|
||||
+ * There be dragons here, since we must deal with the inconsistency on
|
||||
+ * the way out (here), it is impossible to detect/warn about the race
|
||||
+ * the other way around (missing an incoming waiter).
|
||||
+ *
|
||||
+ * What could possibly go wrong...
|
||||
*/
|
||||
if (ret && !rt_mutex_cleanup_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter))
|
||||
ret = 0;
|
||||
|
||||
+ /*
|
||||
+ * Now that the rt_waiter has been dequeued, it is safe to use
|
||||
+ * spinlock/rtlock (which might enqueue its own rt_waiter) and fix up
|
||||
+ * the
|
||||
+ */
|
||||
+ spin_lock(q.lock_ptr);
|
||||
/*
|
||||
* Waiter is unqueued.
|
||||
*/
|
||||
@@ -1143,6 +1144,7 @@ int futex_unlock_pi(u32 __user *uaddr, unsigned int flags)
|
||||
top_waiter = futex_top_waiter(hb, &key);
|
||||
if (top_waiter) {
|
||||
struct futex_pi_state *pi_state = top_waiter->pi_state;
|
||||
+ struct rt_mutex_waiter *rt_waiter;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!pi_state)
|
||||
@@ -1155,22 +1157,39 @@ int futex_unlock_pi(u32 __user *uaddr, unsigned int flags)
|
||||
if (pi_state->owner != current)
|
||||
goto out_unlock;
|
||||
|
||||
- get_pi_state(pi_state);
|
||||
/*
|
||||
* By taking wait_lock while still holding hb->lock, we ensure
|
||||
- * there is no point where we hold neither; and therefore
|
||||
- * wake_futex_p() must observe a state consistent with what we
|
||||
- * observed.
|
||||
+ * there is no point where we hold neither; and thereby
|
||||
+ * wake_futex_pi() must observe any new waiters.
|
||||
+ *
|
||||
+ * Since the cleanup: case in futex_lock_pi() removes the
|
||||
+ * rt_waiter without holding hb->lock, it is possible for
|
||||
+ * wake_futex_pi() to not find a waiter while the above does,
|
||||
+ * in this case the waiter is on the way out and it can be
|
||||
+ * ignored.
|
||||
*
|
||||
* In particular; this forces __rt_mutex_start_proxy() to
|
||||
* complete such that we're guaranteed to observe the
|
||||
- * rt_waiter. Also see the WARN in wake_futex_pi().
|
||||
+ * rt_waiter.
|
||||
*/
|
||||
raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
+
|
||||
+ /*
|
||||
+ * Futex vs rt_mutex waiter state -- if there are no rt_mutex
|
||||
+ * waiters even though futex thinks there are, then the waiter
|
||||
+ * is leaving and the uncontended path is safe to take.
|
||||
+ */
|
||||
+ rt_waiter = rt_mutex_top_waiter(&pi_state->pi_mutex);
|
||||
+ if (!rt_waiter) {
|
||||
+ raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
+ goto do_uncontended;
|
||||
+ }
|
||||
+
|
||||
+ get_pi_state(pi_state);
|
||||
spin_unlock(&hb->lock);
|
||||
|
||||
/* drops pi_state->pi_mutex.wait_lock */
|
||||
- ret = wake_futex_pi(uaddr, uval, pi_state);
|
||||
+ ret = wake_futex_pi(uaddr, uval, pi_state, rt_waiter);
|
||||
|
||||
put_pi_state(pi_state);
|
||||
|
||||
@@ -1198,6 +1217,7 @@ int futex_unlock_pi(u32 __user *uaddr, unsigned int flags)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+do_uncontended:
|
||||
/*
|
||||
* We have no kernel internal state, i.e. no waiters in the
|
||||
* kernel. Waiters which are about to queue themselves are stuck
|
||||
diff --git a/kernel/futex/requeue.c b/kernel/futex/requeue.c
|
||||
index cba8b1a6a4cc..4c73e0b81acc 100644
|
||||
--- a/kernel/futex/requeue.c
|
||||
+++ b/kernel/futex/requeue.c
|
||||
@@ -850,11 +850,13 @@ int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
|
||||
pi_mutex = &q.pi_state->pi_mutex;
|
||||
ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter);
|
||||
|
||||
- /* Current is not longer pi_blocked_on */
|
||||
- spin_lock(q.lock_ptr);
|
||||
+ /*
|
||||
+ * See futex_unlock_pi()'s cleanup: comment.
|
||||
+ */
|
||||
if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter))
|
||||
ret = 0;
|
||||
|
||||
+ spin_lock(q.lock_ptr);
|
||||
debug_rt_mutex_free_waiter(&rt_waiter);
|
||||
/*
|
||||
* Fixup the pi_state owner and possibly acquire the lock if we
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 83a0432f612bd7862f247f45744e99b45fc21389 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 3 Aug 2023 12:09:31 +0200
|
||||
Subject: [PATCH 008/198] signal: Add proper comment about the preempt-disable
|
||||
in ptrace_stop().
|
||||
|
||||
Commit 53da1d9456fe7 ("fix ptrace slowness") added a preempt-disable section
|
||||
between read_unlock() and the following schedule() invocation without
|
||||
explaining why it is needed.
|
||||
|
||||
Replace the comment with an explanation why this is needed. Clarify that
|
||||
it is needed for correctness but for performance reasons.
|
||||
|
||||
Acked-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230803100932.325870-2-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/signal.c | 17 ++++++++++++++---
|
||||
1 file changed, 14 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/signal.c b/kernel/signal.c
|
||||
index 09019017d669..051ed8114cd4 100644
|
||||
--- a/kernel/signal.c
|
||||
+++ b/kernel/signal.c
|
||||
@@ -2329,10 +2329,21 @@ static int ptrace_stop(int exit_code, int why, unsigned long message,
|
||||
do_notify_parent_cldstop(current, false, why);
|
||||
|
||||
/*
|
||||
- * Don't want to allow preemption here, because
|
||||
- * sys_ptrace() needs this task to be inactive.
|
||||
+ * The previous do_notify_parent_cldstop() invocation woke ptracer.
|
||||
+ * One a PREEMPTION kernel this can result in preemption requirement
|
||||
+ * which will be fulfilled after read_unlock() and the ptracer will be
|
||||
+ * put on the CPU.
|
||||
+ * The ptracer is in wait_task_inactive(, __TASK_TRACED) waiting for
|
||||
+ * this task wait in schedule(). If this task gets preempted then it
|
||||
+ * remains enqueued on the runqueue. The ptracer will observe this and
|
||||
+ * then sleep for a delay of one HZ tick. In the meantime this task
|
||||
+ * gets scheduled, enters schedule() and will wait for the ptracer.
|
||||
*
|
||||
- * XXX: implement read_unlock_no_resched().
|
||||
+ * This preemption point is not bad from correctness point of view but
|
||||
+ * extends the runtime by one HZ tick time due to the ptracer's sleep.
|
||||
+ * The preempt-disable section ensures that there will be no preemption
|
||||
+ * between unlock and schedule() and so improving the performance since
|
||||
+ * the ptracer has no reason to sleep.
|
||||
*/
|
||||
preempt_disable();
|
||||
read_unlock(&tasklist_lock);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,53 +0,0 @@
|
||||
From 2421d8ff790ecae09449cea9b62cf70af3b3d753 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 3 Aug 2023 12:09:32 +0200
|
||||
Subject: [PATCH 009/198] signal: Don't disable preemption in ptrace_stop() on
|
||||
PREEMPT_RT.
|
||||
|
||||
On PREEMPT_RT keeping preemption disabled during the invocation of
|
||||
cgroup_enter_frozen() is a problem because the function acquires css_set_lock
|
||||
which is a sleeping lock on PREEMPT_RT and must not be acquired with disabled
|
||||
preemption.
|
||||
The preempt-disabled section is only for performance optimisation
|
||||
reasons and can be avoided.
|
||||
|
||||
Extend the comment and don't disable preemption before scheduling on
|
||||
PREEMPT_RT.
|
||||
|
||||
Acked-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230803100932.325870-3-bigeasy@linutronix.de
|
||||
---
|
||||
kernel/signal.c | 13 +++++++++++--
|
||||
1 file changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/signal.c b/kernel/signal.c
|
||||
index 051ed8114cd4..b71026341056 100644
|
||||
--- a/kernel/signal.c
|
||||
+++ b/kernel/signal.c
|
||||
@@ -2344,11 +2344,20 @@ static int ptrace_stop(int exit_code, int why, unsigned long message,
|
||||
* The preempt-disable section ensures that there will be no preemption
|
||||
* between unlock and schedule() and so improving the performance since
|
||||
* the ptracer has no reason to sleep.
|
||||
+ *
|
||||
+ * On PREEMPT_RT locking tasklist_lock does not disable preemption.
|
||||
+ * Therefore the task can be preempted (after
|
||||
+ * do_notify_parent_cldstop()) before unlocking tasklist_lock so there
|
||||
+ * is no benefit in doing this. The optimisation is harmful on
|
||||
+ * PEEMPT_RT because the spinlock_t (in cgroup_enter_frozen()) must not
|
||||
+ * be acquired with disabled preemption.
|
||||
*/
|
||||
- preempt_disable();
|
||||
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
+ preempt_disable();
|
||||
read_unlock(&tasklist_lock);
|
||||
cgroup_enter_frozen();
|
||||
- preempt_enable_no_resched();
|
||||
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
+ preempt_enable_no_resched();
|
||||
schedule();
|
||||
cgroup_leave_frozen(true);
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,91 +0,0 @@
|
||||
From d0206dbfadfde807099d9a22ec0ae36bb5bc5723 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Sep 2023 16:15:12 +0200
|
||||
Subject: [PATCH 010/198] drm/amd/display: Remove migrate_en/dis from
|
||||
dc_fpu_begin().
|
||||
|
||||
This is a revert of the commit mentioned below while it is not wrong, as
|
||||
in the kernel will explode, having migrate_disable() here it is
|
||||
complete waste of resources.
|
||||
|
||||
Additionally commit message is plain wrong the review tag does not make
|
||||
it any better. The migrate_disable() interface has a fat comment
|
||||
describing it and it includes the word "undesired" in the headline which
|
||||
should tickle people to read it before using it.
|
||||
Initially I assumed it is worded too harsh but now I beg to differ.
|
||||
|
||||
The reviewer of the original commit, even not understanding what
|
||||
migrate_disable() does should ask the following:
|
||||
|
||||
- migrate_disable() is added only to the CONFIG_X86 block and it claims
|
||||
to protect fpu_recursion_depth. Why are the other the architectures
|
||||
excluded?
|
||||
|
||||
- migrate_disable() is added after fpu_recursion_depth was modified.
|
||||
Shouldn't it be added before the modification or referencing takes
|
||||
place?
|
||||
|
||||
Moving on.
|
||||
Disabling preemption DOES prevent CPU migration. A task, that can not be
|
||||
pushed away from the CPU by the scheduler (due to disabled preemption)
|
||||
can not be pushed or migrated to another CPU.
|
||||
|
||||
Disabling migration DOES NOT ensure consistency of per-CPU variables. It
|
||||
only ensures that the task acts always on the same per-CPU variable. The
|
||||
task remains preemptible meaning multiple tasks can access the same
|
||||
per-CPU variable. This in turn leads to inconsistency for the statement
|
||||
|
||||
*pcpu -= 1;
|
||||
|
||||
with two tasks on one CPU and a preemption point during the RMW
|
||||
operation:
|
||||
|
||||
Task A Task B
|
||||
read pcpu to reg # 0
|
||||
inc reg # 0 -> 1
|
||||
read pcpu to reg # 0
|
||||
inc reg # 0 -> 1
|
||||
write reg to pcpu # 1
|
||||
write reg to pcpu # 1
|
||||
|
||||
At the end pcpu reads 1 but should read 2 instead. Boom.
|
||||
|
||||
get_cpu_ptr() already contains a preempt_disable() statement. That means
|
||||
that the per-CPU variable can only be referenced by a single task which
|
||||
is currently running. The only inconsistency that can occur if the
|
||||
variable is additionally accessed from an interrupt.
|
||||
|
||||
Remove migrate_disable/enable() from dc_fpu_begin/end().
|
||||
|
||||
Cc: Tianci Yin <tianci.yin@amd.com>
|
||||
Cc: Aurabindo Pillai <aurabindo.pillai@amd.com>
|
||||
Fixes: 0c316556d1249 ("drm/amd/display: Disable migration to ensure consistency of per-CPU variable")
|
||||
Link: https://lore.kernel.org/r/20230921141516.520471-2-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
index 172aa10a8800..86f4c0e04654 100644
|
||||
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
@@ -91,7 +91,6 @@ void dc_fpu_begin(const char *function_name, const int line)
|
||||
|
||||
if (*pcpu == 1) {
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)
|
||||
- migrate_disable();
|
||||
kernel_fpu_begin();
|
||||
#elif defined(CONFIG_PPC64)
|
||||
if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
|
||||
@@ -132,7 +131,6 @@ void dc_fpu_end(const char *function_name, const int line)
|
||||
if (*pcpu <= 0) {
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)
|
||||
kernel_fpu_end();
|
||||
- migrate_enable();
|
||||
#elif defined(CONFIG_PPC64)
|
||||
if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
|
||||
disable_kernel_vsx();
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,132 +0,0 @@
|
||||
From f6a59b0ee20dd0bdad7d7b18ab17f3be33bd9cda Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Sep 2023 16:15:13 +0200
|
||||
Subject: [PATCH 011/198] drm/amd/display: Simplify the per-CPU usage.
|
||||
|
||||
The fpu_recursion_depth counter is used to ensure that dc_fpu_begin()
|
||||
can be invoked multiple times while the FPU-disable function itself is
|
||||
only invoked once. Also the counter part (dc_fpu_end()) is ballanced
|
||||
properly.
|
||||
|
||||
Instead of using the get_cpu_ptr() dance around the inc it is simpler to
|
||||
increment the per-CPU variable directly. Also the per-CPU variable has
|
||||
to be incremented and decremented on the same CPU. This is ensured by
|
||||
the inner-part which disables preemption. This is kind of not obvious,
|
||||
works and the preempt-counter is touched a few times for no reason.
|
||||
|
||||
Disable preemption before incrementing fpu_recursion_depth for the first
|
||||
time. Keep preemption disabled until dc_fpu_end() where the counter is
|
||||
decremented making it obvious that the preemption has to stay disabled
|
||||
while the counter is non-zero.
|
||||
Use simple inc/dec functions.
|
||||
Remove the nested preempt_disable/enable functions which are now not
|
||||
needed.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230921141516.520471-3-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
.../gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 50 ++++++++-----------
|
||||
1 file changed, 20 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
index 86f4c0e04654..8bd5926b47e0 100644
|
||||
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
@@ -60,11 +60,9 @@ static DEFINE_PER_CPU(int, fpu_recursion_depth);
|
||||
*/
|
||||
inline void dc_assert_fp_enabled(void)
|
||||
{
|
||||
- int *pcpu, depth = 0;
|
||||
+ int depth;
|
||||
|
||||
- pcpu = get_cpu_ptr(&fpu_recursion_depth);
|
||||
- depth = *pcpu;
|
||||
- put_cpu_ptr(&fpu_recursion_depth);
|
||||
+ depth = __this_cpu_read(fpu_recursion_depth);
|
||||
|
||||
ASSERT(depth >= 1);
|
||||
}
|
||||
@@ -84,32 +82,27 @@ inline void dc_assert_fp_enabled(void)
|
||||
*/
|
||||
void dc_fpu_begin(const char *function_name, const int line)
|
||||
{
|
||||
- int *pcpu;
|
||||
+ int depth;
|
||||
|
||||
- pcpu = get_cpu_ptr(&fpu_recursion_depth);
|
||||
- *pcpu += 1;
|
||||
+ preempt_disable();
|
||||
+ depth = __this_cpu_inc_return(fpu_recursion_depth);
|
||||
|
||||
- if (*pcpu == 1) {
|
||||
+ if (depth == 1) {
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)
|
||||
kernel_fpu_begin();
|
||||
#elif defined(CONFIG_PPC64)
|
||||
- if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
|
||||
- preempt_disable();
|
||||
+ if (cpu_has_feature(CPU_FTR_VSX_COMP))
|
||||
enable_kernel_vsx();
|
||||
- } else if (cpu_has_feature(CPU_FTR_ALTIVEC_COMP)) {
|
||||
- preempt_disable();
|
||||
+ else if (cpu_has_feature(CPU_FTR_ALTIVEC_COMP))
|
||||
enable_kernel_altivec();
|
||||
- } else if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE)) {
|
||||
- preempt_disable();
|
||||
+ else if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE))
|
||||
enable_kernel_fp();
|
||||
- }
|
||||
#elif defined(CONFIG_ARM64)
|
||||
kernel_neon_begin();
|
||||
#endif
|
||||
}
|
||||
|
||||
- TRACE_DCN_FPU(true, function_name, line, *pcpu);
|
||||
- put_cpu_ptr(&fpu_recursion_depth);
|
||||
+ TRACE_DCN_FPU(true, function_name, line, depth);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -124,29 +117,26 @@ void dc_fpu_begin(const char *function_name, const int line)
|
||||
*/
|
||||
void dc_fpu_end(const char *function_name, const int line)
|
||||
{
|
||||
- int *pcpu;
|
||||
+ int depth;
|
||||
|
||||
- pcpu = get_cpu_ptr(&fpu_recursion_depth);
|
||||
- *pcpu -= 1;
|
||||
- if (*pcpu <= 0) {
|
||||
+ depth = __this_cpu_dec_return(fpu_recursion_depth);
|
||||
+ if (depth == 0) {
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)
|
||||
kernel_fpu_end();
|
||||
#elif defined(CONFIG_PPC64)
|
||||
- if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
|
||||
+ if (cpu_has_feature(CPU_FTR_VSX_COMP))
|
||||
disable_kernel_vsx();
|
||||
- preempt_enable();
|
||||
- } else if (cpu_has_feature(CPU_FTR_ALTIVEC_COMP)) {
|
||||
+ else if (cpu_has_feature(CPU_FTR_ALTIVEC_COMP))
|
||||
disable_kernel_altivec();
|
||||
- preempt_enable();
|
||||
- } else if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE)) {
|
||||
+ else if (!cpu_has_feature(CPU_FTR_FPU_UNAVAILABLE))
|
||||
disable_kernel_fp();
|
||||
- preempt_enable();
|
||||
- }
|
||||
#elif defined(CONFIG_ARM64)
|
||||
kernel_neon_end();
|
||||
#endif
|
||||
+ } else {
|
||||
+ WARN_ON_ONCE(depth < 0);
|
||||
}
|
||||
|
||||
- TRACE_DCN_FPU(false, function_name, line, *pcpu);
|
||||
- put_cpu_ptr(&fpu_recursion_depth);
|
||||
+ TRACE_DCN_FPU(false, function_name, line, depth);
|
||||
+ preempt_enable();
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,31 +0,0 @@
|
||||
From ba79756a1205549b30c6665d992decfcbf02776f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Sep 2023 16:15:14 +0200
|
||||
Subject: [PATCH 012/198] drm/amd/display: Add a warning if the FPU is used
|
||||
outside from task context.
|
||||
|
||||
Add a warning if the FPU is used from any context other than task
|
||||
context. This is only precaution since the code is not able to be used
|
||||
from softirq while the API allows it on x86 for instance.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230921141516.520471-4-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
index 8bd5926b47e0..4ae4720535a5 100644
|
||||
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c
|
||||
@@ -84,6 +84,7 @@ void dc_fpu_begin(const char *function_name, const int line)
|
||||
{
|
||||
int depth;
|
||||
|
||||
+ WARN_ON_ONCE(!in_task());
|
||||
preempt_disable();
|
||||
depth = __this_cpu_inc_return(fpu_recursion_depth);
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,96 +0,0 @@
|
||||
From 67e6407f9c6997124a48007e3c96c33ce7e9dbf9 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Sep 2023 16:15:15 +0200
|
||||
Subject: [PATCH 013/198] drm/amd/display: Move the memory allocation out of
|
||||
dcn21_validate_bandwidth_fp().
|
||||
|
||||
dcn21_validate_bandwidth_fp() is invoked while FPU access has been
|
||||
enabled. FPU access requires disabling preemption even on PREEMPT_RT.
|
||||
It is not possible to allocate memory with disabled preemption even with
|
||||
GFP_ATOMIC on PREEMPT_RT.
|
||||
|
||||
Move the memory allocation before FPU access is enabled.
|
||||
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217928
|
||||
Link: https://lore.kernel.org/r/20230921141516.520471-5-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 10 +++++++++-
|
||||
drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 7 ++-----
|
||||
drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h | 5 ++---
|
||||
3 files changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
|
||||
index d1a25fe6c44f..5674c3450fc3 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
|
||||
@@ -953,9 +953,17 @@ static bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate)
|
||||
{
|
||||
bool voltage_supported;
|
||||
+ display_e2e_pipe_params_st *pipes;
|
||||
+
|
||||
+ pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
|
||||
+ if (!pipes)
|
||||
+ return false;
|
||||
+
|
||||
DC_FP_START();
|
||||
- voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate);
|
||||
+ voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate, pipes);
|
||||
DC_FP_END();
|
||||
+
|
||||
+ kfree(pipes);
|
||||
return voltage_supported;
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
index 8a5a038fd855..89d4e969cfd8 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
@@ -2311,9 +2311,8 @@ static void dcn21_calculate_wm(struct dc *dc, struct dc_state *context,
|
||||
&context->bw_ctx.dml, pipes, pipe_cnt);
|
||||
}
|
||||
|
||||
-bool dcn21_validate_bandwidth_fp(struct dc *dc,
|
||||
- struct dc_state *context,
|
||||
- bool fast_validate)
|
||||
+bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
+ bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
@@ -2322,7 +2321,6 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,
|
||||
int vlevel = 0;
|
||||
int pipe_split_from[MAX_PIPES];
|
||||
int pipe_cnt = 0;
|
||||
- display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);
|
||||
DC_LOGGER_INIT(dc->ctx->logger);
|
||||
|
||||
BW_VAL_TRACE_COUNT();
|
||||
@@ -2362,7 +2360,6 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,
|
||||
out = false;
|
||||
|
||||
validate_out:
|
||||
- kfree(pipes);
|
||||
|
||||
BW_VAL_TRACE_FINISH();
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
index c51badf7b68a..a81a0b9e6884 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
@@ -77,9 +77,8 @@ int dcn21_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
-bool dcn21_validate_bandwidth_fp(struct dc *dc,
|
||||
- struct dc_state *context,
|
||||
- bool fast_validate);
|
||||
+bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context, bool
|
||||
+ fast_validate, display_e2e_pipe_params_st *pipes);
|
||||
void dcn21_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
|
||||
|
||||
void dcn21_clk_mgr_set_bw_params_wm_table(struct clk_bw_params *bw_params);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,130 +0,0 @@
|
||||
From 37cf46c4d2e7608b935b385c72f3ac0b0e1b49b3 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Sep 2023 16:15:16 +0200
|
||||
Subject: [PATCH 014/198] drm/amd/display: Move the memory allocation out of
|
||||
dcn20_validate_bandwidth_fp().
|
||||
|
||||
dcn20_validate_bandwidth_fp() is invoked while FPU access has been
|
||||
enabled. FPU access requires disabling preemption even on PREEMPT_RT.
|
||||
It is not possible to allocate memory with disabled preemption even with
|
||||
GFP_ATOMIC on PREEMPT_RT.
|
||||
|
||||
Move the memory allocation before FPU access is enabled.
|
||||
To preserve previous "clean" state of "pipes" add a memset() before the
|
||||
second invocation of dcn20_validate_bandwidth_internal() where the
|
||||
variable is used.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230921141516.520471-6-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
.../drm/amd/display/dc/dcn20/dcn20_resource.c | 10 +++++++++-
|
||||
.../gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 16 +++++++---------
|
||||
.../gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h | 5 ++---
|
||||
3 files changed, 18 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
|
||||
index d587f807dfd7..5036a3e60832 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
|
||||
@@ -2141,9 +2141,17 @@ bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate)
|
||||
{
|
||||
bool voltage_supported;
|
||||
+ display_e2e_pipe_params_st *pipes;
|
||||
+
|
||||
+ pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
|
||||
+ if (!pipes)
|
||||
+ return false;
|
||||
+
|
||||
DC_FP_START();
|
||||
- voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate);
|
||||
+ voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate, pipes);
|
||||
DC_FP_END();
|
||||
+
|
||||
+ kfree(pipes);
|
||||
return voltage_supported;
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
index 89d4e969cfd8..68970d6cf031 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
|
||||
@@ -2018,7 +2018,7 @@ void dcn20_patch_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st
|
||||
}
|
||||
|
||||
static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *context,
|
||||
- bool fast_validate)
|
||||
+ bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
@@ -2027,7 +2027,6 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
||||
int vlevel = 0;
|
||||
int pipe_split_from[MAX_PIPES];
|
||||
int pipe_cnt = 0;
|
||||
- display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);
|
||||
DC_LOGGER_INIT(dc->ctx->logger);
|
||||
|
||||
BW_VAL_TRACE_COUNT();
|
||||
@@ -2062,16 +2061,14 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
||||
out = false;
|
||||
|
||||
validate_out:
|
||||
- kfree(pipes);
|
||||
|
||||
BW_VAL_TRACE_FINISH();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
-bool dcn20_validate_bandwidth_fp(struct dc *dc,
|
||||
- struct dc_state *context,
|
||||
- bool fast_validate)
|
||||
+bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
+ bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool voltage_supported = false;
|
||||
bool full_pstate_supported = false;
|
||||
@@ -2090,11 +2087,11 @@ bool dcn20_validate_bandwidth_fp(struct dc *dc,
|
||||
ASSERT(context != dc->current_state);
|
||||
|
||||
if (fast_validate) {
|
||||
- return dcn20_validate_bandwidth_internal(dc, context, true);
|
||||
+ return dcn20_validate_bandwidth_internal(dc, context, true, pipes);
|
||||
}
|
||||
|
||||
// Best case, we support full UCLK switch latency
|
||||
- voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false);
|
||||
+ voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false, pipes);
|
||||
full_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support;
|
||||
|
||||
if (context->bw_ctx.dml.soc.dummy_pstate_latency_us == 0 ||
|
||||
@@ -2106,7 +2103,8 @@ bool dcn20_validate_bandwidth_fp(struct dc *dc,
|
||||
// Fallback: Try to only support G6 temperature read latency
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us = context->bw_ctx.dml.soc.dummy_pstate_latency_us;
|
||||
|
||||
- voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false);
|
||||
+ memset(pipes, 0, dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st));
|
||||
+ voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false, pipes);
|
||||
dummy_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support;
|
||||
|
||||
if (voltage_supported && (dummy_pstate_supported || !(context->stream_count))) {
|
||||
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
index a81a0b9e6884..b6c34198ddc8 100644
|
||||
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h
|
||||
@@ -61,9 +61,8 @@ void dcn20_update_bounding_box(struct dc *dc,
|
||||
unsigned int num_states);
|
||||
void dcn20_patch_bounding_box(struct dc *dc,
|
||||
struct _vcs_dpi_soc_bounding_box_st *bb);
|
||||
-bool dcn20_validate_bandwidth_fp(struct dc *dc,
|
||||
- struct dc_state *context,
|
||||
- bool fast_validate);
|
||||
+bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
+ bool fast_validate, display_e2e_pipe_params_st *pipes);
|
||||
void dcn20_fpu_set_wm_ranges(int i,
|
||||
struct pp_smu_wm_range_sets *ranges,
|
||||
struct _vcs_dpi_soc_bounding_box_st *loaded_bb);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,128 +0,0 @@
|
||||
From daeb0f4347ce368ec32c91555086812f9c0dfdec Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Mon, 15 Aug 2022 17:29:50 +0200
|
||||
Subject: [PATCH 015/198] net: Avoid the IPI to free the
|
||||
|
||||
skb_attempt_defer_free() collects a skbs, which was allocated on a
|
||||
remote CPU, on a per-CPU list. These skbs are either freed on that
|
||||
remote CPU once the CPU enters NET_RX or an remote IPI function is
|
||||
invoked in to raise the NET_RX softirq if a threshold of pending skb has
|
||||
been exceeded.
|
||||
This remote IPI can cause the wakeup of ksoftirqd on PREEMPT_RT if the
|
||||
remote CPU idle was idle. This is undesired because once the ksoftirqd
|
||||
is running it will acquire all pending softirqs and they will not be
|
||||
executed as part of the threaded interrupt until ksoftird goes idle
|
||||
again.
|
||||
|
||||
To void all this, schedule the deferred clean up from a worker.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/netdevice.h | 4 ++++
|
||||
net/core/dev.c | 39 ++++++++++++++++++++++++++++++---------
|
||||
net/core/skbuff.c | 7 ++++++-
|
||||
3 files changed, 40 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
|
||||
index b8e60a20416b..ffa5248a90e2 100644
|
||||
--- a/include/linux/netdevice.h
|
||||
+++ b/include/linux/netdevice.h
|
||||
@@ -3258,7 +3258,11 @@ struct softnet_data {
|
||||
int defer_count;
|
||||
int defer_ipi_scheduled;
|
||||
struct sk_buff *defer_list;
|
||||
+#ifndef CONFIG_PREEMPT_RT
|
||||
call_single_data_t defer_csd;
|
||||
+#else
|
||||
+ struct work_struct defer_work;
|
||||
+#endif
|
||||
};
|
||||
|
||||
static inline void input_queue_head_incr(struct softnet_data *sd)
|
||||
diff --git a/net/core/dev.c b/net/core/dev.c
|
||||
index 5a5bd339f11e..8f193d7b8b41 100644
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -4705,15 +4705,6 @@ static void rps_trigger_softirq(void *data)
|
||||
|
||||
#endif /* CONFIG_RPS */
|
||||
|
||||
-/* Called from hardirq (IPI) context */
|
||||
-static void trigger_rx_softirq(void *data)
|
||||
-{
|
||||
- struct softnet_data *sd = data;
|
||||
-
|
||||
- __raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
- smp_store_release(&sd->defer_ipi_scheduled, 0);
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* After we queued a packet into sd->input_pkt_queue,
|
||||
* we need to make sure this queue is serviced soon.
|
||||
@@ -6682,6 +6673,32 @@ static void skb_defer_free_flush(struct softnet_data *sd)
|
||||
}
|
||||
}
|
||||
|
||||
+#ifndef CONFIG_PREEMPT_RT
|
||||
+
|
||||
+/* Called from hardirq (IPI) context */
|
||||
+static void trigger_rx_softirq(void *data)
|
||||
+{
|
||||
+ struct softnet_data *sd = data;
|
||||
+
|
||||
+ __raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
+ smp_store_release(&sd->defer_ipi_scheduled, 0);
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static void trigger_rx_softirq(struct work_struct *defer_work)
|
||||
+{
|
||||
+ struct softnet_data *sd;
|
||||
+
|
||||
+ sd = container_of(defer_work, struct softnet_data, defer_work);
|
||||
+ smp_store_release(&sd->defer_ipi_scheduled, 0);
|
||||
+ local_bh_disable();
|
||||
+ skb_defer_free_flush(sd);
|
||||
+ local_bh_enable();
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
static int napi_threaded_poll(void *data)
|
||||
{
|
||||
struct napi_struct *napi = data;
|
||||
@@ -11619,7 +11636,11 @@ static int __init net_dev_init(void)
|
||||
INIT_CSD(&sd->csd, rps_trigger_softirq, sd);
|
||||
sd->cpu = i;
|
||||
#endif
|
||||
+#ifndef CONFIG_PREEMPT_RT
|
||||
INIT_CSD(&sd->defer_csd, trigger_rx_softirq, sd);
|
||||
+#else
|
||||
+ INIT_WORK(&sd->defer_work, trigger_rx_softirq);
|
||||
+#endif
|
||||
spin_lock_init(&sd->defer_lock);
|
||||
|
||||
init_gro_hash(&sd->backlog);
|
||||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
|
||||
index f0a9ef1aeaa2..682175af439d 100644
|
||||
--- a/net/core/skbuff.c
|
||||
+++ b/net/core/skbuff.c
|
||||
@@ -6863,8 +6863,13 @@ nodefer: __kfree_skb(skb);
|
||||
/* Make sure to trigger NET_RX_SOFTIRQ on the remote CPU
|
||||
* if we are unlucky enough (this seems very unlikely).
|
||||
*/
|
||||
- if (unlikely(kick) && !cmpxchg(&sd->defer_ipi_scheduled, 0, 1))
|
||||
+ if (unlikely(kick) && !cmpxchg(&sd->defer_ipi_scheduled, 0, 1)) {
|
||||
+#ifndef CONFIG_PREEMPT_RT
|
||||
smp_call_function_single_async(cpu, &sd->defer_csd);
|
||||
+#else
|
||||
+ schedule_work_on(cpu, &sd->defer_work);
|
||||
+#endif
|
||||
+ }
|
||||
}
|
||||
|
||||
static void skb_splice_csum_page(struct sk_buff *skb, struct page *page,
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,28 +0,0 @@
|
||||
From 36e07023ee977202464b7cca7776c65d13438b3e Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 7 Aug 2019 18:15:38 +0200
|
||||
Subject: [PATCH 016/198] x86: Allow to enable RT
|
||||
|
||||
Allow to select RT.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
||||
index 82d12c93feab..231e41817ea4 100644
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -28,6 +28,7 @@ config X86_64
|
||||
select ARCH_HAS_GIGANTIC_PAGE
|
||||
select ARCH_SUPPORTS_INT128 if CC_HAS_INT128
|
||||
select ARCH_SUPPORTS_PER_VMA_LOCK
|
||||
+ select ARCH_SUPPORTS_RT
|
||||
select ARCH_USE_CMPXCHG_LOCKREF
|
||||
select HAVE_ARCH_SOFT_DIRTY
|
||||
select MODULES_USE_ELF_RELA
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 93aef157c9d68e19c1d6a99b6f678affdc73f8e7 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 7 Nov 2019 17:49:20 +0100
|
||||
Subject: [PATCH 017/198] x86: Enable RT also on 32bit
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
||||
index 231e41817ea4..fe340c07ddbf 100644
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -28,7 +28,6 @@ config X86_64
|
||||
select ARCH_HAS_GIGANTIC_PAGE
|
||||
select ARCH_SUPPORTS_INT128 if CC_HAS_INT128
|
||||
select ARCH_SUPPORTS_PER_VMA_LOCK
|
||||
- select ARCH_SUPPORTS_RT
|
||||
select ARCH_USE_CMPXCHG_LOCKREF
|
||||
select HAVE_ARCH_SOFT_DIRTY
|
||||
select MODULES_USE_ELF_RELA
|
||||
@@ -119,6 +118,7 @@ config X86
|
||||
select ARCH_USES_CFI_TRAPS if X86_64 && CFI_CLANG
|
||||
select ARCH_SUPPORTS_LTO_CLANG
|
||||
select ARCH_SUPPORTS_LTO_CLANG_THIN
|
||||
+ select ARCH_SUPPORTS_RT
|
||||
select ARCH_USE_BUILTIN_BSWAP
|
||||
select ARCH_USE_MEMTEST
|
||||
select ARCH_USE_QUEUED_RWLOCKS
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,63 +0,0 @@
|
||||
From c639d81618cd94807497a50eb607fb8e41342063 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Tue, 1 Aug 2023 17:26:48 +0200
|
||||
Subject: [PATCH 018/198] sched/rt: Don't try push tasks if there are none.
|
||||
|
||||
I have a RT task X at a high priority and cyclictest on each CPU with
|
||||
lower priority than X's. If X is active and each CPU wakes their own
|
||||
cylictest thread then it ends in a longer rto_push storm.
|
||||
A random CPU determines via balance_rt() that the CPU on which X is
|
||||
running needs to push tasks. X has the highest priority, cyclictest is
|
||||
next in line so there is nothing that can be done since the task with
|
||||
the higher priority is not touched.
|
||||
|
||||
tell_cpu_to_push() increments rto_loop_next and schedules
|
||||
rto_push_irq_work_func() on X's CPU. The other CPUs also increment the
|
||||
loop counter and do the same. Once rto_push_irq_work_func() is active it
|
||||
does nothing because it has _no_ pushable tasks on its runqueue. Then
|
||||
checks rto_next_cpu() and decides to queue irq_work on the local CPU
|
||||
because another CPU requested a push by incrementing the counter.
|
||||
|
||||
I have traces where ~30 CPUs request this ~3 times each before it
|
||||
finally ends. This greatly increases X's runtime while X isn't making
|
||||
much progress.
|
||||
|
||||
Teach rto_next_cpu() to only return CPUs which also have tasks on their
|
||||
runqueue which can be pushed away. This does not reduce the
|
||||
tell_cpu_to_push() invocations (rto_loop_next counter increments) but
|
||||
reduces the amount of issued rto_push_irq_work_func() if nothing can be
|
||||
done. As the result the overloaded CPU is blocked less often.
|
||||
|
||||
There are still cases where the "same job" is repeated several times
|
||||
(for instance the current CPU needs to resched but didn't yet because
|
||||
the irq-work is repeated a few times and so the old task remains on the
|
||||
CPU) but the majority of request end in tell_cpu_to_push() before an IPI
|
||||
is issued.
|
||||
|
||||
Reviewed-by: "Steven Rostedt (Google)" <rostedt@goodmis.org>
|
||||
Link: https://lore.kernel.org/r/20230801152648._y603AS_@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
kernel/sched/rt.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
|
||||
index 4ac36eb4cdee..acd1510e8d47 100644
|
||||
--- a/kernel/sched/rt.c
|
||||
+++ b/kernel/sched/rt.c
|
||||
@@ -2253,8 +2253,11 @@ static int rto_next_cpu(struct root_domain *rd)
|
||||
|
||||
rd->rto_cpu = cpu;
|
||||
|
||||
- if (cpu < nr_cpu_ids)
|
||||
+ if (cpu < nr_cpu_ids) {
|
||||
+ if (!has_pushable_tasks(cpu_rq(cpu)))
|
||||
+ continue;
|
||||
return cpu;
|
||||
+ }
|
||||
|
||||
rd->rto_cpu = -1;
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,233 +0,0 @@
|
||||
From 2fd122683d6787e2f9b5f396c2729e3fbcdbf447 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 1 Dec 2021 17:41:09 +0100
|
||||
Subject: [PATCH 019/198] softirq: Use a dedicated thread for timer wakeups.
|
||||
|
||||
A timer/hrtimer softirq is raised in-IRQ context. With threaded
|
||||
interrupts enabled or on PREEMPT_RT this leads to waking the ksoftirqd
|
||||
for the processing of the softirq.
|
||||
Once the ksoftirqd is marked as pending (or is running) it will collect
|
||||
all raised softirqs. This in turn means that a softirq which would have
|
||||
been processed at the end of the threaded interrupt, which runs at an
|
||||
elevated priority, is now moved to ksoftirqd which runs at SCHED_OTHER
|
||||
priority and competes with every regular task for CPU resources.
|
||||
This introduces long delays on heavy loaded systems and is not desired
|
||||
especially if the system is not overloaded by the softirqs.
|
||||
|
||||
Split the TIMER_SOFTIRQ and HRTIMER_SOFTIRQ processing into a dedicated
|
||||
timers thread and let it run at the lowest SCHED_FIFO priority.
|
||||
RT tasks are are woken up from hardirq context so only timer_list timers
|
||||
and hrtimers for "regular" tasks are processed here. The higher priority
|
||||
ensures that wakeups are performed before scheduling SCHED_OTHER tasks.
|
||||
|
||||
Using a dedicated variable to store the pending softirq bits values
|
||||
ensure that the timer are not accidentally picked up by ksoftirqd and
|
||||
other threaded interrupts.
|
||||
It shouldn't be picked up by ksoftirqd since it runs at lower priority.
|
||||
However if the timer bits are ORed while a threaded interrupt is
|
||||
running, then the timer softirq would be performed at higher priority.
|
||||
The new timer thread will block on the softirq lock before it starts
|
||||
softirq work. This "race window" isn't closed because while timer thread
|
||||
is performing the softirq it can get PI-boosted via the softirq lock by
|
||||
a random force-threaded thread.
|
||||
The timer thread can pick up pending softirqs from ksoftirqd but only
|
||||
if the softirq load is high. It is not be desired that the picked up
|
||||
softirqs are processed at SCHED_FIFO priority under high softirq load
|
||||
but this can already happen by a PI-boost by a force-threaded interrupt.
|
||||
|
||||
Reported-by: kernel test robot <lkp@intel.com> [ static timer_threads ]
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/interrupt.h | 16 +++++++
|
||||
kernel/softirq.c | 92 +++++++++++++++++++++++++++++++++++++--
|
||||
kernel/time/hrtimer.c | 4 +-
|
||||
kernel/time/timer.c | 2 +-
|
||||
4 files changed, 108 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index 4a1dc88ddbff..0efba74a835c 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -609,6 +609,22 @@ extern void __raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+extern void raise_timer_softirq(void);
|
||||
+extern void raise_hrtimer_softirq(void);
|
||||
+
|
||||
+#else
|
||||
+static inline void raise_timer_softirq(void)
|
||||
+{
|
||||
+ raise_softirq(TIMER_SOFTIRQ);
|
||||
+}
|
||||
+
|
||||
+static inline void raise_hrtimer_softirq(void)
|
||||
+{
|
||||
+ raise_softirq_irqoff(HRTIMER_SOFTIRQ);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
|
||||
|
||||
static inline struct task_struct *this_cpu_ksoftirqd(void)
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index bd9716d7bb63..0e43058c2e58 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -623,6 +623,29 @@ static inline void tick_irq_exit(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+static DEFINE_PER_CPU(struct task_struct *, timersd);
|
||||
+static DEFINE_PER_CPU(unsigned long, pending_timer_softirq);
|
||||
+
|
||||
+static unsigned int local_pending_timers(void)
|
||||
+{
|
||||
+ return __this_cpu_read(pending_timer_softirq);
|
||||
+}
|
||||
+
|
||||
+static void wake_timersd(void)
|
||||
+{
|
||||
+ struct task_struct *tsk = __this_cpu_read(timersd);
|
||||
+
|
||||
+ if (tsk)
|
||||
+ wake_up_process(tsk);
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static inline void wake_timersd(void) { }
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
static inline void __irq_exit_rcu(void)
|
||||
{
|
||||
#ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED
|
||||
@@ -632,8 +655,13 @@ static inline void __irq_exit_rcu(void)
|
||||
#endif
|
||||
account_hardirq_exit(current);
|
||||
preempt_count_sub(HARDIRQ_OFFSET);
|
||||
- if (!in_interrupt() && local_softirq_pending())
|
||||
- invoke_softirq();
|
||||
+ if (!in_interrupt()) {
|
||||
+ if (local_softirq_pending())
|
||||
+ invoke_softirq();
|
||||
+
|
||||
+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers())
|
||||
+ wake_timersd();
|
||||
+ }
|
||||
|
||||
tick_irq_exit();
|
||||
}
|
||||
@@ -967,12 +995,70 @@ static struct smp_hotplug_thread softirq_threads = {
|
||||
.thread_comm = "ksoftirqd/%u",
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+static void timersd_setup(unsigned int cpu)
|
||||
+{
|
||||
+ sched_set_fifo_low(current);
|
||||
+}
|
||||
+
|
||||
+static int timersd_should_run(unsigned int cpu)
|
||||
+{
|
||||
+ return local_pending_timers();
|
||||
+}
|
||||
+
|
||||
+static void run_timersd(unsigned int cpu)
|
||||
+{
|
||||
+ unsigned int timer_si;
|
||||
+
|
||||
+ ksoftirqd_run_begin();
|
||||
+
|
||||
+ timer_si = local_pending_timers();
|
||||
+ __this_cpu_write(pending_timer_softirq, 0);
|
||||
+ or_softirq_pending(timer_si);
|
||||
+
|
||||
+ __do_softirq();
|
||||
+
|
||||
+ ksoftirqd_run_end();
|
||||
+}
|
||||
+
|
||||
+static void raise_ktimers_thread(unsigned int nr)
|
||||
+{
|
||||
+ trace_softirq_raise(nr);
|
||||
+ __this_cpu_or(pending_timer_softirq, 1 << nr);
|
||||
+}
|
||||
+
|
||||
+void raise_hrtimer_softirq(void)
|
||||
+{
|
||||
+ raise_ktimers_thread(HRTIMER_SOFTIRQ);
|
||||
+}
|
||||
+
|
||||
+void raise_timer_softirq(void)
|
||||
+{
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ local_irq_save(flags);
|
||||
+ raise_ktimers_thread(TIMER_SOFTIRQ);
|
||||
+ wake_timersd();
|
||||
+ local_irq_restore(flags);
|
||||
+}
|
||||
+
|
||||
+static struct smp_hotplug_thread timer_threads = {
|
||||
+ .store = &timersd,
|
||||
+ .setup = timersd_setup,
|
||||
+ .thread_should_run = timersd_should_run,
|
||||
+ .thread_fn = run_timersd,
|
||||
+ .thread_comm = "ktimers/%u",
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
static __init int spawn_ksoftirqd(void)
|
||||
{
|
||||
cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL,
|
||||
takeover_tasklets);
|
||||
BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
|
||||
-
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+ BUG_ON(smpboot_register_percpu_thread(&timer_threads));
|
||||
+#endif
|
||||
return 0;
|
||||
}
|
||||
early_initcall(spawn_ksoftirqd);
|
||||
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
|
||||
index edb0f821dcea..a7290012179a 100644
|
||||
--- a/kernel/time/hrtimer.c
|
||||
+++ b/kernel/time/hrtimer.c
|
||||
@@ -1809,7 +1809,7 @@ void hrtimer_interrupt(struct clock_event_device *dev)
|
||||
if (!ktime_before(now, cpu_base->softirq_expires_next)) {
|
||||
cpu_base->softirq_expires_next = KTIME_MAX;
|
||||
cpu_base->softirq_activated = 1;
|
||||
- raise_softirq_irqoff(HRTIMER_SOFTIRQ);
|
||||
+ raise_hrtimer_softirq();
|
||||
}
|
||||
|
||||
__hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD);
|
||||
@@ -1922,7 +1922,7 @@ void hrtimer_run_queues(void)
|
||||
if (!ktime_before(now, cpu_base->softirq_expires_next)) {
|
||||
cpu_base->softirq_expires_next = KTIME_MAX;
|
||||
cpu_base->softirq_activated = 1;
|
||||
- raise_softirq_irqoff(HRTIMER_SOFTIRQ);
|
||||
+ raise_hrtimer_softirq();
|
||||
}
|
||||
|
||||
__hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD);
|
||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
||||
index 63a8ce7177dd..7cad6fe3c035 100644
|
||||
--- a/kernel/time/timer.c
|
||||
+++ b/kernel/time/timer.c
|
||||
@@ -2054,7 +2054,7 @@ static void run_local_timers(void)
|
||||
if (time_before(jiffies, base->next_expiry))
|
||||
return;
|
||||
}
|
||||
- raise_softirq(TIMER_SOFTIRQ);
|
||||
+ raise_timer_softirq();
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,80 +0,0 @@
|
||||
From f178d0e863ed7025a9350cbb950281e400fcaa16 Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Weisbecker <frederic@kernel.org>
|
||||
Date: Tue, 5 Apr 2022 03:07:51 +0200
|
||||
Subject: [PATCH 020/198] rcutorture: Also force sched priority to timersd on
|
||||
boosting test.
|
||||
|
||||
ksoftirqd is statically boosted to the priority level right above the
|
||||
one of rcu_torture_boost() so that timers, which torture readers rely on,
|
||||
get a chance to run while rcu_torture_boost() is polling.
|
||||
|
||||
However timers processing got split from ksoftirqd into their own kthread
|
||||
(timersd) that isn't boosted. It has the same SCHED_FIFO low prio as
|
||||
rcu_torture_boost() and therefore timers can't preempt it and may
|
||||
starve.
|
||||
|
||||
The issue can be triggered in practice on v5.17.1-rt17 using:
|
||||
|
||||
./kvm.sh --allcpus --configs TREE04 --duration 10m --kconfig "CONFIG_EXPERT=y CONFIG_PREEMPT_RT=y"
|
||||
|
||||
Fix this with statically boosting timersd just like is done with
|
||||
ksoftirqd in commit
|
||||
ea6d962e80b61 ("rcutorture: Judge RCU priority boosting on grace periods, not callbacks")
|
||||
|
||||
Suggested-by: Mel Gorman <mgorman@suse.de>
|
||||
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
|
||||
Link: https://lkml.kernel.org/r/20220405010752.1347437-1-frederic@kernel.org
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/interrupt.h | 1 +
|
||||
kernel/rcu/rcutorture.c | 6 ++++++
|
||||
kernel/softirq.c | 2 +-
|
||||
3 files changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index 0efba74a835c..f459b0f27c94 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -610,6 +610,7 @@ extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
+DECLARE_PER_CPU(struct task_struct *, timersd);
|
||||
extern void raise_timer_softirq(void);
|
||||
extern void raise_hrtimer_softirq(void);
|
||||
|
||||
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
|
||||
index 781146600aa4..7ee1c84b52ee 100644
|
||||
--- a/kernel/rcu/rcutorture.c
|
||||
+++ b/kernel/rcu/rcutorture.c
|
||||
@@ -2409,6 +2409,12 @@ static int rcutorture_booster_init(unsigned int cpu)
|
||||
WARN_ON_ONCE(!t);
|
||||
sp.sched_priority = 2;
|
||||
sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+ t = per_cpu(timersd, cpu);
|
||||
+ WARN_ON_ONCE(!t);
|
||||
+ sp.sched_priority = 2;
|
||||
+ sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Don't allow time recalculation while creating a new task. */
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index 0e43058c2e58..63e8b9ad2727 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -624,7 +624,7 @@ static inline void tick_irq_exit(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
-static DEFINE_PER_CPU(struct task_struct *, timersd);
|
||||
+DEFINE_PER_CPU(struct task_struct *, timersd);
|
||||
static DEFINE_PER_CPU(unsigned long, pending_timer_softirq);
|
||||
|
||||
static unsigned int local_pending_timers(void)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,115 +0,0 @@
|
||||
From ac5d5969eb361ddc449872de0b7da375aac43810 Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Weisbecker <frederic@kernel.org>
|
||||
Date: Tue, 5 Apr 2022 03:07:52 +0200
|
||||
Subject: [PATCH 021/198] tick: Fix timer storm since introduction of timersd
|
||||
|
||||
If timers are pending while the tick is reprogrammed on nohz_mode, the
|
||||
next expiry is not armed to fire now, it is delayed one jiffy forward
|
||||
instead so as not to raise an inextinguishable timer storm with such
|
||||
scenario:
|
||||
|
||||
1) IRQ triggers and queue a timer
|
||||
2) ksoftirqd() is woken up
|
||||
3) IRQ tail: timer is reprogrammed to fire now
|
||||
4) IRQ exit
|
||||
5) TIMER interrupt
|
||||
6) goto 3)
|
||||
|
||||
...all that until we finally reach ksoftirqd.
|
||||
|
||||
Unfortunately we are checking the wrong softirq vector bitmask since
|
||||
timersd kthread has split from ksoftirqd. Timers now have their own
|
||||
vector state field that must be checked separately. As a result, the
|
||||
old timer storm is back. This shows up early on boot with extremely long
|
||||
initcalls:
|
||||
|
||||
[ 333.004807] initcall dquot_init+0x0/0x111 returned 0 after 323822879 usecs
|
||||
|
||||
and the cause is uncovered with the right trace events showing just
|
||||
10 microseconds between ticks (~100 000 Hz):
|
||||
|
||||
|swapper/-1 1dn.h111 60818582us : hrtimer_expire_entry: hrtimer=00000000e0ef0f6b function=tick_sched_timer now=60415486608
|
||||
|swapper/-1 1dn.h111 60818592us : hrtimer_expire_entry: hrtimer=00000000e0ef0f6b function=tick_sched_timer now=60415496082
|
||||
|swapper/-1 1dn.h111 60818601us : hrtimer_expire_entry: hrtimer=00000000e0ef0f6b function=tick_sched_timer now=60415505550
|
||||
|
||||
Fix this by checking the right timer vector state from the nohz code.
|
||||
|
||||
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
|
||||
Cc: Mel Gorman <mgorman@suse.de>
|
||||
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lkml.kernel.org/r/20220405010752.1347437-2-frederic@kernel.org
|
||||
---
|
||||
include/linux/interrupt.h | 12 ++++++++++++
|
||||
kernel/softirq.c | 7 +------
|
||||
kernel/time/tick-sched.c | 2 +-
|
||||
3 files changed, 14 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index f459b0f27c94..a5091ac97fc6 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -611,9 +611,16 @@ extern void raise_softirq(unsigned int nr);
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
DECLARE_PER_CPU(struct task_struct *, timersd);
|
||||
+DECLARE_PER_CPU(unsigned long, pending_timer_softirq);
|
||||
+
|
||||
extern void raise_timer_softirq(void);
|
||||
extern void raise_hrtimer_softirq(void);
|
||||
|
||||
+static inline unsigned int local_pending_timers(void)
|
||||
+{
|
||||
+ return __this_cpu_read(pending_timer_softirq);
|
||||
+}
|
||||
+
|
||||
#else
|
||||
static inline void raise_timer_softirq(void)
|
||||
{
|
||||
@@ -624,6 +631,11 @@ static inline void raise_hrtimer_softirq(void)
|
||||
{
|
||||
raise_softirq_irqoff(HRTIMER_SOFTIRQ);
|
||||
}
|
||||
+
|
||||
+static inline unsigned int local_pending_timers(void)
|
||||
+{
|
||||
+ return local_softirq_pending();
|
||||
+}
|
||||
#endif
|
||||
|
||||
DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index 63e8b9ad2727..65477d8e00af 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -625,12 +625,7 @@ static inline void tick_irq_exit(void)
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
DEFINE_PER_CPU(struct task_struct *, timersd);
|
||||
-static DEFINE_PER_CPU(unsigned long, pending_timer_softirq);
|
||||
-
|
||||
-static unsigned int local_pending_timers(void)
|
||||
-{
|
||||
- return __this_cpu_read(pending_timer_softirq);
|
||||
-}
|
||||
+DEFINE_PER_CPU(unsigned long, pending_timer_softirq);
|
||||
|
||||
static void wake_timersd(void)
|
||||
{
|
||||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
|
||||
index 55cbc49f70d1..1a0ed106b192 100644
|
||||
--- a/kernel/time/tick-sched.c
|
||||
+++ b/kernel/time/tick-sched.c
|
||||
@@ -795,7 +795,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
|
||||
|
||||
static inline bool local_timer_softirq_pending(void)
|
||||
{
|
||||
- return local_softirq_pending() & BIT(TIMER_SOFTIRQ);
|
||||
+ return local_pending_timers() & BIT(TIMER_SOFTIRQ);
|
||||
}
|
||||
|
||||
static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,49 +0,0 @@
|
||||
From fde74c1d2ebdc73a1eb37bbf1e10bc9741e6c6f7 Mon Sep 17 00:00:00 2001
|
||||
From: Junxiao Chang <junxiao.chang@intel.com>
|
||||
Date: Mon, 20 Feb 2023 09:12:20 +0100
|
||||
Subject: [PATCH 022/198] softirq: Wake ktimers thread also in softirq.
|
||||
|
||||
If the hrtimer is raised while a softirq is processed then it does not
|
||||
wake the corresponding ktimers thread. This is due to the optimisation in the
|
||||
irq-exit path which is also used to wake the ktimers thread. For the other
|
||||
softirqs, this is okay because the additional softirq bits will be handled by
|
||||
the currently running softirq handler.
|
||||
The timer related softirq bits are added to a different variable and rely on
|
||||
the ktimers thread.
|
||||
As a consuequence the wake up of ktimersd is delayed until the next timer tick.
|
||||
|
||||
Always wake the ktimers thread if a timer related softirq is pending.
|
||||
|
||||
Reported-by: Peh, Hock Zhang <hock.zhang.peh@intel.com>
|
||||
Signed-off-by: Junxiao Chang <junxiao.chang@intel.com>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
kernel/softirq.c | 11 +++++------
|
||||
1 file changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index 65477d8e00af..ea6198bf64e0 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -650,13 +650,12 @@ static inline void __irq_exit_rcu(void)
|
||||
#endif
|
||||
account_hardirq_exit(current);
|
||||
preempt_count_sub(HARDIRQ_OFFSET);
|
||||
- if (!in_interrupt()) {
|
||||
- if (local_softirq_pending())
|
||||
- invoke_softirq();
|
||||
+ if (!in_interrupt() && local_softirq_pending())
|
||||
+ invoke_softirq();
|
||||
|
||||
- if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers())
|
||||
- wake_timersd();
|
||||
- }
|
||||
+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && local_pending_timers() &&
|
||||
+ !(in_nmi() | in_hardirq()))
|
||||
+ wake_timersd();
|
||||
|
||||
tick_irq_exit();
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,102 +0,0 @@
|
||||
From 7901a04965c7c34d6891b5eb127b8e46af1af9bf Mon Sep 17 00:00:00 2001
|
||||
From: Mike Galbraith <umgwanakikbuti@gmail.com>
|
||||
Date: Thu, 31 Mar 2016 04:08:28 +0200
|
||||
Subject: [PATCH 023/198] zram: Replace bit spinlocks with spinlock_t for
|
||||
PREEMPT_RT.
|
||||
|
||||
The bit spinlock disables preemption. The spinlock_t lock becomes a sleeping
|
||||
lock on PREEMPT_RT and it can not be acquired in this context. In this locked
|
||||
section, zs_free() acquires a zs_pool::lock, and there is access to
|
||||
zram::wb_limit_lock.
|
||||
|
||||
Use a spinlock_t on PREEMPT_RT for locking and set/ clear ZRAM_LOCK bit after
|
||||
the lock has been acquired/ dropped.
|
||||
|
||||
Signed-off-by: Mike Galbraith <umgwanakikbuti@gmail.com>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lkml.kernel.org/r/YqIbMuHCPiQk+Ac2@linutronix.de
|
||||
Link: https://lore.kernel.org/20230323161830.jFbWCosd@linutronix.de
|
||||
---
|
||||
drivers/block/zram/zram_drv.c | 37 +++++++++++++++++++++++++++++++++++
|
||||
drivers/block/zram/zram_drv.h | 3 +++
|
||||
2 files changed, 40 insertions(+)
|
||||
|
||||
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
|
||||
index 06673c6ca255..a5d0f7c06342 100644
|
||||
--- a/drivers/block/zram/zram_drv.c
|
||||
+++ b/drivers/block/zram/zram_drv.c
|
||||
@@ -57,6 +57,41 @@ static void zram_free_page(struct zram *zram, size_t index);
|
||||
static int zram_read_page(struct zram *zram, struct page *page, u32 index,
|
||||
struct bio *parent);
|
||||
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages)
|
||||
+{
|
||||
+ size_t index;
|
||||
+
|
||||
+ for (index = 0; index < num_pages; index++)
|
||||
+ spin_lock_init(&zram->table[index].lock);
|
||||
+}
|
||||
+
|
||||
+static int zram_slot_trylock(struct zram *zram, u32 index)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = spin_trylock(&zram->table[index].lock);
|
||||
+ if (ret)
|
||||
+ __set_bit(ZRAM_LOCK, &zram->table[index].flags);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void zram_slot_lock(struct zram *zram, u32 index)
|
||||
+{
|
||||
+ spin_lock(&zram->table[index].lock);
|
||||
+ __set_bit(ZRAM_LOCK, &zram->table[index].flags);
|
||||
+}
|
||||
+
|
||||
+static void zram_slot_unlock(struct zram *zram, u32 index)
|
||||
+{
|
||||
+ __clear_bit(ZRAM_LOCK, &zram->table[index].flags);
|
||||
+ spin_unlock(&zram->table[index].lock);
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { }
|
||||
+
|
||||
static int zram_slot_trylock(struct zram *zram, u32 index)
|
||||
{
|
||||
return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags);
|
||||
@@ -71,6 +106,7 @@ static void zram_slot_unlock(struct zram *zram, u32 index)
|
||||
{
|
||||
bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags);
|
||||
}
|
||||
+#endif
|
||||
|
||||
static inline bool init_done(struct zram *zram)
|
||||
{
|
||||
@@ -1245,6 +1281,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize)
|
||||
|
||||
if (!huge_class_size)
|
||||
huge_class_size = zs_huge_class_size(zram->mem_pool);
|
||||
+ zram_meta_init_table_locks(zram, num_pages);
|
||||
return true;
|
||||
}
|
||||
|
||||
diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h
|
||||
index ca7a15bd4845..e64eb607eb45 100644
|
||||
--- a/drivers/block/zram/zram_drv.h
|
||||
+++ b/drivers/block/zram/zram_drv.h
|
||||
@@ -69,6 +69,9 @@ struct zram_table_entry {
|
||||
unsigned long element;
|
||||
};
|
||||
unsigned long flags;
|
||||
+#ifdef CONFIG_PREEMPT_RT
|
||||
+ spinlock_t lock;
|
||||
+#endif
|
||||
#ifdef CONFIG_ZRAM_MEMORY_TRACKING
|
||||
ktime_t ac_time;
|
||||
#endif
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,52 +0,0 @@
|
||||
From b21d1ed96731fbdae2f48d5e3e802e431dd3cce6 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 8 Mar 2023 16:29:38 +0100
|
||||
Subject: [PATCH 024/198] preempt: Put preempt_enable() within an
|
||||
instrumentation*() section.
|
||||
|
||||
Callers of preempt_enable() can be within an noinstr section leading to:
|
||||
| vmlinux.o: warning: objtool: native_sched_clock+0x97: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: kvm_clock_read+0x22: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: local_clock+0xb4: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: enter_from_user_mode+0xea: call to preempt_schedule_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: syscall_enter_from_user_mode+0x140: call to preempt_schedule_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: syscall_enter_from_user_mode_prepare+0xf2: call to preempt_schedule_thunk() leaves .noinstr.text section
|
||||
| vmlinux.o: warning: objtool: irqentry_enter_from_user_mode+0xea: call to preempt_schedule_thunk() leaves .noinstr.text section
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230309072724.3F6zRkvw@linutronix.de
|
||||
---
|
||||
include/linux/preempt.h | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/linux/preempt.h b/include/linux/preempt.h
|
||||
index 9aa6358a1a16..cd16f0330fba 100644
|
||||
--- a/include/linux/preempt.h
|
||||
+++ b/include/linux/preempt.h
|
||||
@@ -230,15 +230,21 @@ do { \
|
||||
#define preempt_enable() \
|
||||
do { \
|
||||
barrier(); \
|
||||
- if (unlikely(preempt_count_dec_and_test())) \
|
||||
+ if (unlikely(preempt_count_dec_and_test())) { \
|
||||
+ instrumentation_begin(); \
|
||||
__preempt_schedule(); \
|
||||
+ instrumentation_end(); \
|
||||
+ } \
|
||||
} while (0)
|
||||
|
||||
#define preempt_enable_notrace() \
|
||||
do { \
|
||||
barrier(); \
|
||||
- if (unlikely(__preempt_count_dec_and_test())) \
|
||||
+ if (unlikely(__preempt_count_dec_and_test())) { \
|
||||
+ instrumentation_begin(); \
|
||||
__preempt_schedule_notrace(); \
|
||||
+ instrumentation_end(); \
|
||||
+ } \
|
||||
} while (0)
|
||||
|
||||
#define preempt_check_resched() \
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,61 +0,0 @@
|
||||
From 9e74fe7b9f9d7e48bed2b9a35436905afd3730e5 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 4 Aug 2023 13:30:37 +0200
|
||||
Subject: [PATCH 025/198] sched/core: Provide a method to check if a task is
|
||||
PI-boosted.
|
||||
|
||||
Provide a method to check if a task inherited the priority from another
|
||||
task. This happens if a task owns a lock which is requested by a task
|
||||
with higher priority. This can be used as a hint to add a preemption
|
||||
point to the critical section.
|
||||
|
||||
Provide a function which reports true if the task is PI-boosted.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230804113039.419794-2-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/sched.h | 1 +
|
||||
kernel/sched/core.c | 15 +++++++++++++++
|
||||
2 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 67623ffd4a8e..eab173e5d09b 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -1905,6 +1905,7 @@ static inline int dl_task_check_affinity(struct task_struct *p, const struct cpu
|
||||
}
|
||||
#endif
|
||||
|
||||
+extern bool task_is_pi_boosted(const struct task_struct *p);
|
||||
extern int yield_to(struct task_struct *p, bool preempt);
|
||||
extern void set_user_nice(struct task_struct *p, long nice);
|
||||
extern int task_prio(const struct task_struct *p);
|
||||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||
index a1fc8d66c7ac..b917a854ac50 100644
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -8926,6 +8926,21 @@ static inline void preempt_dynamic_init(void) { }
|
||||
|
||||
#endif /* #ifdef CONFIG_PREEMPT_DYNAMIC */
|
||||
|
||||
+/*
|
||||
+ * task_is_pi_boosted - Check if task has been PI boosted.
|
||||
+ * @p: Task to check.
|
||||
+ *
|
||||
+ * Return true if task is subject to priority inheritance.
|
||||
+ */
|
||||
+bool task_is_pi_boosted(const struct task_struct *p)
|
||||
+{
|
||||
+ int prio = p->prio;
|
||||
+
|
||||
+ if (!rt_prio(prio))
|
||||
+ return false;
|
||||
+ return prio != p->normal_prio;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* yield - yield the current processor to other threads.
|
||||
*
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,67 +0,0 @@
|
||||
From 1031f963cee63a59647b27fc8b53d5ad2de5ce3f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 4 Aug 2023 13:30:38 +0200
|
||||
Subject: [PATCH 026/198] softirq: Add function to preempt serving softirqs.
|
||||
|
||||
Add a functionality for the softirq handler to preempt its current work
|
||||
if needed. The softirq core has no particular state. It reads and resets
|
||||
the pending softirq bits and then processes one after the other.
|
||||
It can already be preempted while it invokes a certain softirq handler.
|
||||
|
||||
By enabling the BH the softirq core releases the per-CPU bh lock which
|
||||
serializes all softirq handler. It is safe to do as long as the code
|
||||
does not expect any serialisation in between. A typical scenarion would
|
||||
after the invocation of callback where no state needs to be preserved
|
||||
before the next callback is invoked.
|
||||
|
||||
Add functionaliry to preempt the serving softirqs.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230804113039.419794-3-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/bottom_half.h | 2 ++
|
||||
kernel/softirq.c | 13 +++++++++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h
|
||||
index fc53e0ad56d9..448bbef47456 100644
|
||||
--- a/include/linux/bottom_half.h
|
||||
+++ b/include/linux/bottom_half.h
|
||||
@@ -35,8 +35,10 @@ static inline void local_bh_enable(void)
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
extern bool local_bh_blocked(void);
|
||||
+extern void softirq_preempt(void);
|
||||
#else
|
||||
static inline bool local_bh_blocked(void) { return false; }
|
||||
+static inline void softirq_preempt(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_BH_H */
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index ea6198bf64e0..2fde8af88e48 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -247,6 +247,19 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
|
||||
}
|
||||
EXPORT_SYMBOL(__local_bh_enable_ip);
|
||||
|
||||
+void softirq_preempt(void)
|
||||
+{
|
||||
+ if (WARN_ON_ONCE(!preemptible()))
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON_ONCE(__this_cpu_read(softirq_ctrl.cnt) != SOFTIRQ_OFFSET))
|
||||
+ return;
|
||||
+
|
||||
+ __local_bh_enable(SOFTIRQ_OFFSET, true);
|
||||
+ /* preemption point */
|
||||
+ __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Invoked from ksoftirqd_run() outside of the interrupt disabled section
|
||||
* to acquire the per CPU local lock for reentrancy protection.
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,52 +0,0 @@
|
||||
From e416bc4129bd60565fd3a736494416ef56b1b676 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 4 Aug 2023 13:30:39 +0200
|
||||
Subject: [PATCH 027/198] time: Allow to preempt after a callback.
|
||||
|
||||
The TIMER_SOFTIRQ handler invokes timer callbacks of the expired timers.
|
||||
Before each invocation the timer_base::lock is dropped. The only lock
|
||||
that is still held is the timer_base::expiry_lock and the per-CPU
|
||||
bh-lock as part of local_bh_disable(). The former is released as part
|
||||
of lock up prevention if the timer is preempted by the caller which is
|
||||
waiting for its completion.
|
||||
|
||||
Both locks are already released as part of timer_sync_wait_running().
|
||||
This can be extended by also releasing in bh-lock. The timer core does
|
||||
not rely on any state that is serialized by the bh-lock. The timer
|
||||
callback expects the bh-state to be serialized by the lock but there is
|
||||
no need to keep state synchronized while invoking multiple callbacks.
|
||||
|
||||
Preempt handling softirqs and release all locks after a timer invocation
|
||||
if the current has inherited priority.
|
||||
|
||||
Link: https://lore.kernel.org/r/20230804113039.419794-4-bigeasy@linutronix.de
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
kernel/time/timer.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
||||
index 7cad6fe3c035..b3fbe97d1e34 100644
|
||||
--- a/kernel/time/timer.c
|
||||
+++ b/kernel/time/timer.c
|
||||
@@ -1470,9 +1470,16 @@ static inline void timer_base_unlock_expiry(struct timer_base *base)
|
||||
*/
|
||||
static void timer_sync_wait_running(struct timer_base *base)
|
||||
{
|
||||
- if (atomic_read(&base->timer_waiters)) {
|
||||
+ bool need_preempt;
|
||||
+
|
||||
+ need_preempt = task_is_pi_boosted(current);
|
||||
+ if (need_preempt || atomic_read(&base->timer_waiters)) {
|
||||
raw_spin_unlock_irq(&base->lock);
|
||||
spin_unlock(&base->expiry_lock);
|
||||
+
|
||||
+ if (need_preempt)
|
||||
+ softirq_preempt();
|
||||
+
|
||||
spin_lock(&base->expiry_lock);
|
||||
raw_spin_lock_irq(&base->lock);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,98 +0,0 @@
|
||||
From af075b784af639458d4408659d908a5b165b0696 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:19 +0206
|
||||
Subject: [PATCH 028/198] serial: core: Use lock wrappers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-3-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/serial_core.h | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
|
||||
index 052df85dfd59..71d925e8a79b 100644
|
||||
--- a/include/linux/serial_core.h
|
||||
+++ b/include/linux/serial_core.h
|
||||
@@ -1078,14 +1078,14 @@ static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
|
||||
u8 sysrq_ch;
|
||||
|
||||
if (!port->has_sysrq) {
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
return;
|
||||
}
|
||||
|
||||
sysrq_ch = port->sysrq_ch;
|
||||
port->sysrq_ch = 0;
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
if (sysrq_ch)
|
||||
handle_sysrq(sysrq_ch);
|
||||
@@ -1097,14 +1097,14 @@ static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port
|
||||
u8 sysrq_ch;
|
||||
|
||||
if (!port->has_sysrq) {
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
sysrq_ch = port->sysrq_ch;
|
||||
port->sysrq_ch = 0;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (sysrq_ch)
|
||||
handle_sysrq(sysrq_ch);
|
||||
@@ -1120,12 +1120,12 @@ static inline int uart_prepare_sysrq_char(struct uart_port *port, u8 ch)
|
||||
}
|
||||
static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
|
||||
{
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
}
|
||||
static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port,
|
||||
unsigned long flags)
|
||||
{
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#endif /* CONFIG_MAGIC_SYSRQ_SERIAL */
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,80 +0,0 @@
|
||||
From 74b915d6ea260fa05980f3a46fcd654e39e78e2d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:20 +0206
|
||||
Subject: [PATCH 029/198] serial: 21285: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-4-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/21285.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/21285.c b/drivers/tty/serial/21285.c
|
||||
index d756fcc884cb..4de0c975ebdc 100644
|
||||
--- a/drivers/tty/serial/21285.c
|
||||
+++ b/drivers/tty/serial/21285.c
|
||||
@@ -185,14 +185,14 @@ static void serial21285_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int h_lcr;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
h_lcr = *CSR_H_UBRLCR;
|
||||
if (break_state)
|
||||
h_lcr |= H_UBRLCR_BREAK;
|
||||
else
|
||||
h_lcr &= ~H_UBRLCR_BREAK;
|
||||
*CSR_H_UBRLCR = h_lcr;
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int serial21285_startup(struct uart_port *port)
|
||||
@@ -272,7 +272,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (port->fifosize)
|
||||
h_lcr |= H_UBRLCR_FIFO;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -309,7 +309,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
*CSR_H_UBRLCR = h_lcr;
|
||||
*CSR_UARTCON = 1;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *serial21285_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,66 +0,0 @@
|
||||
From 0134106309ba05033201cfa72e9eb2f8d45483c2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:21 +0206
|
||||
Subject: [PATCH 030/198] serial: 8250_aspeed_vuart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-5-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_aspeed_vuart.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
|
||||
index 4a9e71b2dbbc..021949f252f8 100644
|
||||
--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
|
||||
+++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
|
||||
@@ -288,9 +288,9 @@ static void aspeed_vuart_set_throttle(struct uart_port *port, bool throttle)
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
__aspeed_vuart_set_throttle(up, throttle);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void aspeed_vuart_throttle(struct uart_port *port)
|
||||
@@ -340,7 +340,7 @@ static int aspeed_vuart_handle_irq(struct uart_port *port)
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
lsr = serial_port_in(port, UART_LSR);
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,156 +0,0 @@
|
||||
From 7446c26604cd03192e2cbc113641533204f235bf Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:22 +0206
|
||||
Subject: [PATCH 031/198] serial: 8250_bcm7271: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-6-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_bcm7271.c | 28 +++++++++++++-------------
|
||||
1 file changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
|
||||
index 9afd5979c9e0..db23b3a02aef 100644
|
||||
--- a/drivers/tty/serial/8250/8250_bcm7271.c
|
||||
+++ b/drivers/tty/serial/8250/8250_bcm7271.c
|
||||
@@ -567,7 +567,7 @@ static irqreturn_t brcmuart_isr(int irq, void *dev_id)
|
||||
if (interrupts == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
- spin_lock_irqsave(&up->lock, flags);
|
||||
+ uart_port_lock_irqsave(up, &flags);
|
||||
|
||||
/* Clear all interrupts */
|
||||
udma_writel(priv, REGS_DMA_ISR, UDMA_INTR_CLEAR, interrupts);
|
||||
@@ -581,7 +581,7 @@ static irqreturn_t brcmuart_isr(int irq, void *dev_id)
|
||||
if ((rval | tval) == 0)
|
||||
dev_warn(dev, "Spurious interrupt: 0x%x\n", interrupts);
|
||||
|
||||
- spin_unlock_irqrestore(&up->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(up, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -608,10 +608,10 @@ static int brcmuart_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
up->ier &= ~UART_IER_RDI;
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
|
||||
priv->tx_running = false;
|
||||
priv->dma.rx_dma = NULL;
|
||||
@@ -629,7 +629,7 @@ static void brcmuart_shutdown(struct uart_port *port)
|
||||
struct brcmuart_priv *priv = up->port.private_data;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
priv->shutdown = true;
|
||||
if (priv->dma_enabled) {
|
||||
stop_rx_dma(up);
|
||||
@@ -645,7 +645,7 @@ static void brcmuart_shutdown(struct uart_port *port)
|
||||
*/
|
||||
up->dma = NULL;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_do_shutdown(port);
|
||||
}
|
||||
|
||||
@@ -807,7 +807,7 @@ static int brcmuart_handle_irq(struct uart_port *p)
|
||||
* interrupt but there is no data ready.
|
||||
*/
|
||||
if (((iir & UART_IIR_ID) == UART_IIR_RX_TIMEOUT) && !(priv->shutdown)) {
|
||||
- spin_lock_irqsave(&p->lock, flags);
|
||||
+ uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_port_in(p, UART_LSR);
|
||||
if ((status & UART_LSR_DR) == 0) {
|
||||
|
||||
@@ -832,7 +832,7 @@ static int brcmuart_handle_irq(struct uart_port *p)
|
||||
|
||||
handled = 1;
|
||||
}
|
||||
- spin_unlock_irqrestore(&p->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(p, flags);
|
||||
if (handled)
|
||||
return 1;
|
||||
}
|
||||
@@ -850,7 +850,7 @@ static enum hrtimer_restart brcmuart_hrtimer_func(struct hrtimer *t)
|
||||
if (priv->shutdown)
|
||||
return HRTIMER_NORESTART;
|
||||
|
||||
- spin_lock_irqsave(&p->lock, flags);
|
||||
+ uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_port_in(p, UART_LSR);
|
||||
|
||||
/*
|
||||
@@ -874,7 +874,7 @@ static enum hrtimer_restart brcmuart_hrtimer_func(struct hrtimer *t)
|
||||
status |= UART_MCR_RTS;
|
||||
serial_port_out(p, UART_MCR, status);
|
||||
}
|
||||
- spin_unlock_irqrestore(&p->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(p, flags);
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
@@ -1173,10 +1173,10 @@ static int __maybe_unused brcmuart_suspend(struct device *dev)
|
||||
* This will prevent resume from enabling RTS before the
|
||||
* baud rate has been restored.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
priv->saved_mctrl = port->mctrl;
|
||||
port->mctrl &= ~TIOCM_RTS;
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
serial8250_suspend_port(priv->line);
|
||||
clk_disable_unprepare(priv->baud_mux_clk);
|
||||
@@ -1215,10 +1215,10 @@ static int __maybe_unused brcmuart_resume(struct device *dev)
|
||||
|
||||
if (priv->saved_mctrl & TIOCM_RTS) {
|
||||
/* Restore RTS */
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl |= TIOCM_RTS;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,472 +0,0 @@
|
||||
From 6d7ef26400cb5ebed5178eea4753c025a953d85e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:23 +0206
|
||||
Subject: [PATCH 032/198] serial: 8250: Use port lock wrappers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-7-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_core.c | 12 ++--
|
||||
drivers/tty/serial/8250/8250_port.c | 100 ++++++++++++++--------------
|
||||
2 files changed, 56 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
|
||||
index 3449f8790e46..904e319e6b4a 100644
|
||||
--- a/drivers/tty/serial/8250/8250_core.c
|
||||
+++ b/drivers/tty/serial/8250/8250_core.c
|
||||
@@ -259,7 +259,7 @@ static void serial8250_backup_timeout(struct timer_list *t)
|
||||
unsigned int iir, ier = 0, lsr;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Must disable interrupts or else we risk racing with the interrupt
|
||||
@@ -292,7 +292,7 @@ static void serial8250_backup_timeout(struct timer_list *t)
|
||||
if (up->port.irq)
|
||||
serial_out(up, UART_IER, ier);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/* Standard timer interval plus 0.2s to keep the port running */
|
||||
mod_timer(&up->timer,
|
||||
@@ -992,11 +992,11 @@ static void serial_8250_overrun_backoff_work(struct work_struct *work)
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
up->port.read_status_mask |= UART_LSR_DR;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1194,9 +1194,9 @@ void serial8250_unregister_port(int line)
|
||||
if (uart->em485) {
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&uart->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uart->port, &flags);
|
||||
serial8250_em485_destroy(uart);
|
||||
- spin_unlock_irqrestore(&uart->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uart->port, flags);
|
||||
}
|
||||
|
||||
uart_remove_one_port(&serial8250_reg, &uart->port);
|
||||
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
|
||||
index a17803da83f8..cba5a1b1030f 100644
|
||||
--- a/drivers/tty/serial/8250/8250_port.c
|
||||
+++ b/drivers/tty/serial/8250/8250_port.c
|
||||
@@ -689,7 +689,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
|
||||
if (p->capabilities & UART_CAP_SLEEP) {
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&p->port.lock);
|
||||
+ uart_port_lock_irq(&p->port);
|
||||
if (p->capabilities & UART_CAP_EFR) {
|
||||
lcr = serial_in(p, UART_LCR);
|
||||
efr = serial_in(p, UART_EFR);
|
||||
@@ -703,7 +703,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
serial_out(p, UART_EFR, efr);
|
||||
serial_out(p, UART_LCR, lcr);
|
||||
}
|
||||
- spin_unlock_irq(&p->port.lock);
|
||||
+ uart_port_unlock_irq(&p->port);
|
||||
}
|
||||
|
||||
serial8250_rpm_put(p);
|
||||
@@ -746,9 +746,9 @@ static void enable_rsa(struct uart_8250_port *up)
|
||||
{
|
||||
if (up->port.type == PORT_RSA) {
|
||||
if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
|
||||
- spin_lock_irq(&up->port.lock);
|
||||
+ uart_port_lock_irq(&up->port);
|
||||
__enable_rsa(up);
|
||||
- spin_unlock_irq(&up->port.lock);
|
||||
+ uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
|
||||
serial_out(up, UART_RSA_FRR, 0);
|
||||
@@ -768,7 +768,7 @@ static void disable_rsa(struct uart_8250_port *up)
|
||||
|
||||
if (up->port.type == PORT_RSA &&
|
||||
up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
|
||||
- spin_lock_irq(&up->port.lock);
|
||||
+ uart_port_lock_irq(&up->port);
|
||||
|
||||
mode = serial_in(up, UART_RSA_MSR);
|
||||
result = !(mode & UART_RSA_MSR_FIFO);
|
||||
@@ -781,7 +781,7 @@ static void disable_rsa(struct uart_8250_port *up)
|
||||
|
||||
if (result)
|
||||
up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
|
||||
- spin_unlock_irq(&up->port.lock);
|
||||
+ uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_SERIAL_8250_RSA */
|
||||
@@ -1172,7 +1172,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
up->capabilities = 0;
|
||||
up->bugs = 0;
|
||||
@@ -1211,7 +1211,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
/*
|
||||
* We failed; there's nothing here
|
||||
*/
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
|
||||
scratch2, scratch3);
|
||||
goto out;
|
||||
@@ -1235,7 +1235,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
status1 = serial_in(up, UART_MSR) & UART_MSR_STATUS_BITS;
|
||||
serial8250_out_MCR(up, save_mcr);
|
||||
if (status1 != (UART_MSR_DCD | UART_MSR_CTS)) {
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
DEBUG_AUTOCONF("LOOP test failed (%02x) ",
|
||||
status1);
|
||||
goto out;
|
||||
@@ -1304,7 +1304,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
out_unlock:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Check if the device is a Fintek F81216A
|
||||
@@ -1341,9 +1341,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
probe_irq_off(probe_irq_on());
|
||||
save_mcr = serial8250_in_MCR(up);
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
save_ier = serial_in(up, UART_IER);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
serial8250_out_MCR(up, UART_MCR_OUT1 | UART_MCR_OUT2);
|
||||
|
||||
irqs = probe_irq_on();
|
||||
@@ -1356,9 +1356,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
|
||||
}
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
serial_out(up, UART_IER, UART_IER_ALL_INTR);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
serial_in(up, UART_LSR);
|
||||
serial_in(up, UART_RX);
|
||||
serial_in(up, UART_IIR);
|
||||
@@ -1369,9 +1369,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
|
||||
serial8250_out_MCR(up, save_mcr);
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
serial_out(up, UART_IER, save_ier);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
|
||||
if (port->flags & UPF_FOURPORT)
|
||||
outb_p(save_ICP, ICP);
|
||||
@@ -1436,13 +1436,13 @@ static enum hrtimer_restart serial8250_em485_handle_stop_tx(struct hrtimer *t)
|
||||
unsigned long flags;
|
||||
|
||||
serial8250_rpm_get(p);
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (em485->active_timer == &em485->stop_tx_timer) {
|
||||
p->rs485_stop_tx(p);
|
||||
em485->active_timer = NULL;
|
||||
em485->tx_stopped = true;
|
||||
}
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
serial8250_rpm_put(p);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
@@ -1624,12 +1624,12 @@ static enum hrtimer_restart serial8250_em485_handle_start_tx(struct hrtimer *t)
|
||||
struct uart_8250_port *p = em485->port;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (em485->active_timer == &em485->start_tx_timer) {
|
||||
__start_tx(&p->port);
|
||||
em485->active_timer = NULL;
|
||||
}
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -1912,7 +1912,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = serial_lsr_in(up);
|
||||
|
||||
@@ -1982,9 +1982,9 @@ static int serial8250_tx_threshold_handle_irq(struct uart_port *port)
|
||||
if ((iir & UART_IIR_ID) == UART_IIR_THRI) {
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
serial8250_tx_chars(up);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
iir = serial_port_in(port, UART_IIR);
|
||||
@@ -1999,10 +1999,10 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (!serial8250_tx_dma_running(up) && uart_lsr_tx_empty(serial_lsr_in(up)))
|
||||
result = TIOCSER_TEMT;
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
@@ -2064,13 +2064,13 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_port_out(port, UART_LCR, up->lcr);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
}
|
||||
|
||||
@@ -2205,7 +2205,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
up->acr = 0;
|
||||
serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_port_out(port, UART_EFR, UART_EFR_ECB);
|
||||
@@ -2215,7 +2215,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_port_out(port, UART_EFR, UART_EFR_ECB);
|
||||
serial_port_out(port, UART_LCR, 0);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
if (port->type == PORT_DA830) {
|
||||
@@ -2224,10 +2224,10 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
serial_port_out(port, UART_DA830_PWREMU_MGMT, 0);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
mdelay(10);
|
||||
|
||||
/* Enable Tx, Rx and free run mode */
|
||||
@@ -2341,7 +2341,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_THRE);
|
||||
serial_port_out_sync(port, UART_IER, UART_IER_THRI);
|
||||
@@ -2353,7 +2353,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
iir = serial_port_in(port, UART_IIR);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irqflags & IRQF_SHARED)
|
||||
enable_irq(port->irq);
|
||||
@@ -2376,7 +2376,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*/
|
||||
serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (up->port.flags & UPF_FOURPORT) {
|
||||
if (!up->port.irq)
|
||||
up->port.mctrl |= TIOCM_OUT1;
|
||||
@@ -2422,7 +2422,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
}
|
||||
|
||||
dont_test_tx_en:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Clear the interrupt registers again for luck, and clear the
|
||||
@@ -2493,17 +2493,17 @@ void serial8250_do_shutdown(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
up->ier = 0;
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
synchronize_irq(port->irq);
|
||||
|
||||
if (up->dma)
|
||||
serial8250_release_dma(up);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (port->flags & UPF_FOURPORT) {
|
||||
/* reset interrupts on the AST Fourport board */
|
||||
inb((port->iobase & 0xfe0) | 0x1f);
|
||||
@@ -2512,7 +2512,7 @@ void serial8250_do_shutdown(struct uart_port *port)
|
||||
port->mctrl &= ~TIOCM_OUT2;
|
||||
|
||||
serial8250_set_mctrl(port, port->mctrl);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -2748,14 +2748,14 @@ void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk)
|
||||
quot = serial8250_get_divisor(port, baud, &frac);
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
serial8250_set_divisor(port, baud, quot, frac);
|
||||
serial_port_out(port, UART_LCR, up->lcr);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
out_unlock:
|
||||
@@ -2792,7 +2792,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
serial8250_rpm_get(up);
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
up->lcr = cval; /* Save computed LCR */
|
||||
|
||||
@@ -2895,7 +2895,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
serial_port_out(port, UART_FCR, up->fcr); /* set fcr */
|
||||
}
|
||||
serial8250_set_mctrl(port, port->mctrl);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
/* Don't rewrite B0 */
|
||||
@@ -2918,15 +2918,15 @@ void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
serial8250_enable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
serial8250_disable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3400,9 +3400,9 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
touch_nmi_watchdog();
|
||||
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -3472,7 +3472,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
serial8250_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static unsigned int probe_baud(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,85 +0,0 @@
|
||||
From fc0cf093a51c9d7b446d83d1aa4ac9f8f7d53d16 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:24 +0206
|
||||
Subject: [PATCH 033/198] serial: 8250_dma: Use port lock wrappers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-8-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_dma.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c
|
||||
index 7fa66501792d..8b30ca8fdd3f 100644
|
||||
--- a/drivers/tty/serial/8250/8250_dma.c
|
||||
+++ b/drivers/tty/serial/8250/8250_dma.c
|
||||
@@ -22,7 +22,7 @@ static void __dma_tx_complete(void *param)
|
||||
dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr,
|
||||
UART_XMIT_SIZE, DMA_TO_DEVICE);
|
||||
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
@@ -35,7 +35,7 @@ static void __dma_tx_complete(void *param)
|
||||
if (ret || !dma->tx_running)
|
||||
serial8250_set_THRI(p);
|
||||
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static void __dma_rx_complete(struct uart_8250_port *p)
|
||||
@@ -70,7 +70,7 @@ static void dma_rx_complete(void *param)
|
||||
struct uart_8250_dma *dma = p->dma;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (dma->rx_running)
|
||||
__dma_rx_complete(p);
|
||||
|
||||
@@ -80,7 +80,7 @@ static void dma_rx_complete(void *param)
|
||||
*/
|
||||
if (!dma->rx_running && (serial_lsr_in(p) & UART_LSR_DR))
|
||||
p->dma->rx_dma(p);
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
int serial8250_tx_dma(struct uart_8250_port *p)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,74 +0,0 @@
|
||||
From b8902016840131f33ef21a02de68c492754ff094 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:25 +0206
|
||||
Subject: [PATCH 034/198] serial: 8250_dw: Use port lock wrappers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-9-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_dw.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
|
||||
index 8aed33be2ebf..5367bcc6256c 100644
|
||||
--- a/drivers/tty/serial/8250/8250_dw.c
|
||||
+++ b/drivers/tty/serial/8250/8250_dw.c
|
||||
@@ -290,20 +290,20 @@ static int dw8250_handle_irq(struct uart_port *p)
|
||||
* so we limit the workaround only to non-DMA mode.
|
||||
*/
|
||||
if (!up->dma && rx_timeout) {
|
||||
- spin_lock_irqsave(&p->lock, flags);
|
||||
+ uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_lsr_in(up);
|
||||
|
||||
if (!(status & (UART_LSR_DR | UART_LSR_BI)))
|
||||
(void) p->serial_in(p, UART_RX);
|
||||
|
||||
- spin_unlock_irqrestore(&p->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(p, flags);
|
||||
}
|
||||
|
||||
/* Manually stop the Rx DMA transfer when acting as flow controller */
|
||||
if (quirks & DW_UART_QUIRK_IS_DMA_FC && up->dma && up->dma->rx_running && rx_timeout) {
|
||||
- spin_lock_irqsave(&p->lock, flags);
|
||||
+ uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_lsr_in(up);
|
||||
- spin_unlock_irqrestore(&p->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(p, flags);
|
||||
|
||||
if (status & (UART_LSR_DR | UART_LSR_BI)) {
|
||||
dw8250_writel_ext(p, RZN1_UART_RDMACR, 0);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,57 +0,0 @@
|
||||
From ebb1f40b7cff4130355091b16d8b084992e8ab73 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:26 +0206
|
||||
Subject: [PATCH 035/198] serial: 8250_exar: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-10-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_exar.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c
|
||||
index 27430fdd9e76..17be6ad24a0f 100644
|
||||
--- a/drivers/tty/serial/8250/8250_exar.c
|
||||
+++ b/drivers/tty/serial/8250/8250_exar.c
|
||||
@@ -243,9 +243,9 @@ static int xr17v35x_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
|
||||
return serial8250_do_startup(port);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,68 +0,0 @@
|
||||
From 3b586d0c385c87dbaec0b5f0f17412cf9d2a5895 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:27 +0206
|
||||
Subject: [PATCH 036/198] serial: 8250_fsl: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-11-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_fsl.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c
|
||||
index 6af4e1c1210a..f522eb5026c9 100644
|
||||
--- a/drivers/tty/serial/8250/8250_fsl.c
|
||||
+++ b/drivers/tty/serial/8250/8250_fsl.c
|
||||
@@ -30,11 +30,11 @@ int fsl8250_handle_irq(struct uart_port *port)
|
||||
unsigned int iir;
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
iir = port->serial_in(port, UART_IIR);
|
||||
if (iir & UART_IIR_NO_INT) {
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ int fsl8250_handle_irq(struct uart_port *port)
|
||||
if (unlikely(up->lsr_saved_flags & UART_LSR_BI)) {
|
||||
up->lsr_saved_flags &= ~UART_LSR_BI;
|
||||
port->serial_in(port, UART_RX);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
return 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,82 +0,0 @@
|
||||
From b859af0fd194fed9bc10a7193b1aad2643dcb87f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:28 +0206
|
||||
Subject: [PATCH 037/198] serial: 8250_mtk: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-12-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_mtk.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
|
||||
index 28f9a2679a20..33699e86eb52 100644
|
||||
--- a/drivers/tty/serial/8250/8250_mtk.c
|
||||
+++ b/drivers/tty/serial/8250/8250_mtk.c
|
||||
@@ -102,7 +102,7 @@ static void mtk8250_dma_rx_complete(void *param)
|
||||
if (data->rx_status == DMA_RX_SHUTDOWN)
|
||||
return;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
|
||||
total = dma->rx_size - state.residue;
|
||||
@@ -128,7 +128,7 @@ static void mtk8250_dma_rx_complete(void *param)
|
||||
|
||||
mtk8250_rx_dma(up);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void mtk8250_rx_dma(struct uart_8250_port *up)
|
||||
@@ -372,7 +372,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -420,7 +420,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (uart_console(port))
|
||||
up->port.cons->cflag = termios->c_cflag;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
/* Don't rewrite B0 */
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,241 +0,0 @@
|
||||
From 89c679b54a7b3877b5d4b67c3dce5571fc98ff32 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:29 +0206
|
||||
Subject: [PATCH 038/198] serial: 8250_omap: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-13-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_omap.c | 52 ++++++++++++++---------------
|
||||
1 file changed, 26 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
|
||||
index 8f472a2080ff..78fc1f17d5e2 100644
|
||||
--- a/drivers/tty/serial/8250/8250_omap.c
|
||||
+++ b/drivers/tty/serial/8250/8250_omap.c
|
||||
@@ -405,7 +405,7 @@ static void omap_8250_set_termios(struct uart_port *port,
|
||||
* interrupts disabled.
|
||||
*/
|
||||
pm_runtime_get_sync(port->dev);
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -508,7 +508,7 @@ static void omap_8250_set_termios(struct uart_port *port,
|
||||
}
|
||||
omap8250_restore_regs(up);
|
||||
|
||||
- spin_unlock_irq(&up->port.lock);
|
||||
+ uart_port_unlock_irq(&up->port);
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
|
||||
@@ -533,7 +533,7 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state,
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
efr = serial_in(up, UART_EFR);
|
||||
@@ -545,7 +545,7 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state,
|
||||
serial_out(up, UART_EFR, efr);
|
||||
serial_out(up, UART_LCR, 0);
|
||||
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -676,7 +676,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
||||
unsigned long delay;
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
up->ier = port->serial_in(port, UART_IER);
|
||||
if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) {
|
||||
port->ops->stop_rx(port);
|
||||
@@ -686,7 +686,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
||||
*/
|
||||
cancel_delayed_work(&up->overrun_backoff);
|
||||
}
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
delay = msecs_to_jiffies(up->overrun_backoff_time_ms);
|
||||
schedule_delayed_work(&up->overrun_backoff, delay);
|
||||
@@ -733,10 +733,10 @@ static int omap_8250_startup(struct uart_port *port)
|
||||
}
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
up->ier = UART_IER_RLSI | UART_IER_RDI;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
up->capabilities |= UART_CAP_RPM;
|
||||
@@ -749,9 +749,9 @@ static int omap_8250_startup(struct uart_port *port)
|
||||
serial_out(up, UART_OMAP_WER, priv->wer);
|
||||
|
||||
if (up->dma && !(priv->habit & UART_HAS_EFR2)) {
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
up->dma->rx_dma(up);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
}
|
||||
|
||||
enable_irq(up->port.irq);
|
||||
@@ -777,10 +777,10 @@ static void omap_8250_shutdown(struct uart_port *port)
|
||||
serial_out(up, UART_OMAP_EFR2, 0x0);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
up->ier = 0;
|
||||
serial_out(up, UART_IER, 0);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
disable_irq_nosync(up->port.irq);
|
||||
dev_pm_clear_wake_irq(port->dev);
|
||||
|
||||
@@ -805,10 +805,10 @@ static void omap_8250_throttle(struct uart_port *port)
|
||||
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
port->ops->stop_rx(port);
|
||||
priv->throttled = true;
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -823,14 +823,14 @@ static void omap_8250_unthrottle(struct uart_port *port)
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
priv->throttled = false;
|
||||
if (up->dma)
|
||||
up->dma->rx_dma(up);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
port->read_status_mask |= UART_LSR_DR;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -974,7 +974,7 @@ static void __dma_rx_complete(void *param)
|
||||
unsigned long flags;
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
/*
|
||||
* If the tx status is not DMA_COMPLETE, then this is a delayed
|
||||
@@ -983,7 +983,7 @@ static void __dma_rx_complete(void *param)
|
||||
*/
|
||||
if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) !=
|
||||
DMA_COMPLETE) {
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
return;
|
||||
}
|
||||
__dma_rx_do_complete(p);
|
||||
@@ -994,7 +994,7 @@ static void __dma_rx_complete(void *param)
|
||||
omap_8250_rx_dma(p);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
||||
@@ -1099,7 +1099,7 @@ static void omap_8250_dma_tx_complete(void *param)
|
||||
dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr,
|
||||
UART_XMIT_SIZE, DMA_TO_DEVICE);
|
||||
|
||||
- spin_lock_irqsave(&p->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
@@ -1128,7 +1128,7 @@ static void omap_8250_dma_tx_complete(void *param)
|
||||
serial8250_set_THRI(p);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static int omap_8250_tx_dma(struct uart_8250_port *p)
|
||||
@@ -1294,7 +1294,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
status = serial_port_in(port, UART_LSR);
|
||||
|
||||
@@ -1774,15 +1774,15 @@ static int omap8250_runtime_resume(struct device *dev)
|
||||
up = serial8250_get_port(priv->line);
|
||||
|
||||
if (up && omap8250_lost_context(up)) {
|
||||
- spin_lock_irq(&up->port.lock);
|
||||
+ uart_port_lock_irq(&up->port);
|
||||
omap8250_restore_regs(up);
|
||||
- spin_unlock_irq(&up->port.lock);
|
||||
+ uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
|
||||
if (up && up->dma && up->dma->rxchan && !(priv->habit & UART_HAS_EFR2)) {
|
||||
- spin_lock_irq(&up->port.lock);
|
||||
+ uart_port_lock_irq(&up->port);
|
||||
omap_8250_rx_dma(up);
|
||||
- spin_unlock_irq(&up->port.lock);
|
||||
+ uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
|
||||
priv->latency = priv->calc_latency;
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,71 +0,0 @@
|
||||
From 6cf203f22919c9ce8bf0a9ccfe2de745fd7042e1 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:30 +0206
|
||||
Subject: [PATCH 039/198] serial: 8250_pci1xxxx: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-14-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250/8250_pci1xxxx.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250/8250_pci1xxxx.c b/drivers/tty/serial/8250/8250_pci1xxxx.c
|
||||
index a3b25779d921..53e238c8cc89 100644
|
||||
--- a/drivers/tty/serial/8250/8250_pci1xxxx.c
|
||||
+++ b/drivers/tty/serial/8250/8250_pci1xxxx.c
|
||||
@@ -225,10 +225,10 @@ static bool pci1xxxx_port_suspend(int line)
|
||||
if (port->suspended == 0 && port->dev) {
|
||||
wakeup_mask = readb(up->port.membase + UART_WAKE_MASK_REG);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl &= ~TIOCM_OUT2;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = (wakeup_mask & UART_WAKE_SRCS) != UART_WAKE_SRCS;
|
||||
}
|
||||
@@ -251,10 +251,10 @@ static void pci1xxxx_port_resume(int line)
|
||||
writeb(UART_WAKE_SRCS, port->membase + UART_WAKE_REG);
|
||||
|
||||
if (port->suspended == 0) {
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl |= TIOCM_OUT2;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
mutex_unlock(&tport->mutex);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,138 +0,0 @@
|
||||
From 072715587bf21e30fa500c7a096398d7e1267b37 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:31 +0206
|
||||
Subject: [PATCH 040/198] serial: altera_jtaguart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-15-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/altera_jtaguart.c | 28 ++++++++++++++--------------
|
||||
1 file changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/altera_jtaguart.c b/drivers/tty/serial/altera_jtaguart.c
|
||||
index 5fab4c978891..7090b251dd4d 100644
|
||||
--- a/drivers/tty/serial/altera_jtaguart.c
|
||||
+++ b/drivers/tty/serial/altera_jtaguart.c
|
||||
@@ -147,14 +147,14 @@ static irqreturn_t altera_jtaguart_interrupt(int irq, void *data)
|
||||
isr = (readl(port->membase + ALTERA_JTAGUART_CONTROL_REG) >>
|
||||
ALTERA_JTAGUART_CONTROL_RI_OFF) & port->read_status_mask;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
if (isr & ALTERA_JTAGUART_CONTROL_RE_MSK)
|
||||
altera_jtaguart_rx_chars(port);
|
||||
if (isr & ALTERA_JTAGUART_CONTROL_WE_MSK)
|
||||
altera_jtaguart_tx_chars(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -180,14 +180,14 @@ static int altera_jtaguart_startup(struct uart_port *port)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Enable RX interrupts now */
|
||||
port->read_status_mask = ALTERA_JTAGUART_CONTROL_RE_MSK;
|
||||
writel(port->read_status_mask,
|
||||
port->membase + ALTERA_JTAGUART_CONTROL_REG);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -196,14 +196,14 @@ static void altera_jtaguart_shutdown(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
port->read_status_mask = 0;
|
||||
writel(port->read_status_mask,
|
||||
port->membase + ALTERA_JTAGUART_CONTROL_REG);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -264,33 +264,33 @@ static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c
|
||||
unsigned long flags;
|
||||
u32 status;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
while (!altera_jtaguart_tx_space(port, &status)) {
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if ((status & ALTERA_JTAGUART_CONTROL_AC_MSK) == 0) {
|
||||
return; /* no connection activity */
|
||||
}
|
||||
|
||||
cpu_relax();
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
}
|
||||
writel(c, port->membase + ALTERA_JTAGUART_DATA_REG);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#else
|
||||
static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
while (!altera_jtaguart_tx_space(port, NULL)) {
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
cpu_relax();
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
}
|
||||
writel(c, port->membase + ALTERA_JTAGUART_DATA_REG);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,121 +0,0 @@
|
||||
From e561202106a9b11c8921d7c0648d421c47d398ea Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:32 +0206
|
||||
Subject: [PATCH 041/198] serial: altera_uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-16-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/altera_uart.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/altera_uart.c b/drivers/tty/serial/altera_uart.c
|
||||
index a9c41942190c..77835ac68df2 100644
|
||||
--- a/drivers/tty/serial/altera_uart.c
|
||||
+++ b/drivers/tty/serial/altera_uart.c
|
||||
@@ -164,13 +164,13 @@ static void altera_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
struct altera_uart *pp = container_of(port, struct altera_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
pp->imr |= ALTERA_UART_CONTROL_TRBK_MSK;
|
||||
else
|
||||
pp->imr &= ~ALTERA_UART_CONTROL_TRBK_MSK;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void altera_uart_set_termios(struct uart_port *port,
|
||||
@@ -187,10 +187,10 @@ static void altera_uart_set_termios(struct uart_port *port,
|
||||
tty_termios_copy_hw(termios, old);
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
altera_uart_writel(port, baudclk, ALTERA_UART_DIVISOR_REG);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* FIXME: port->read_status_mask and port->ignore_status_mask
|
||||
@@ -264,12 +264,12 @@ static irqreturn_t altera_uart_interrupt(int irq, void *data)
|
||||
|
||||
isr = altera_uart_readl(port, ALTERA_UART_STATUS_REG) & pp->imr;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (isr & ALTERA_UART_STATUS_RRDY_MSK)
|
||||
altera_uart_rx_chars(port);
|
||||
if (isr & ALTERA_UART_STATUS_TRDY_MSK)
|
||||
altera_uart_tx_chars(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -313,13 +313,13 @@ static int altera_uart_startup(struct uart_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Enable RX interrupts now */
|
||||
pp->imr = ALTERA_UART_CONTROL_RRDY_MSK;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -329,13 +329,13 @@ static void altera_uart_shutdown(struct uart_port *port)
|
||||
struct altera_uart *pp = container_of(port, struct altera_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
pp->imr = 0;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irq)
|
||||
free_irq(port->irq, port);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,117 +0,0 @@
|
||||
From 7fec3009f5bfb2bd5fc6c0ac533fc1b9380a74c0 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:33 +0206
|
||||
Subject: [PATCH 042/198] serial: amba-pl010: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-17-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/amba-pl010.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/amba-pl010.c b/drivers/tty/serial/amba-pl010.c
|
||||
index b5a7404cbacb..eabbf8afc9b5 100644
|
||||
--- a/drivers/tty/serial/amba-pl010.c
|
||||
+++ b/drivers/tty/serial/amba-pl010.c
|
||||
@@ -207,7 +207,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id)
|
||||
unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
|
||||
int handled = 0;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
status = readb(port->membase + UART010_IIR);
|
||||
if (status) {
|
||||
@@ -228,7 +228,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id)
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -270,14 +270,14 @@ static void pl010_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int lcr_h;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
lcr_h = readb(port->membase + UART010_LCRH);
|
||||
if (break_state == -1)
|
||||
lcr_h |= UART01x_LCRH_BRK;
|
||||
else
|
||||
lcr_h &= ~UART01x_LCRH_BRK;
|
||||
writel(lcr_h, port->membase + UART010_LCRH);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int pl010_startup(struct uart_port *port)
|
||||
@@ -385,7 +385,7 @@ pl010_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (port->fifosize > 1)
|
||||
lcr_h |= UART01x_LCRH_FEN;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -438,22 +438,22 @@ pl010_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
writel(lcr_h, port->membase + UART010_LCRH);
|
||||
writel(old_cr, port->membase + UART010_CR);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void pl010_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
pl010_enable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
pl010_disable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,332 +0,0 @@
|
||||
From 86a03026e71ac5627a00059c3447543f9236d5bf Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:34 +0206
|
||||
Subject: [PATCH 043/198] serial: amba-pl011: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-18-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/amba-pl011.c | 72 ++++++++++++++++-----------------
|
||||
1 file changed, 36 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
|
||||
index 362bbcdece0d..16c770311069 100644
|
||||
--- a/drivers/tty/serial/amba-pl011.c
|
||||
+++ b/drivers/tty/serial/amba-pl011.c
|
||||
@@ -347,9 +347,9 @@ static int pl011_fifo_to_tty(struct uart_amba_port *uap)
|
||||
flag = TTY_FRAME;
|
||||
}
|
||||
|
||||
- spin_unlock(&uap->port.lock);
|
||||
+ uart_port_unlock(&uap->port);
|
||||
sysrq = uart_handle_sysrq_char(&uap->port, ch & 255);
|
||||
- spin_lock(&uap->port.lock);
|
||||
+ uart_port_lock(&uap->port);
|
||||
|
||||
if (!sysrq)
|
||||
uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
|
||||
@@ -544,7 +544,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
unsigned long flags;
|
||||
u16 dmacr;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
if (uap->dmatx.queued)
|
||||
dma_unmap_single(dmatx->chan->device->dev, dmatx->dma,
|
||||
dmatx->len, DMA_TO_DEVICE);
|
||||
@@ -565,7 +565,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
if (!(dmacr & UART011_TXDMAE) || uart_tx_stopped(&uap->port) ||
|
||||
uart_circ_empty(&uap->port.state->xmit)) {
|
||||
uap->dmatx.queued = false;
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -576,7 +576,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
*/
|
||||
pl011_start_tx_pio(uap);
|
||||
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1004,7 +1004,7 @@ static void pl011_dma_rx_callback(void *data)
|
||||
* routine to flush out the secondary DMA buffer while
|
||||
* we immediately trigger the next DMA job.
|
||||
*/
|
||||
- spin_lock_irq(&uap->port.lock);
|
||||
+ uart_port_lock_irq(&uap->port);
|
||||
/*
|
||||
* Rx data can be taken by the UART interrupts during
|
||||
* the DMA irq handler. So we check the residue here.
|
||||
@@ -1020,7 +1020,7 @@ static void pl011_dma_rx_callback(void *data)
|
||||
ret = pl011_dma_rx_trigger_dma(uap);
|
||||
|
||||
pl011_dma_rx_chars(uap, pending, lastbuf, false);
|
||||
- spin_unlock_irq(&uap->port.lock);
|
||||
+ uart_port_unlock_irq(&uap->port);
|
||||
/*
|
||||
* Do this check after we picked the DMA chars so we don't
|
||||
* get some IRQ immediately from RX.
|
||||
@@ -1086,11 +1086,11 @@ static void pl011_dma_rx_poll(struct timer_list *t)
|
||||
if (jiffies_to_msecs(jiffies - dmarx->last_jiffies)
|
||||
> uap->dmarx.poll_timeout) {
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
pl011_dma_rx_stop(uap);
|
||||
uap->im |= UART011_RXIM;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
uap->dmarx.running = false;
|
||||
dmaengine_terminate_all(rxchan);
|
||||
@@ -1186,10 +1186,10 @@ static void pl011_dma_shutdown(struct uart_amba_port *uap)
|
||||
while (pl011_read(uap, REG_FR) & uap->vendor->fr_busy)
|
||||
cpu_relax();
|
||||
|
||||
- spin_lock_irq(&uap->port.lock);
|
||||
+ uart_port_lock_irq(&uap->port);
|
||||
uap->dmacr &= ~(UART011_DMAONERR | UART011_RXDMAE | UART011_TXDMAE);
|
||||
pl011_write(uap->dmacr, uap, REG_DMACR);
|
||||
- spin_unlock_irq(&uap->port.lock);
|
||||
+ uart_port_unlock_irq(&uap->port);
|
||||
|
||||
if (uap->using_tx_dma) {
|
||||
/* In theory, this should already be done by pl011_dma_flush_buffer */
|
||||
@@ -1400,9 +1400,9 @@ static void pl011_throttle_rx(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
pl011_stop_rx(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void pl011_enable_ms(struct uart_port *port)
|
||||
@@ -1420,7 +1420,7 @@ __acquires(&uap->port.lock)
|
||||
{
|
||||
pl011_fifo_to_tty(uap);
|
||||
|
||||
- spin_unlock(&uap->port.lock);
|
||||
+ uart_port_unlock(&uap->port);
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
/*
|
||||
* If we were temporarily out of DMA mode for a while,
|
||||
@@ -1445,7 +1445,7 @@ __acquires(&uap->port.lock)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
- spin_lock(&uap->port.lock);
|
||||
+ uart_port_lock(&uap->port);
|
||||
}
|
||||
|
||||
static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c,
|
||||
@@ -1551,7 +1551,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
|
||||
unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
|
||||
int handled = 0;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
status = pl011_read(uap, REG_RIS) & uap->im;
|
||||
if (status) {
|
||||
do {
|
||||
@@ -1581,7 +1581,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -1653,14 +1653,14 @@ static void pl011_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int lcr_h;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
lcr_h = pl011_read(uap, REG_LCRH_TX);
|
||||
if (break_state == -1)
|
||||
lcr_h |= UART01x_LCRH_BRK;
|
||||
else
|
||||
lcr_h &= ~UART01x_LCRH_BRK;
|
||||
pl011_write(lcr_h, uap, REG_LCRH_TX);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CONSOLE_POLL
|
||||
@@ -1799,7 +1799,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap)
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
/* Clear out any spuriously appearing RX interrupts */
|
||||
pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR);
|
||||
@@ -1821,7 +1821,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap)
|
||||
if (!pl011_dma_rx_running(uap))
|
||||
uap->im |= UART011_RXIM;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
@@ -1829,7 +1829,7 @@ static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
uap->im = UART011_RTIM;
|
||||
if (!pl011_dma_rx_running(uap))
|
||||
@@ -1837,7 +1837,7 @@ static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
static int pl011_startup(struct uart_port *port)
|
||||
@@ -1857,7 +1857,7 @@ static int pl011_startup(struct uart_port *port)
|
||||
|
||||
pl011_write(uap->vendor->ifls, uap, REG_IFLS);
|
||||
|
||||
- spin_lock_irq(&uap->port.lock);
|
||||
+ uart_port_lock_irq(&uap->port);
|
||||
|
||||
cr = pl011_read(uap, REG_CR);
|
||||
cr &= UART011_CR_RTS | UART011_CR_DTR;
|
||||
@@ -1868,7 +1868,7 @@ static int pl011_startup(struct uart_port *port)
|
||||
|
||||
pl011_write(cr, uap, REG_CR);
|
||||
|
||||
- spin_unlock_irq(&uap->port.lock);
|
||||
+ uart_port_unlock_irq(&uap->port);
|
||||
|
||||
/*
|
||||
* initialise the old status of the modem signals
|
||||
@@ -1929,12 +1929,12 @@ static void pl011_disable_uart(struct uart_amba_port *uap)
|
||||
unsigned int cr;
|
||||
|
||||
uap->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
|
||||
- spin_lock_irq(&uap->port.lock);
|
||||
+ uart_port_lock_irq(&uap->port);
|
||||
cr = pl011_read(uap, REG_CR);
|
||||
cr &= UART011_CR_RTS | UART011_CR_DTR;
|
||||
cr |= UART01x_CR_UARTEN | UART011_CR_TXE;
|
||||
pl011_write(cr, uap, REG_CR);
|
||||
- spin_unlock_irq(&uap->port.lock);
|
||||
+ uart_port_unlock_irq(&uap->port);
|
||||
|
||||
/*
|
||||
* disable break condition and fifos
|
||||
@@ -1946,14 +1946,14 @@ static void pl011_disable_uart(struct uart_amba_port *uap)
|
||||
|
||||
static void pl011_disable_interrupts(struct uart_amba_port *uap)
|
||||
{
|
||||
- spin_lock_irq(&uap->port.lock);
|
||||
+ uart_port_lock_irq(&uap->port);
|
||||
|
||||
/* mask all interrupts and clear all pending ones */
|
||||
uap->im = 0;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
pl011_write(0xffff, uap, REG_ICR);
|
||||
|
||||
- spin_unlock_irq(&uap->port.lock);
|
||||
+ uart_port_unlock_irq(&uap->port);
|
||||
}
|
||||
|
||||
static void pl011_shutdown(struct uart_port *port)
|
||||
@@ -2098,7 +2098,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
bits = tty_get_frame_size(termios->c_cflag);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -2172,7 +2172,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
old_cr |= UART011_CR_RXE;
|
||||
pl011_write(old_cr, uap, REG_CR);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2190,10 +2190,10 @@ sbsa_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
termios->c_cflag &= ~(CMSPAR | CRTSCTS);
|
||||
termios->c_cflag |= CS8 | CLOCAL;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, CS8, uap->fixed_baud);
|
||||
pl011_setup_status_masks(port, termios);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *pl011_type(struct uart_port *port)
|
||||
@@ -2332,9 +2332,9 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (uap->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&uap->port.lock);
|
||||
+ locked = uart_port_trylock(&uap->port);
|
||||
else
|
||||
- spin_lock(&uap->port.lock);
|
||||
+ uart_port_lock(&uap->port);
|
||||
|
||||
/*
|
||||
* First save the CR then disable the interrupts
|
||||
@@ -2360,7 +2360,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
||||
pl011_write(old_cr, uap, REG_CR);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&uap->port.lock);
|
||||
+ uart_port_unlock(&uap->port);
|
||||
local_irq_restore(flags);
|
||||
|
||||
clk_disable(uap->clk);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 8e17c4e2574b46e536dbc23f1d70a5a9c5766c2e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:35 +0206
|
||||
Subject: [PATCH 044/198] serial: apb: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-19-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/apbuart.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/apbuart.c b/drivers/tty/serial/apbuart.c
|
||||
index d3cb341f2c55..364599f256db 100644
|
||||
--- a/drivers/tty/serial/apbuart.c
|
||||
+++ b/drivers/tty/serial/apbuart.c
|
||||
@@ -133,7 +133,7 @@ static irqreturn_t apbuart_int(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned int status;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
status = UART_GET_STATUS(port);
|
||||
if (status & UART_STATUS_DR)
|
||||
@@ -141,7 +141,7 @@ static irqreturn_t apbuart_int(int irq, void *dev_id)
|
||||
if (status & UART_STATUS_THE)
|
||||
apbuart_tx_chars(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -228,7 +228,7 @@ static void apbuart_set_termios(struct uart_port *port,
|
||||
if (termios->c_cflag & CRTSCTS)
|
||||
cr |= UART_CTRL_FL;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Update the per-port timeout. */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
@@ -251,7 +251,7 @@ static void apbuart_set_termios(struct uart_port *port,
|
||||
UART_PUT_SCAL(port, quot);
|
||||
UART_PUT_CTRL(port, cr);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *apbuart_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,149 +0,0 @@
|
||||
From c8c0b524a6198b950edcc01008dbe59c428a8fcb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:36 +0206
|
||||
Subject: [PATCH 045/198] serial: ar933x: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-20-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/ar933x_uart.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c
|
||||
index 924c1a89347c..ffd234673177 100644
|
||||
--- a/drivers/tty/serial/ar933x_uart.c
|
||||
+++ b/drivers/tty/serial/ar933x_uart.c
|
||||
@@ -133,9 +133,9 @@ static unsigned int ar933x_uart_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int rdata;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
rdata = ar933x_uart_read(up, AR933X_UART_DATA_REG);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return (rdata & AR933X_UART_DATA_TX_CSR) ? 0 : TIOCSER_TEMT;
|
||||
}
|
||||
@@ -220,14 +220,14 @@ static void ar933x_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
container_of(port, struct ar933x_uart_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_BREAK);
|
||||
else
|
||||
ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_BREAK);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -318,7 +318,7 @@ static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/* disable the UART */
|
||||
ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
|
||||
@@ -352,7 +352,7 @@ static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
|
||||
AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
if (tty_termios_baud_rate(new))
|
||||
tty_termios_encode_baud_rate(new, baud, baud);
|
||||
@@ -450,7 +450,7 @@ static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id)
|
||||
if ((status & AR933X_UART_CS_HOST_INT) == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
status = ar933x_uart_read(up, AR933X_UART_INT_REG);
|
||||
status &= ar933x_uart_read(up, AR933X_UART_INT_EN_REG);
|
||||
@@ -468,7 +468,7 @@ static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id)
|
||||
ar933x_uart_tx_chars(up);
|
||||
}
|
||||
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -485,7 +485,7 @@ static int ar933x_uart_startup(struct uart_port *port)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/* Enable HOST interrupts */
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
@@ -498,7 +498,7 @@ static int ar933x_uart_startup(struct uart_port *port)
|
||||
/* Enable RX interrupts */
|
||||
ar933x_uart_start_rx_interrupt(up);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -632,9 +632,9 @@ static void ar933x_uart_console_write(struct console *co, const char *s,
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -654,7 +654,7 @@ static void ar933x_uart_console_write(struct console *co, const char *s,
|
||||
ar933x_uart_write(up, AR933X_UART_INT_REG, AR933X_UART_INT_ALLINTS);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,102 +0,0 @@
|
||||
From b902f0c9ca0f4234552215a4b8fbb6b0cd274aa4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:37 +0206
|
||||
Subject: [PATCH 046/198] serial: arc_uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-21-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/arc_uart.c | 16 ++++++++--------
|
||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/arc_uart.c b/drivers/tty/serial/arc_uart.c
|
||||
index ad4ae19b6ce3..1aa5b2b49c26 100644
|
||||
--- a/drivers/tty/serial/arc_uart.c
|
||||
+++ b/drivers/tty/serial/arc_uart.c
|
||||
@@ -279,9 +279,9 @@ static irqreturn_t arc_serial_isr(int irq, void *dev_id)
|
||||
if (status & RXIENB) {
|
||||
|
||||
/* already in ISR, no need of xx_irqsave */
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
arc_serial_rx_chars(port, status);
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
}
|
||||
|
||||
if ((status & TXIENB) && (status & TXEMPTY)) {
|
||||
@@ -291,12 +291,12 @@ static irqreturn_t arc_serial_isr(int irq, void *dev_id)
|
||||
*/
|
||||
UART_TX_IRQ_DISABLE(port);
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
if (!uart_tx_stopped(port))
|
||||
arc_serial_tx_chars(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -366,7 +366,7 @@ arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
uartl = hw_val & 0xFF;
|
||||
uarth = (hw_val >> 8) & 0xFF;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
UART_ALL_IRQ_DISABLE(port);
|
||||
|
||||
@@ -391,7 +391,7 @@ arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *arc_serial_type(struct uart_port *port)
|
||||
@@ -521,9 +521,9 @@ static void arc_serial_console_write(struct console *co, const char *s,
|
||||
struct uart_port *port = &arc_uart_ports[co->index].port;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
uart_console_write(port, s, count, arc_serial_console_putchar);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static struct console arc_console = {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,124 +0,0 @@
|
||||
From 325c2f842f06aba6dae0545aa1ab36105ef14ebe Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:38 +0206
|
||||
Subject: [PATCH 047/198] serial: atmel: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-22-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/atmel_serial.c | 24 ++++++++++++------------
|
||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
|
||||
index 88cdafa5ac54..1946fafc3f3e 100644
|
||||
--- a/drivers/tty/serial/atmel_serial.c
|
||||
+++ b/drivers/tty/serial/atmel_serial.c
|
||||
@@ -861,7 +861,7 @@ static void atmel_complete_tx_dma(void *arg)
|
||||
struct dma_chan *chan = atmel_port->chan_tx;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (chan)
|
||||
dmaengine_terminate_all(chan);
|
||||
@@ -893,7 +893,7 @@ static void atmel_complete_tx_dma(void *arg)
|
||||
atmel_port->tx_done_mask);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void atmel_release_tx_dma(struct uart_port *port)
|
||||
@@ -1711,9 +1711,9 @@ static void atmel_tasklet_rx_func(struct tasklet_struct *t)
|
||||
struct uart_port *port = &atmel_port->uart;
|
||||
|
||||
/* The interrupt handler does not take the lock */
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
atmel_port->schedule_rx(port);
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
}
|
||||
|
||||
static void atmel_tasklet_tx_func(struct tasklet_struct *t)
|
||||
@@ -1723,9 +1723,9 @@ static void atmel_tasklet_tx_func(struct tasklet_struct *t)
|
||||
struct uart_port *port = &atmel_port->uart;
|
||||
|
||||
/* The interrupt handler does not take the lock */
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
atmel_port->schedule_tx(port);
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
}
|
||||
|
||||
static void atmel_init_property(struct atmel_uart_port *atmel_port,
|
||||
@@ -2175,7 +2175,7 @@ static void atmel_set_termios(struct uart_port *port,
|
||||
} else
|
||||
mode |= ATMEL_US_PAR_NONE;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = ATMEL_US_OVRE;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2377,22 +2377,22 @@ static void atmel_set_termios(struct uart_port *port,
|
||||
else
|
||||
atmel_disable_ms(port);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void atmel_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
atmel_enable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
atmel_disable_ms(port);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,133 +0,0 @@
|
||||
From d2f045ac943207d02e3cb9bd374f3c5d35c13c15 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:39 +0206
|
||||
Subject: [PATCH 048/198] serial: bcm63xx-uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-23-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/bcm63xx_uart.c | 22 +++++++++++-----------
|
||||
1 file changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c
|
||||
index 44c27e5cefbc..b104c36ce5c0 100644
|
||||
--- a/drivers/tty/serial/bcm63xx_uart.c
|
||||
+++ b/drivers/tty/serial/bcm63xx_uart.c
|
||||
@@ -201,7 +201,7 @@ static void bcm_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = bcm_uart_readl(port, UART_CTL_REG);
|
||||
if (ctl)
|
||||
@@ -210,7 +210,7 @@ static void bcm_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
val &= ~UART_CTL_XMITBRK_MASK;
|
||||
bcm_uart_writel(port, val, UART_CTL_REG);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -335,7 +335,7 @@ static irqreturn_t bcm_uart_interrupt(int irq, void *dev_id)
|
||||
unsigned int irqstat;
|
||||
|
||||
port = dev_id;
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
irqstat = bcm_uart_readl(port, UART_IR_REG);
|
||||
if (irqstat & UART_RX_INT_STAT)
|
||||
@@ -356,7 +356,7 @@ static irqreturn_t bcm_uart_interrupt(int irq, void *dev_id)
|
||||
estat & UART_EXTINP_DCD_MASK);
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -454,9 +454,9 @@ static void bcm_uart_shutdown(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
bcm_uart_writel(port, 0, UART_IR_REG);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
bcm_uart_disable(port);
|
||||
bcm_uart_flush(port);
|
||||
@@ -473,7 +473,7 @@ static void bcm_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
unsigned long flags;
|
||||
int tries;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Drain the hot tub fully before we power it off for the winter. */
|
||||
for (tries = 3; !bcm_uart_tx_empty(port) && tries; tries--)
|
||||
@@ -549,7 +549,7 @@ static void bcm_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
bcm_uart_enable(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -715,9 +715,9 @@ static void bcm_console_write(struct console *co, const char *s,
|
||||
/* bcm_uart_interrupt() already took the lock */
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
- locked = spin_trylock(&port->lock);
|
||||
+ locked = uart_port_trylock(port);
|
||||
} else {
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -728,7 +728,7 @@ static void bcm_console_write(struct console *co, const char *s,
|
||||
wait_for_xmitr(port);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,75 +0,0 @@
|
||||
From d589f5c720e72cb067f0d9d09f1acbd6b6e9f6aa Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:40 +0206
|
||||
Subject: [PATCH 049/198] serial: cpm_uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-24-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/cpm_uart.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/cpm_uart.c b/drivers/tty/serial/cpm_uart.c
|
||||
index 626423022d62..be4af6eda4c2 100644
|
||||
--- a/drivers/tty/serial/cpm_uart.c
|
||||
+++ b/drivers/tty/serial/cpm_uart.c
|
||||
@@ -569,7 +569,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
if ((termios->c_cflag & CREAD) == 0)
|
||||
port->read_status_mask &= ~BD_SC_EMPTY;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (IS_SMC(pinfo)) {
|
||||
unsigned int bits = tty_get_frame_size(termios->c_cflag);
|
||||
@@ -609,7 +609,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
clk_set_rate(pinfo->clk, baud);
|
||||
else
|
||||
cpm_setbrg(pinfo->brg - 1, baud);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *cpm_uart_type(struct uart_port *port)
|
||||
@@ -1386,9 +1386,9 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
- spin_lock_irqsave(&pinfo->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&pinfo->port, &flags);
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
- spin_unlock_irqrestore(&pinfo->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&pinfo->port, flags);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,118 +0,0 @@
|
||||
From 849f46281c4b845ae40e39ef82ec0fa3a6ac729d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:41 +0206
|
||||
Subject: [PATCH 050/198] serial: digicolor: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Baruch Siach <baruch@tkos.co.il>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-25-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/digicolor-usart.c | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/digicolor-usart.c b/drivers/tty/serial/digicolor-usart.c
|
||||
index 128b5479e813..5004125f3045 100644
|
||||
--- a/drivers/tty/serial/digicolor-usart.c
|
||||
+++ b/drivers/tty/serial/digicolor-usart.c
|
||||
@@ -133,7 +133,7 @@ static void digicolor_uart_rx(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
while (1) {
|
||||
u8 status, ch, ch_flag;
|
||||
@@ -172,7 +172,7 @@ static void digicolor_uart_rx(struct uart_port *port)
|
||||
ch_flag);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
tty_flip_buffer_push(&port->state->port);
|
||||
}
|
||||
@@ -185,7 +185,7 @@ static void digicolor_uart_tx(struct uart_port *port)
|
||||
if (digicolor_uart_tx_full(port))
|
||||
return;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (port->x_char) {
|
||||
writeb_relaxed(port->x_char, port->membase + UA_EMI_REC);
|
||||
@@ -211,7 +211,7 @@ static void digicolor_uart_tx(struct uart_port *port)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
out:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static irqreturn_t digicolor_uart_int(int irq, void *dev_id)
|
||||
@@ -333,7 +333,7 @@ static void digicolor_uart_set_termios(struct uart_port *port,
|
||||
port->ignore_status_mask |= UA_STATUS_OVERRUN_ERR
|
||||
| UA_STATUS_PARITY_ERR | UA_STATUS_FRAME_ERR;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
@@ -341,7 +341,7 @@ static void digicolor_uart_set_termios(struct uart_port *port,
|
||||
writeb_relaxed(divisor & 0xff, port->membase + UA_HBAUD_LO);
|
||||
writeb_relaxed(divisor >> 8, port->membase + UA_HBAUD_HI);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *digicolor_uart_type(struct uart_port *port)
|
||||
@@ -398,14 +398,14 @@ static void digicolor_uart_console_write(struct console *co, const char *c,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_console_write(port, c, n, digicolor_uart_console_putchar);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Wait for transmitter to become empty */
|
||||
do {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,166 +0,0 @@
|
||||
From cf56a8cb4d23d06dc03a323a09d0ce29cf806ee9 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:42 +0206
|
||||
Subject: [PATCH 051/198] serial: dz: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-26-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/dz.c | 32 ++++++++++++++++----------------
|
||||
1 file changed, 16 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/dz.c b/drivers/tty/serial/dz.c
|
||||
index 667f52e83277..6df7af9edc1c 100644
|
||||
--- a/drivers/tty/serial/dz.c
|
||||
+++ b/drivers/tty/serial/dz.c
|
||||
@@ -268,9 +268,9 @@ static inline void dz_transmit_chars(struct dz_mux *mux)
|
||||
}
|
||||
/* If nothing to do or stopped or hardware stopped. */
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) {
|
||||
- spin_lock(&dport->port.lock);
|
||||
+ uart_port_lock(&dport->port);
|
||||
dz_stop_tx(&dport->port);
|
||||
- spin_unlock(&dport->port.lock);
|
||||
+ uart_port_unlock(&dport->port);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -287,9 +287,9 @@ static inline void dz_transmit_chars(struct dz_mux *mux)
|
||||
|
||||
/* Are we are done. */
|
||||
if (uart_circ_empty(xmit)) {
|
||||
- spin_lock(&dport->port.lock);
|
||||
+ uart_port_lock(&dport->port);
|
||||
dz_stop_tx(&dport->port);
|
||||
- spin_unlock(&dport->port.lock);
|
||||
+ uart_port_unlock(&dport->port);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,14 +415,14 @@ static int dz_startup(struct uart_port *uport)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&dport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&dport->port, &flags);
|
||||
|
||||
/* Enable interrupts. */
|
||||
tmp = dz_in(dport, DZ_CSR);
|
||||
tmp |= DZ_RIE | DZ_TIE;
|
||||
dz_out(dport, DZ_CSR, tmp);
|
||||
|
||||
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -443,9 +443,9 @@ static void dz_shutdown(struct uart_port *uport)
|
||||
int irq_guard;
|
||||
u16 tmp;
|
||||
|
||||
- spin_lock_irqsave(&dport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&dport->port, &flags);
|
||||
dz_stop_tx(&dport->port);
|
||||
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
||||
|
||||
irq_guard = atomic_add_return(-1, &mux->irq_guard);
|
||||
if (!irq_guard) {
|
||||
@@ -491,14 +491,14 @@ static void dz_break_ctl(struct uart_port *uport, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned short tmp, mask = 1 << dport->port.line;
|
||||
|
||||
- spin_lock_irqsave(&uport->lock, flags);
|
||||
+ uart_port_lock_irqsave(uport, &flags);
|
||||
tmp = dz_in(dport, DZ_TCR);
|
||||
if (break_state)
|
||||
tmp |= mask;
|
||||
else
|
||||
tmp &= ~mask;
|
||||
dz_out(dport, DZ_TCR, tmp);
|
||||
- spin_unlock_irqrestore(&uport->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(uport, flags);
|
||||
}
|
||||
|
||||
static int dz_encode_baud_rate(unsigned int baud)
|
||||
@@ -608,7 +608,7 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
if (termios->c_cflag & CREAD)
|
||||
cflag |= DZ_RXENAB;
|
||||
|
||||
- spin_lock_irqsave(&dport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&dport->port, &flags);
|
||||
|
||||
uart_update_timeout(uport, termios->c_cflag, baud);
|
||||
|
||||
@@ -631,7 +631,7 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
if (termios->c_iflag & IGNBRK)
|
||||
dport->port.ignore_status_mask |= DZ_BREAK;
|
||||
|
||||
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -645,12 +645,12 @@ static void dz_pm(struct uart_port *uport, unsigned int state,
|
||||
struct dz_port *dport = to_dport(uport);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&dport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&dport->port, &flags);
|
||||
if (state < 3)
|
||||
dz_start_tx(&dport->port);
|
||||
else
|
||||
dz_stop_tx(&dport->port);
|
||||
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -811,7 +811,7 @@ static void dz_console_putchar(struct uart_port *uport, unsigned char ch)
|
||||
unsigned short csr, tcr, trdy, mask;
|
||||
int loops = 10000;
|
||||
|
||||
- spin_lock_irqsave(&dport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&dport->port, &flags);
|
||||
csr = dz_in(dport, DZ_CSR);
|
||||
dz_out(dport, DZ_CSR, csr & ~DZ_TIE);
|
||||
tcr = dz_in(dport, DZ_TCR);
|
||||
@@ -819,7 +819,7 @@ static void dz_console_putchar(struct uart_port *uport, unsigned char ch)
|
||||
mask = tcr;
|
||||
dz_out(dport, DZ_TCR, mask);
|
||||
iob();
|
||||
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
||||
|
||||
do {
|
||||
trdy = dz_in(dport, DZ_CSR);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,148 +0,0 @@
|
||||
From f9ed3526fbe17a03c3c9a551b1fdb89743033881 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:43 +0206
|
||||
Subject: [PATCH 052/198] serial: linflexuart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-27-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/fsl_linflexuart.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/fsl_linflexuart.c b/drivers/tty/serial/fsl_linflexuart.c
|
||||
index 249cb380c3c6..7fa809a405e8 100644
|
||||
--- a/drivers/tty/serial/fsl_linflexuart.c
|
||||
+++ b/drivers/tty/serial/fsl_linflexuart.c
|
||||
@@ -203,7 +203,7 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
|
||||
struct circ_buf *xmit = &sport->state->xmit;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->lock, flags);
|
||||
+ uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
if (sport->x_char) {
|
||||
linflex_put_char(sport, sport->x_char);
|
||||
@@ -217,7 +217,7 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
|
||||
|
||||
linflex_transmit_buffer(sport);
|
||||
out:
|
||||
- spin_unlock_irqrestore(&sport->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(sport, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||
unsigned char rx;
|
||||
bool brk;
|
||||
|
||||
- spin_lock_irqsave(&sport->lock, flags);
|
||||
+ uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
status = readl(sport->membase + UARTSR);
|
||||
while (status & LINFLEXD_UARTSR_RMB) {
|
||||
@@ -266,7 +266,7 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||
}
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&sport->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(sport, flags);
|
||||
|
||||
tty_flip_buffer_push(port);
|
||||
|
||||
@@ -369,11 +369,11 @@ static int linflex_startup(struct uart_port *port)
|
||||
int ret = 0;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
linflex_setup_watermark(port);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = devm_request_irq(port->dev, port->irq, linflex_int, 0,
|
||||
DRIVER_NAME, port);
|
||||
@@ -386,14 +386,14 @@ static void linflex_shutdown(struct uart_port *port)
|
||||
unsigned long ier;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable interrupts */
|
||||
ier = readl(port->membase + LINIER);
|
||||
ier &= ~(LINFLEXD_LINIER_DRIE | LINFLEXD_LINIER_DTIE);
|
||||
writel(ier, port->membase + LINIER);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
devm_free_irq(port->dev, port->irq, port);
|
||||
}
|
||||
@@ -474,7 +474,7 @@ linflex_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
cr &= ~LINFLEXD_UARTCR_PCE;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = 0;
|
||||
|
||||
@@ -507,7 +507,7 @@ linflex_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
writel(cr1, port->membase + LINCR1);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *linflex_type(struct uart_port *port)
|
||||
@@ -646,14 +646,14 @@ linflex_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (sport->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&sport->lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(sport, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&sport->lock, flags);
|
||||
+ uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
linflex_string_write(sport, s, count);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&sport->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(sport, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,394 +0,0 @@
|
||||
From ad1a88864ae88125ba21aee17d8cf3352afec096 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:44 +0206
|
||||
Subject: [PATCH 053/198] serial: fsl_lpuart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-28-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/fsl_lpuart.c | 88 ++++++++++++++++-----------------
|
||||
1 file changed, 44 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
|
||||
index 385b41275e8b..71d0cbd74807 100644
|
||||
--- a/drivers/tty/serial/fsl_lpuart.c
|
||||
+++ b/drivers/tty/serial/fsl_lpuart.c
|
||||
@@ -532,9 +532,9 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
struct dma_chan *chan = sport->dma_tx_chan;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (!sport->dma_tx_in_progress) {
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -543,7 +543,7 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
|
||||
uart_xmit_advance(&sport->port, sport->dma_tx_bytes);
|
||||
sport->dma_tx_in_progress = false;
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(&sport->port);
|
||||
@@ -553,12 +553,12 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
return;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
if (!lpuart_stopped_or_empty(&sport->port))
|
||||
lpuart_dma_tx(sport);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static dma_addr_t lpuart_dma_datareg_addr(struct lpuart_port *sport)
|
||||
@@ -651,7 +651,7 @@ static int lpuart_poll_init(struct uart_port *port)
|
||||
|
||||
sport->port.fifosize = 0;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
/* Disable Rx & Tx */
|
||||
writeb(0, sport->port.membase + UARTCR2);
|
||||
|
||||
@@ -675,7 +675,7 @@ static int lpuart_poll_init(struct uart_port *port)
|
||||
|
||||
/* Enable Rx and Tx */
|
||||
writeb(UARTCR2_RE | UARTCR2_TE, sport->port.membase + UARTCR2);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -703,7 +703,7 @@ static int lpuart32_poll_init(struct uart_port *port)
|
||||
|
||||
sport->port.fifosize = 0;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* Disable Rx & Tx */
|
||||
lpuart32_write(&sport->port, 0, UARTCTRL);
|
||||
@@ -724,7 +724,7 @@ static int lpuart32_poll_init(struct uart_port *port)
|
||||
|
||||
/* Enable Rx and Tx */
|
||||
lpuart32_write(&sport->port, UARTCTRL_RE | UARTCTRL_TE, UARTCTRL);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -879,9 +879,9 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
|
||||
|
||||
static void lpuart_txint(struct lpuart_port *sport)
|
||||
{
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
lpuart_transmit_buffer(sport);
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
}
|
||||
|
||||
static void lpuart_rxint(struct lpuart_port *sport)
|
||||
@@ -890,7 +890,7 @@ static void lpuart_rxint(struct lpuart_port *sport)
|
||||
struct tty_port *port = &sport->port.state->port;
|
||||
unsigned char rx, sr;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
|
||||
while (!(readb(sport->port.membase + UARTSFIFO) & UARTSFIFO_RXEMPT)) {
|
||||
flg = TTY_NORMAL;
|
||||
@@ -956,9 +956,9 @@ static void lpuart_rxint(struct lpuart_port *sport)
|
||||
|
||||
static void lpuart32_txint(struct lpuart_port *sport)
|
||||
{
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
lpuart32_transmit_buffer(sport);
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
}
|
||||
|
||||
static void lpuart32_rxint(struct lpuart_port *sport)
|
||||
@@ -968,7 +968,7 @@ static void lpuart32_rxint(struct lpuart_port *sport)
|
||||
unsigned long rx, sr;
|
||||
bool is_break;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
|
||||
while (!(lpuart32_read(&sport->port, UARTFIFO) & UARTFIFO_RXEMPT)) {
|
||||
flg = TTY_NORMAL;
|
||||
@@ -1170,12 +1170,12 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport)
|
||||
|
||||
async_tx_ack(sport->dma_rx_desc);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state);
|
||||
if (dmastat == DMA_ERROR) {
|
||||
dev_err(sport->port.dev, "Rx DMA transfer failed!\n");
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1244,7 +1244,7 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport)
|
||||
dma_sync_sg_for_device(chan->device->dev, &sport->rx_sgl, 1,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
tty_flip_buffer_push(port);
|
||||
if (!sport->dma_idle_int)
|
||||
@@ -1335,9 +1335,9 @@ static void lpuart_timer_func(struct timer_list *t)
|
||||
mod_timer(&sport->lpuart_timer,
|
||||
jiffies + sport->dma_rx_timeout);
|
||||
|
||||
- if (spin_trylock_irqsave(&sport->port.lock, flags)) {
|
||||
+ if (uart_port_trylock_irqsave(&sport->port, &flags)) {
|
||||
sport->last_residue = state.residue;
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1802,14 +1802,14 @@ static void lpuart_hw_setup(struct lpuart_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
lpuart_setup_watermark_enable(sport);
|
||||
|
||||
lpuart_rx_dma_startup(sport);
|
||||
lpuart_tx_dma_startup(sport);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static int lpuart_startup(struct uart_port *port)
|
||||
@@ -1859,7 +1859,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
lpuart32_hw_disable(sport);
|
||||
|
||||
@@ -1869,7 +1869,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport)
|
||||
lpuart32_setup_watermark_enable(sport);
|
||||
lpuart32_configure(sport);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static int lpuart32_startup(struct uart_port *port)
|
||||
@@ -1932,7 +1932,7 @@ static void lpuart_shutdown(struct uart_port *port)
|
||||
unsigned char temp;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable Rx/Tx and interrupts */
|
||||
temp = readb(port->membase + UARTCR2);
|
||||
@@ -1940,7 +1940,7 @@ static void lpuart_shutdown(struct uart_port *port)
|
||||
UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
|
||||
writeb(temp, port->membase + UARTCR2);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
lpuart_dma_shutdown(sport);
|
||||
}
|
||||
@@ -1952,7 +1952,7 @@ static void lpuart32_shutdown(struct uart_port *port)
|
||||
unsigned long temp;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* clear status */
|
||||
temp = lpuart32_read(&sport->port, UARTSTAT);
|
||||
@@ -1969,7 +1969,7 @@ static void lpuart32_shutdown(struct uart_port *port)
|
||||
UARTCTRL_TIE | UARTCTRL_TCIE | UARTCTRL_RIE | UARTCTRL_SBK);
|
||||
lpuart32_write(port, temp, UARTCTRL);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
lpuart_dma_shutdown(sport);
|
||||
}
|
||||
@@ -2069,7 +2069,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (old && sport->lpuart_dma_rx_use)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
sport->port.read_status_mask = 0;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2124,7 +2124,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
sport->lpuart_dma_rx_use = false;
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void __lpuart32_serial_setbrg(struct uart_port *port,
|
||||
@@ -2304,7 +2304,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (old && sport->lpuart_dma_rx_use)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
sport->port.read_status_mask = 0;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2362,7 +2362,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
sport->lpuart_dma_rx_use = false;
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static const char *lpuart_type(struct uart_port *port)
|
||||
@@ -2480,9 +2480,9 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* first save CR2 and then disable interrupts */
|
||||
cr2 = old_cr2 = readb(sport->port.membase + UARTCR2);
|
||||
@@ -2498,7 +2498,7 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
writeb(old_cr2, sport->port.membase + UARTCR2);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2510,9 +2510,9 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count)
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* first save CR2 and then disable interrupts */
|
||||
cr = old_cr = lpuart32_read(&sport->port, UARTCTRL);
|
||||
@@ -2528,7 +2528,7 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count)
|
||||
lpuart32_write(&sport->port, old_cr, UARTCTRL);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3092,7 +3092,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
uart_suspend_port(&lpuart_reg, &sport->port);
|
||||
|
||||
if (lpuart_uport_is_active(sport)) {
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
/* disable Rx/Tx and interrupts */
|
||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||
@@ -3104,7 +3104,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
temp &= ~(UARTCR2_TE | UARTCR2_TIE | UARTCR2_TCIE);
|
||||
writeb(temp, sport->port.membase + UARTCR2);
|
||||
}
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
if (sport->lpuart_dma_rx_use) {
|
||||
/*
|
||||
@@ -3117,7 +3117,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
/* Disable Rx DMA to use UART port as wakeup source */
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
temp = lpuart32_read(&sport->port, UARTBAUD);
|
||||
lpuart32_write(&sport->port, temp & ~UARTBAUD_RDMAE,
|
||||
@@ -3126,11 +3126,11 @@ static int lpuart_suspend(struct device *dev)
|
||||
writeb(readb(sport->port.membase + UARTCR5) &
|
||||
~UARTCR5_RDMAS, sport->port.membase + UARTCR5);
|
||||
}
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
if (sport->lpuart_dma_tx_use) {
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
temp = lpuart32_read(&sport->port, UARTBAUD);
|
||||
temp &= ~UARTBAUD_TDMAE;
|
||||
@@ -3140,7 +3140,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
temp &= ~UARTCR5_TDMAS;
|
||||
writeb(temp, sport->port.membase + UARTCR5);
|
||||
}
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
sport->dma_tx_in_progress = false;
|
||||
dmaengine_terminate_sync(sport->dma_tx_chan);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,156 +0,0 @@
|
||||
From 23d144bb0f021b6b20003b42bb1dfdcd301cf755 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:45 +0206
|
||||
Subject: [PATCH 054/198] serial: icom: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-29-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/icom.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/icom.c b/drivers/tty/serial/icom.c
|
||||
index 819f957b6b84..a75eafbcbea3 100644
|
||||
--- a/drivers/tty/serial/icom.c
|
||||
+++ b/drivers/tty/serial/icom.c
|
||||
@@ -929,7 +929,7 @@ static inline void check_modem_status(struct icom_port *icom_port)
|
||||
char delta_status;
|
||||
unsigned char status;
|
||||
|
||||
- spin_lock(&icom_port->uart_port.lock);
|
||||
+ uart_port_lock(&icom_port->uart_port);
|
||||
|
||||
/*modem input register */
|
||||
status = readb(&icom_port->dram->isr);
|
||||
@@ -951,7 +951,7 @@ static inline void check_modem_status(struct icom_port *icom_port)
|
||||
port.delta_msr_wait);
|
||||
old_status = status;
|
||||
}
|
||||
- spin_unlock(&icom_port->uart_port.lock);
|
||||
+ uart_port_unlock(&icom_port->uart_port);
|
||||
}
|
||||
|
||||
static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
|
||||
@@ -1093,7 +1093,7 @@ static void process_interrupt(u16 port_int_reg,
|
||||
struct icom_port *icom_port)
|
||||
{
|
||||
|
||||
- spin_lock(&icom_port->uart_port.lock);
|
||||
+ uart_port_lock(&icom_port->uart_port);
|
||||
trace(icom_port, "INTERRUPT", port_int_reg);
|
||||
|
||||
if (port_int_reg & (INT_XMIT_COMPLETED | INT_XMIT_DISABLED))
|
||||
@@ -1102,7 +1102,7 @@ static void process_interrupt(u16 port_int_reg,
|
||||
if (port_int_reg & INT_RCV_COMPLETED)
|
||||
recv_interrupt(port_int_reg, icom_port);
|
||||
|
||||
- spin_unlock(&icom_port->uart_port.lock);
|
||||
+ uart_port_unlock(&icom_port->uart_port);
|
||||
}
|
||||
|
||||
static irqreturn_t icom_interrupt(int irq, void *dev_id)
|
||||
@@ -1186,14 +1186,14 @@ static unsigned int icom_tx_empty(struct uart_port *port)
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
|
||||
SA_FLAGS_READY_TO_XMIT)
|
||||
ret = TIOCSER_TEMT;
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1276,7 +1276,7 @@ static void icom_send_xchar(struct uart_port *port, char ch)
|
||||
|
||||
/* wait .1 sec to send char */
|
||||
for (index = 0; index < 10; index++) {
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
xdata = readb(&icom_port->dram->xchar);
|
||||
if (xdata == 0x00) {
|
||||
trace(icom_port, "QUICK_WRITE", 0);
|
||||
@@ -1284,10 +1284,10 @@ static void icom_send_xchar(struct uart_port *port, char ch)
|
||||
|
||||
/* flush write operation */
|
||||
xdata = readb(&icom_port->dram->xchar);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
break;
|
||||
}
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
@@ -1307,7 +1307,7 @@ static void icom_break(struct uart_port *port, int break_state)
|
||||
unsigned char cmdReg;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
trace(icom_port, "BREAK", 0);
|
||||
cmdReg = readb(&icom_port->dram->CmdReg);
|
||||
if (break_state == -1) {
|
||||
@@ -1315,7 +1315,7 @@ static void icom_break(struct uart_port *port, int break_state)
|
||||
} else {
|
||||
writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
|
||||
}
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int icom_open(struct uart_port *port)
|
||||
@@ -1365,7 +1365,7 @@ static void icom_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned long offset;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
trace(icom_port, "CHANGE_SPEED", 0);
|
||||
|
||||
cflag = termios->c_cflag;
|
||||
@@ -1516,7 +1516,7 @@ static void icom_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
trace(icom_port, "XR_ENAB", 0);
|
||||
writeb(CMD_XMIT_RCV_ENABLE, &icom_port->dram->CmdReg);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *icom_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,359 +0,0 @@
|
||||
From 9b77283262bf5440db5c5730b730a1b949574684 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:46 +0206
|
||||
Subject: [PATCH 055/198] serial: imx: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-30-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/imx.c | 84 ++++++++++++++++++++--------------------
|
||||
1 file changed, 42 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
|
||||
index a5d0df2ba5c5..267c9af4bd53 100644
|
||||
--- a/drivers/tty/serial/imx.c
|
||||
+++ b/drivers/tty/serial/imx.c
|
||||
@@ -586,7 +586,7 @@ static void imx_uart_dma_tx_callback(void *data)
|
||||
unsigned long flags;
|
||||
u32 ucr1;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
dma_unmap_sg(sport->port.dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
|
||||
|
||||
@@ -611,7 +611,7 @@ static void imx_uart_dma_tx_callback(void *data)
|
||||
imx_uart_writel(sport, ucr4, UCR4);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/* called with port.lock taken and irqs off */
|
||||
@@ -782,11 +782,11 @@ static irqreturn_t imx_uart_rtsint(int irq, void *dev_id)
|
||||
struct imx_port *sport = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
|
||||
ret = __imx_uart_rtsint(irq, dev_id);
|
||||
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -795,9 +795,9 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id)
|
||||
{
|
||||
struct imx_port *sport = dev_id;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
imx_uart_transmit_buffer(sport);
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -911,11 +911,11 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id)
|
||||
struct imx_port *sport = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
|
||||
ret = __imx_uart_rxint(irq, dev_id);
|
||||
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -978,7 +978,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
||||
unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
|
||||
usr1 = imx_uart_readl(sport, USR1);
|
||||
usr2 = imx_uart_readl(sport, USR2);
|
||||
@@ -1048,7 +1048,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1131,7 +1131,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
u32 ucr1;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
ucr1 = imx_uart_readl(sport, UCR1) & ~UCR1_SNDBRK;
|
||||
|
||||
@@ -1140,7 +1140,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1153,9 +1153,9 @@ static void imx_uart_timeout(struct timer_list *t)
|
||||
unsigned long flags;
|
||||
|
||||
if (sport->port.state) {
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
imx_uart_mctrl_check(sport);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
mod_timer(&sport->timer, jiffies + MCTRL_TIMEOUT);
|
||||
}
|
||||
@@ -1185,9 +1185,9 @@ static void imx_uart_dma_rx_callback(void *data)
|
||||
status = dmaengine_tx_status(chan, sport->rx_cookie, &state);
|
||||
|
||||
if (status == DMA_ERROR) {
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
imx_uart_clear_rx_errors(sport);
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1216,9 +1216,9 @@ static void imx_uart_dma_rx_callback(void *data)
|
||||
r_bytes = rx_ring->head - rx_ring->tail;
|
||||
|
||||
/* If we received something, check for 0xff flood */
|
||||
- spin_lock(&sport->port.lock);
|
||||
+ uart_port_lock(&sport->port);
|
||||
imx_uart_check_flood(sport, imx_uart_readl(sport, USR2));
|
||||
- spin_unlock(&sport->port.lock);
|
||||
+ uart_port_unlock(&sport->port);
|
||||
|
||||
if (!(sport->port.ignore_status_mask & URXD_DUMMY_READ)) {
|
||||
|
||||
@@ -1476,7 +1476,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
if (!uart_console(port) && imx_uart_dma_init(sport) == 0)
|
||||
dma_is_inited = 1;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* Reset fifo's and state machines */
|
||||
imx_uart_soft_reset(sport);
|
||||
@@ -1549,7 +1549,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
|
||||
imx_uart_disable_loopback_rs485(sport);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1574,21 +1574,21 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
sport->dma_is_rxing = 0;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
imx_uart_stop_tx(port);
|
||||
imx_uart_stop_rx(port);
|
||||
imx_uart_disable_dma(sport);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
imx_uart_dma_exit(sport);
|
||||
}
|
||||
|
||||
mctrl_gpio_disable_ms(sport->gpios);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
ucr2 = imx_uart_readl(sport, UCR2);
|
||||
ucr2 &= ~(UCR2_TXEN | UCR2_ATEN);
|
||||
imx_uart_writel(sport, ucr2, UCR2);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
/*
|
||||
* Stop our timer.
|
||||
@@ -1599,7 +1599,7 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
* Disable all interrupts, port and break condition.
|
||||
*/
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~(UCR1_TRDYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_RXDMAEN |
|
||||
@@ -1621,7 +1621,7 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
ucr4 &= ~UCR4_TCEN;
|
||||
imx_uart_writel(sport, ucr4, UCR4);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
clk_disable_unprepare(sport->clk_per);
|
||||
clk_disable_unprepare(sport->clk_ipg);
|
||||
@@ -1684,7 +1684,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16);
|
||||
quot = uart_get_divisor(port, baud);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* Read current UCR2 and save it for future use, then clear all the bits
|
||||
@@ -1812,7 +1812,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (UART_ENABLE_MS(&sport->port, termios->c_cflag))
|
||||
imx_uart_enable_ms(&sport->port);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static const char *imx_uart_type(struct uart_port *port)
|
||||
@@ -1874,7 +1874,7 @@ static int imx_uart_poll_init(struct uart_port *port)
|
||||
|
||||
imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT);
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* Be careful about the order of enabling bits here. First enable the
|
||||
@@ -1902,7 +1902,7 @@ static int imx_uart_poll_init(struct uart_port *port)
|
||||
imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1);
|
||||
imx_uart_writel(sport, ucr2 | UCR2_ATEN, UCR2);
|
||||
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2022,9 +2022,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (sport->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* First, save UCR1/2/3 and then disable interrupts
|
||||
@@ -2052,7 +2052,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
imx_uart_ucrs_restore(sport, &old_ucr);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2210,10 +2210,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t)
|
||||
struct imx_port *sport = container_of(t, struct imx_port, trigger_start_tx);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (sport->tx_state == WAIT_AFTER_RTS)
|
||||
imx_uart_start_tx(&sport->port);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -2223,10 +2223,10 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t)
|
||||
struct imx_port *sport = container_of(t, struct imx_port, trigger_stop_tx);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (sport->tx_state == WAIT_AFTER_SEND)
|
||||
imx_uart_stop_tx(&sport->port);
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -2493,9 +2493,9 @@ static void imx_uart_restore_context(struct imx_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (!sport->context_saved) {
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2510,7 +2510,7 @@ static void imx_uart_restore_context(struct imx_port *sport)
|
||||
imx_uart_writel(sport, sport->saved_reg[2], UCR3);
|
||||
imx_uart_writel(sport, sport->saved_reg[3], UCR4);
|
||||
sport->context_saved = false;
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void imx_uart_save_context(struct imx_port *sport)
|
||||
@@ -2518,7 +2518,7 @@ static void imx_uart_save_context(struct imx_port *sport)
|
||||
unsigned long flags;
|
||||
|
||||
/* Save necessary regs */
|
||||
- spin_lock_irqsave(&sport->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&sport->port, &flags);
|
||||
sport->saved_reg[0] = imx_uart_readl(sport, UCR1);
|
||||
sport->saved_reg[1] = imx_uart_readl(sport, UCR2);
|
||||
sport->saved_reg[2] = imx_uart_readl(sport, UCR3);
|
||||
@@ -2530,7 +2530,7 @@ static void imx_uart_save_context(struct imx_port *sport)
|
||||
sport->saved_reg[8] = imx_uart_readl(sport, UBMR);
|
||||
sport->saved_reg[9] = imx_uart_readl(sport, IMX21_UTS);
|
||||
sport->context_saved = true;
|
||||
- spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void imx_uart_enable_wakeup(struct imx_port *sport, bool on)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,190 +0,0 @@
|
||||
From 5081d781475382d4544b5f92b14f1756a98caca8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:47 +0206
|
||||
Subject: [PATCH 056/198] serial: ip22zilog: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-31-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/ip22zilog.c | 36 +++++++++++++++++-----------------
|
||||
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/ip22zilog.c b/drivers/tty/serial/ip22zilog.c
|
||||
index 845ff706bc59..320b29cd4683 100644
|
||||
--- a/drivers/tty/serial/ip22zilog.c
|
||||
+++ b/drivers/tty/serial/ip22zilog.c
|
||||
@@ -432,7 +432,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
unsigned char r3;
|
||||
bool push = false;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
r3 = read_zsreg(channel, R3);
|
||||
|
||||
/* Channel A */
|
||||
@@ -448,7 +448,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHATxIP)
|
||||
ip22zilog_transmit_chars(up, channel);
|
||||
}
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
if (push)
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
@@ -458,7 +458,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
|
||||
push = false;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
writeb(RES_H_IUS, &channel->control);
|
||||
ZSDELAY();
|
||||
@@ -471,7 +471,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHBTxIP)
|
||||
ip22zilog_transmit_chars(up, channel);
|
||||
}
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
if (push)
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
@@ -504,11 +504,11 @@ static unsigned int ip22zilog_tx_empty(struct uart_port *port)
|
||||
unsigned char status;
|
||||
unsigned int ret;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = ip22zilog_read_channel_status(port);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (status & Tx_BUF_EMP)
|
||||
ret = TIOCSER_TEMT;
|
||||
@@ -664,7 +664,7 @@ static void ip22zilog_break_ctl(struct uart_port *port, int break_state)
|
||||
else
|
||||
clear_bits |= SND_BRK;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
new_reg = (up->curregs[R5] | set_bits) & ~clear_bits;
|
||||
if (new_reg != up->curregs[R5]) {
|
||||
@@ -674,7 +674,7 @@ static void ip22zilog_break_ctl(struct uart_port *port, int break_state)
|
||||
write_zsreg(channel, R5, up->curregs[R5]);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void __ip22zilog_reset(struct uart_ip22zilog_port *up)
|
||||
@@ -735,9 +735,9 @@ static int ip22zilog_startup(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
__ip22zilog_startup(up);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -775,7 +775,7 @@ static void ip22zilog_shutdown(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(port);
|
||||
|
||||
@@ -788,7 +788,7 @@ static void ip22zilog_shutdown(struct uart_port *port)
|
||||
up->curregs[R5] &= ~SND_BRK;
|
||||
ip22zilog_maybe_update_regs(up, channel);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Shared by TTY driver and serial console setup. The port lock is held
|
||||
@@ -880,7 +880,7 @@ ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 1200, 76800);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
|
||||
|
||||
@@ -894,7 +894,7 @@ ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
ip22zilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port));
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *ip22zilog_type(struct uart_port *port)
|
||||
@@ -1016,10 +1016,10 @@ ip22zilog_console_write(struct console *con, const char *s, unsigned int count)
|
||||
struct uart_ip22zilog_port *up = &ip22zilog_port_table[con->index];
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
uart_console_write(&up->port, s, count, ip22zilog_put_char);
|
||||
udelay(2);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init ip22zilog_console_setup(struct console *con, char *options)
|
||||
@@ -1034,13 +1034,13 @@ static int __init ip22zilog_console_setup(struct console *con, char *options)
|
||||
|
||||
printk(KERN_INFO "Console: ttyS%d (IP22-Zilog)\n", con->index);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->curregs[R15] |= BRKIE;
|
||||
|
||||
__ip22zilog_startup(up);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,131 +0,0 @@
|
||||
From b0dca7a41ff05f6b45e242b5c21f77d4898ae670 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:48 +0206
|
||||
Subject: [PATCH 057/198] serial: jsm: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-32-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/jsm/jsm_neo.c | 4 ++--
|
||||
drivers/tty/serial/jsm/jsm_tty.c | 16 ++++++++--------
|
||||
2 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/jsm/jsm_neo.c b/drivers/tty/serial/jsm/jsm_neo.c
|
||||
index 0c78f66276cd..2bd640428970 100644
|
||||
--- a/drivers/tty/serial/jsm/jsm_neo.c
|
||||
+++ b/drivers/tty/serial/jsm/jsm_neo.c
|
||||
@@ -816,9 +816,9 @@ static void neo_parse_isr(struct jsm_board *brd, u32 port)
|
||||
/* Parse any modem signal changes */
|
||||
jsm_dbg(INTR, &ch->ch_bd->pci_dev,
|
||||
"MOD_STAT: sending to parse_modem_sigs\n");
|
||||
- spin_lock_irqsave(&ch->uart_port.lock, lock_flags);
|
||||
+ uart_port_lock_irqsave(&ch->uart_port, &lock_flags);
|
||||
neo_parse_modem(ch, readb(&ch->ch_neo_uart->msr));
|
||||
- spin_unlock_irqrestore(&ch->uart_port.lock, lock_flags);
|
||||
+ uart_port_unlock_irqrestore(&ch->uart_port, lock_flags);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c
|
||||
index 222afc270c88..ce0fef7e2c66 100644
|
||||
--- a/drivers/tty/serial/jsm/jsm_tty.c
|
||||
+++ b/drivers/tty/serial/jsm/jsm_tty.c
|
||||
@@ -152,14 +152,14 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch)
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
struct ktermios *termios;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, lock_flags);
|
||||
+ uart_port_lock_irqsave(port, &lock_flags);
|
||||
termios = &port->state->port.tty->termios;
|
||||
if (ch == termios->c_cc[VSTART])
|
||||
channel->ch_bd->bd_ops->send_start_character(channel);
|
||||
|
||||
if (ch == termios->c_cc[VSTOP])
|
||||
channel->ch_bd->bd_ops->send_stop_character(channel);
|
||||
- spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
+ uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static void jsm_tty_stop_rx(struct uart_port *port)
|
||||
@@ -176,13 +176,13 @@ static void jsm_tty_break(struct uart_port *port, int break_state)
|
||||
struct jsm_channel *channel =
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, lock_flags);
|
||||
+ uart_port_lock_irqsave(port, &lock_flags);
|
||||
if (break_state == -1)
|
||||
channel->ch_bd->bd_ops->send_break(channel);
|
||||
else
|
||||
channel->ch_bd->bd_ops->clear_break(channel);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
+ uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static int jsm_tty_open(struct uart_port *port)
|
||||
@@ -241,7 +241,7 @@ static int jsm_tty_open(struct uart_port *port)
|
||||
channel->ch_cached_lsr = 0;
|
||||
channel->ch_stops_sent = 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, lock_flags);
|
||||
+ uart_port_lock_irqsave(port, &lock_flags);
|
||||
termios = &port->state->port.tty->termios;
|
||||
channel->ch_c_cflag = termios->c_cflag;
|
||||
channel->ch_c_iflag = termios->c_iflag;
|
||||
@@ -261,7 +261,7 @@ static int jsm_tty_open(struct uart_port *port)
|
||||
jsm_carrier(channel);
|
||||
|
||||
channel->ch_open_count++;
|
||||
- spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
+ uart_port_unlock_irqrestore(port, lock_flags);
|
||||
|
||||
jsm_dbg(OPEN, &channel->ch_bd->pci_dev, "finish\n");
|
||||
return 0;
|
||||
@@ -307,7 +307,7 @@ static void jsm_tty_set_termios(struct uart_port *port,
|
||||
struct jsm_channel *channel =
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, lock_flags);
|
||||
+ uart_port_lock_irqsave(port, &lock_flags);
|
||||
channel->ch_c_cflag = termios->c_cflag;
|
||||
channel->ch_c_iflag = termios->c_iflag;
|
||||
channel->ch_c_oflag = termios->c_oflag;
|
||||
@@ -317,7 +317,7 @@ static void jsm_tty_set_termios(struct uart_port *port,
|
||||
|
||||
channel->ch_bd->bd_ops->param(channel);
|
||||
jsm_carrier(channel);
|
||||
- spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
+ uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static const char *jsm_tty_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,115 +0,0 @@
|
||||
From 7b3c2ea3b2cce4ad46cbb8e27e6ba64a88f18874 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:49 +0206
|
||||
Subject: [PATCH 058/198] serial: liteuart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Gabriel Somlo <gsomlo@gmail.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-33-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/liteuart.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/liteuart.c b/drivers/tty/serial/liteuart.c
|
||||
index d881cdd2a58f..a25ab1efe38f 100644
|
||||
--- a/drivers/tty/serial/liteuart.c
|
||||
+++ b/drivers/tty/serial/liteuart.c
|
||||
@@ -139,13 +139,13 @@ static irqreturn_t liteuart_interrupt(int irq, void *data)
|
||||
* if polling, the context would be "in_serving_softirq", so use
|
||||
* irq[save|restore] spin_lock variants to cover all possibilities
|
||||
*/
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
isr = litex_read8(port->membase + OFF_EV_PENDING) & uart->irq_reg;
|
||||
if (isr & EV_RX)
|
||||
liteuart_rx_chars(port);
|
||||
if (isr & EV_TX)
|
||||
liteuart_tx_chars(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -195,10 +195,10 @@ static int liteuart_startup(struct uart_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
/* only enabling rx irqs during startup */
|
||||
liteuart_update_irq_reg(port, true, EV_RX);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (!port->irq) {
|
||||
timer_setup(&uart->timer, liteuart_timer, 0);
|
||||
@@ -213,9 +213,9 @@ static void liteuart_shutdown(struct uart_port *port)
|
||||
struct liteuart_port *uart = to_liteuart_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
liteuart_update_irq_reg(port, false, EV_RX | EV_TX);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irq)
|
||||
free_irq(port->irq, port);
|
||||
@@ -229,13 +229,13 @@ static void liteuart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
unsigned int baud;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* update baudrate */
|
||||
baud = uart_get_baud_rate(port, new, old, 0, 460800);
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *liteuart_type(struct uart_port *port)
|
||||
@@ -382,9 +382,9 @@ static void liteuart_console_write(struct console *co, const char *s,
|
||||
uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
|
||||
port = &uart->port;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
uart_console_write(port, s, count, liteuart_putchar);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int liteuart_console_setup(struct console *co, char *options)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,153 +0,0 @@
|
||||
From 237cdf22e2d45ba69c9c9732b50ea47a3c4117b8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:50 +0206
|
||||
Subject: [PATCH 059/198] serial: lpc32xx_hs: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-34-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/lpc32xx_hs.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c
|
||||
index b38fe4728c26..5149a947b7fe 100644
|
||||
--- a/drivers/tty/serial/lpc32xx_hs.c
|
||||
+++ b/drivers/tty/serial/lpc32xx_hs.c
|
||||
@@ -140,15 +140,15 @@ static void lpc32xx_hsuart_console_write(struct console *co, const char *s,
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar);
|
||||
wait_for_xmit_empty(&up->port);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -298,7 +298,7 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
||||
struct tty_port *tport = &port->state->port;
|
||||
u32 status;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
/* Read UART status and clear latched interrupts */
|
||||
status = readl(LPC32XX_HSUART_IIR(port->membase));
|
||||
@@ -333,7 +333,7 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
||||
__serial_lpc32xx_tx(port);
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -404,14 +404,14 @@ static void serial_lpc32xx_break_ctl(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
u32 tmp;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
|
||||
if (break_state != 0)
|
||||
tmp |= LPC32XX_HSU_BREAK;
|
||||
else
|
||||
tmp &= ~LPC32XX_HSU_BREAK;
|
||||
writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* port->lock is not held. */
|
||||
@@ -421,7 +421,7 @@ static int serial_lpc32xx_startup(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
u32 tmp;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
__serial_uart_flush(port);
|
||||
|
||||
@@ -441,7 +441,7 @@ static int serial_lpc32xx_startup(struct uart_port *port)
|
||||
|
||||
lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
retval = request_irq(port->irq, serial_lpc32xx_interrupt,
|
||||
0, MODNAME, port);
|
||||
@@ -458,7 +458,7 @@ static void serial_lpc32xx_shutdown(struct uart_port *port)
|
||||
u32 tmp;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
|
||||
LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
|
||||
@@ -466,7 +466,7 @@ static void serial_lpc32xx_shutdown(struct uart_port *port)
|
||||
|
||||
lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -491,7 +491,7 @@ static void serial_lpc32xx_set_termios(struct uart_port *port,
|
||||
|
||||
quot = __serial_get_clock_div(port->uartclk, baud);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Ignore characters? */
|
||||
tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
|
||||
@@ -505,7 +505,7 @@ static void serial_lpc32xx_set_termios(struct uart_port *port,
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Don't rewrite B0 */
|
||||
if (tty_termios_baud_rate(termios))
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,122 +0,0 @@
|
||||
From 5969916a10182049759b55eaa6854f0ae5fd6478 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:51 +0206
|
||||
Subject: [PATCH 060/198] serial: ma35d1: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-35-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/ma35d1_serial.c | 22 +++++++++++-----------
|
||||
1 file changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/ma35d1_serial.c b/drivers/tty/serial/ma35d1_serial.c
|
||||
index 99225f1e02ac..faccd772c68c 100644
|
||||
--- a/drivers/tty/serial/ma35d1_serial.c
|
||||
+++ b/drivers/tty/serial/ma35d1_serial.c
|
||||
@@ -269,16 +269,16 @@ static void receive_chars(struct uart_ma35d1_port *up)
|
||||
if (uart_handle_sysrq_char(&up->port, ch))
|
||||
continue;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
uart_insert_char(&up->port, fsr, MA35_FSR_RX_OVER_IF, ch, flag);
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
fsr = serial_in(up, MA35_FSR_REG);
|
||||
} while (!(fsr & MA35_FSR_RX_EMPTY) && (max_count-- > 0));
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
}
|
||||
|
||||
static irqreturn_t ma35d1serial_interrupt(int irq, void *dev_id)
|
||||
@@ -364,14 +364,14 @@ static void ma35d1serial_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
u32 lcr;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
lcr = serial_in(up, MA35_LCR_REG);
|
||||
if (break_state != 0)
|
||||
lcr |= MA35_LCR_BREAK;
|
||||
else
|
||||
lcr &= ~MA35_LCR_BREAK;
|
||||
serial_out(up, MA35_LCR_REG, lcr);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int ma35d1serial_startup(struct uart_port *port)
|
||||
@@ -441,7 +441,7 @@ static void ma35d1serial_set_termios(struct uart_port *port,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->port.read_status_mask = MA35_FSR_RX_OVER_IF;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -475,7 +475,7 @@ static void ma35d1serial_set_termios(struct uart_port *port,
|
||||
|
||||
serial_out(up, MA35_LCR_REG, lcr);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *ma35d1serial_type(struct uart_port *port)
|
||||
@@ -568,9 +568,9 @@ static void ma35d1serial_console_write(struct console *co, const char *s, u32 co
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -584,7 +584,7 @@ static void ma35d1serial_console_write(struct console *co, const char *s, u32 co
|
||||
serial_out(up, MA35_IER_REG, ier);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init ma35d1serial_console_setup(struct console *co, char *options)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,132 +0,0 @@
|
||||
From f3abad909d805624b6de91cbd4678e78dd7461d4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:52 +0206
|
||||
Subject: [PATCH 061/198] serial: mcf: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-36-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/mcf.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/mcf.c b/drivers/tty/serial/mcf.c
|
||||
index aea29b4e6567..ee40af20a08f 100644
|
||||
--- a/drivers/tty/serial/mcf.c
|
||||
+++ b/drivers/tty/serial/mcf.c
|
||||
@@ -135,12 +135,12 @@ static void mcf_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
writeb(MCFUART_UCR_CMDBREAKSTART, port->membase + MCFUART_UCR);
|
||||
else
|
||||
writeb(MCFUART_UCR_CMDBREAKSTOP, port->membase + MCFUART_UCR);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -150,7 +150,7 @@ static int mcf_startup(struct uart_port *port)
|
||||
struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Reset UART, get it into known state... */
|
||||
writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR);
|
||||
@@ -164,7 +164,7 @@ static int mcf_startup(struct uart_port *port)
|
||||
pp->imr = MCFUART_UIR_RXREADY;
|
||||
writeb(pp->imr, port->membase + MCFUART_UIMR);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -176,7 +176,7 @@ static void mcf_shutdown(struct uart_port *port)
|
||||
struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
pp->imr = 0;
|
||||
@@ -186,7 +186,7 @@ static void mcf_shutdown(struct uart_port *port)
|
||||
writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR);
|
||||
writeb(MCFUART_UCR_CMDRESETTX, port->membase + MCFUART_UCR);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -252,7 +252,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
mr2 |= MCFUART_MR2_TXCTS;
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (port->rs485.flags & SER_RS485_ENABLED) {
|
||||
dev_dbg(port->dev, "Setting UART to RS485\n");
|
||||
mr2 |= MCFUART_MR2_TXRTS;
|
||||
@@ -273,7 +273,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
port->membase + MCFUART_UCSR);
|
||||
writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE,
|
||||
port->membase + MCFUART_UCR);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -350,7 +350,7 @@ static irqreturn_t mcf_interrupt(int irq, void *data)
|
||||
|
||||
isr = readb(port->membase + MCFUART_UISR) & pp->imr;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
if (isr & MCFUART_UIR_RXREADY) {
|
||||
mcf_rx_chars(pp);
|
||||
ret = IRQ_HANDLED;
|
||||
@@ -359,7 +359,7 @@ static irqreturn_t mcf_interrupt(int irq, void *data)
|
||||
mcf_tx_chars(pp);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 05ed881ffad6d1a5ec2254008c58f1c2d3d19513 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:53 +0206
|
||||
Subject: [PATCH 062/198] serial: men_z135_uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-37-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/men_z135_uart.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/men_z135_uart.c b/drivers/tty/serial/men_z135_uart.c
|
||||
index d2502aaa3e8c..8048fa542fc4 100644
|
||||
--- a/drivers/tty/serial/men_z135_uart.c
|
||||
+++ b/drivers/tty/serial/men_z135_uart.c
|
||||
@@ -392,7 +392,7 @@ static irqreturn_t men_z135_intr(int irq, void *data)
|
||||
if (!irq_id)
|
||||
goto out;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
/* It's save to write to IIR[7:6] RXC[9:8] */
|
||||
iowrite8(irq_id, port->membase + MEN_Z135_STAT_REG);
|
||||
|
||||
@@ -418,7 +418,7 @@ static irqreturn_t men_z135_intr(int irq, void *data)
|
||||
handled = true;
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
out:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -708,7 +708,7 @@ static void men_z135_set_termios(struct uart_port *port,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, uart_freq / 16);
|
||||
|
||||
- spin_lock_irq(&port->lock);
|
||||
+ uart_port_lock_irq(port);
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
@@ -716,7 +716,7 @@ static void men_z135_set_termios(struct uart_port *port,
|
||||
iowrite32(bd_reg, port->membase + MEN_Z135_BAUD_REG);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
- spin_unlock_irq(&port->lock);
|
||||
+ uart_port_unlock_irq(port);
|
||||
}
|
||||
|
||||
static const char *men_z135_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,173 +0,0 @@
|
||||
From 6efda0771514df14d0ca711f278924edb2236bbe Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:54 +0206
|
||||
Subject: [PATCH 063/198] serial: meson: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-38-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/meson_uart.c | 30 +++++++++++++++---------------
|
||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/meson_uart.c b/drivers/tty/serial/meson_uart.c
|
||||
index 9388b9ddea3b..4c1d2089a0bb 100644
|
||||
--- a/drivers/tty/serial/meson_uart.c
|
||||
+++ b/drivers/tty/serial/meson_uart.c
|
||||
@@ -129,14 +129,14 @@ static void meson_uart_shutdown(struct uart_port *port)
|
||||
|
||||
free_irq(port->irq, port);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = readl(port->membase + AML_UART_CONTROL);
|
||||
val &= ~AML_UART_RX_EN;
|
||||
val &= ~(AML_UART_RX_INT_EN | AML_UART_TX_INT_EN);
|
||||
writel(val, port->membase + AML_UART_CONTROL);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void meson_uart_start_tx(struct uart_port *port)
|
||||
@@ -238,7 +238,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = (struct uart_port *)dev_id;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY))
|
||||
meson_receive_chars(port);
|
||||
@@ -248,7 +248,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id)
|
||||
meson_uart_start_tx(port);
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -284,7 +284,7 @@ static int meson_uart_startup(struct uart_port *port)
|
||||
u32 val;
|
||||
int ret = 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = readl(port->membase + AML_UART_CONTROL);
|
||||
val |= AML_UART_CLEAR_ERR;
|
||||
@@ -301,7 +301,7 @@ static int meson_uart_startup(struct uart_port *port)
|
||||
val = (AML_UART_RECV_IRQ(1) | AML_UART_XMIT_IRQ(port->fifosize / 2));
|
||||
writel(val, port->membase + AML_UART_MISC);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = request_irq(port->irq, meson_uart_interrupt, 0,
|
||||
port->name, port);
|
||||
@@ -341,7 +341,7 @@ static void meson_uart_set_termios(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
cflags = termios->c_cflag;
|
||||
iflags = termios->c_iflag;
|
||||
@@ -405,7 +405,7 @@ static void meson_uart_set_termios(struct uart_port *port,
|
||||
AML_UART_FRAME_ERR;
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int meson_uart_verify_port(struct uart_port *port,
|
||||
@@ -464,14 +464,14 @@ static int meson_uart_poll_get_char(struct uart_port *port)
|
||||
u32 c;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)
|
||||
c = NO_POLL_CHAR;
|
||||
else
|
||||
c = readl(port->membase + AML_UART_RFIFO);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return c;
|
||||
}
|
||||
@@ -482,7 +482,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Wait until FIFO is empty or timeout */
|
||||
ret = readl_poll_timeout_atomic(port->membase + AML_UART_STATUS, reg,
|
||||
@@ -506,7 +506,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
dev_err(port->dev, "Timeout waiting for UART TX EMPTY\n");
|
||||
|
||||
out:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CONSOLE_POLL */
|
||||
@@ -563,9 +563,9 @@ static void meson_serial_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq) {
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
- locked = spin_trylock(&port->lock);
|
||||
+ locked = uart_port_trylock(port);
|
||||
} else {
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -577,7 +577,7 @@ static void meson_serial_port_write(struct uart_port *port, const char *s,
|
||||
writel(val, port->membase + AML_UART_CONTROL);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,106 +0,0 @@
|
||||
From 4988f6a2000b18714877f7723f34b594da6e2222 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:55 +0206
|
||||
Subject: [PATCH 064/198] serial: milbeaut_usio: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-39-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/milbeaut_usio.c | 16 ++++++++--------
|
||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/milbeaut_usio.c b/drivers/tty/serial/milbeaut_usio.c
|
||||
index 70a910085e93..db3b81f2aa57 100644
|
||||
--- a/drivers/tty/serial/milbeaut_usio.c
|
||||
+++ b/drivers/tty/serial/milbeaut_usio.c
|
||||
@@ -207,9 +207,9 @@ static irqreturn_t mlb_usio_rx_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
mlb_usio_rx_chars(port);
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -218,10 +218,10 @@ static irqreturn_t mlb_usio_tx_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
if (readb(port->membase + MLB_USIO_REG_SSR) & MLB_USIO_SSR_TBI)
|
||||
mlb_usio_tx_chars(port);
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -267,7 +267,7 @@ static int mlb_usio_startup(struct uart_port *port)
|
||||
escr = readb(port->membase + MLB_USIO_REG_ESCR);
|
||||
if (of_property_read_bool(port->dev->of_node, "auto-flow-control"))
|
||||
escr |= MLB_USIO_ESCR_FLWEN;
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
writeb(0, port->membase + MLB_USIO_REG_SCR);
|
||||
writeb(escr, port->membase + MLB_USIO_REG_ESCR);
|
||||
writeb(MLB_USIO_SCR_UPCL, port->membase + MLB_USIO_REG_SCR);
|
||||
@@ -282,7 +282,7 @@ static int mlb_usio_startup(struct uart_port *port)
|
||||
|
||||
writeb(MLB_USIO_SCR_TXE | MLB_USIO_SCR_RIE | MLB_USIO_SCR_TBIE |
|
||||
MLB_USIO_SCR_RXE, port->membase + MLB_USIO_REG_SCR);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -337,7 +337,7 @@ static void mlb_usio_set_termios(struct uart_port *port,
|
||||
else
|
||||
quot = 0;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
port->read_status_mask = MLB_USIO_SSR_ORE | MLB_USIO_SSR_RDRF |
|
||||
MLB_USIO_SSR_TDRE;
|
||||
@@ -367,7 +367,7 @@ static void mlb_usio_set_termios(struct uart_port *port,
|
||||
writew(BIT(12), port->membase + MLB_USIO_REG_FBYTE);
|
||||
writeb(MLB_USIO_SCR_RIE | MLB_USIO_SCR_RXE | MLB_USIO_SCR_TBIE |
|
||||
MLB_USIO_SCR_TXE, port->membase + MLB_USIO_REG_SCR);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *mlb_usio_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,94 +0,0 @@
|
||||
From c10459bc601c340a3745fd10f72cfc74c65c52cc Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:56 +0206
|
||||
Subject: [PATCH 065/198] serial: mpc52xx: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-40-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/mpc52xx_uart.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c
|
||||
index 916507b8f31d..a252465e745f 100644
|
||||
--- a/drivers/tty/serial/mpc52xx_uart.c
|
||||
+++ b/drivers/tty/serial/mpc52xx_uart.c
|
||||
@@ -1096,14 +1096,14 @@ static void
|
||||
mpc52xx_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
{
|
||||
unsigned long flags;
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (ctl == -1)
|
||||
psc_ops->command(port, MPC52xx_PSC_START_BRK);
|
||||
else
|
||||
psc_ops->command(port, MPC52xx_PSC_STOP_BRK);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1214,7 +1214,7 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
}
|
||||
|
||||
/* Get the lock */
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Do our best to flush TX & RX, so we don't lose anything */
|
||||
/* But we don't wait indefinitely ! */
|
||||
@@ -1250,7 +1250,7 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
psc_ops->command(port, MPC52xx_PSC_RX_ENABLE);
|
||||
|
||||
/* We're all set, release the lock */
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *
|
||||
@@ -1477,11 +1477,11 @@ mpc52xx_uart_int(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
ret = psc_ops->handle_irq(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,108 +0,0 @@
|
||||
From 71dd3597b32c7a1ff230158cb21d346dd37d0df3 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:57 +0206
|
||||
Subject: [PATCH 066/198] serial: mps2-uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-41-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/mps2-uart.c | 16 ++++++++--------
|
||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/mps2-uart.c b/drivers/tty/serial/mps2-uart.c
|
||||
index ea5a7911cb15..2a4c09f3a834 100644
|
||||
--- a/drivers/tty/serial/mps2-uart.c
|
||||
+++ b/drivers/tty/serial/mps2-uart.c
|
||||
@@ -188,12 +188,12 @@ static irqreturn_t mps2_uart_rxirq(int irq, void *data)
|
||||
if (unlikely(!(irqflag & UARTn_INT_RX)))
|
||||
return IRQ_NONE;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
mps2_uart_write8(port, UARTn_INT_RX, UARTn_INT);
|
||||
mps2_uart_rx_chars(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -206,12 +206,12 @@ static irqreturn_t mps2_uart_txirq(int irq, void *data)
|
||||
if (unlikely(!(irqflag & UARTn_INT_TX)))
|
||||
return IRQ_NONE;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
mps2_uart_write8(port, UARTn_INT_TX, UARTn_INT);
|
||||
mps2_uart_tx_chars(port);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -222,7 +222,7 @@ static irqreturn_t mps2_uart_oerrirq(int irq, void *data)
|
||||
struct uart_port *port = data;
|
||||
u8 irqflag = mps2_uart_read8(port, UARTn_INT);
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
if (irqflag & UARTn_INT_RX_OVERRUN) {
|
||||
struct tty_port *tport = &port->state->port;
|
||||
@@ -244,7 +244,7 @@ static irqreturn_t mps2_uart_oerrirq(int irq, void *data)
|
||||
handled = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
return handled;
|
||||
}
|
||||
@@ -356,12 +356,12 @@ mps2_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
bauddiv = DIV_ROUND_CLOSEST(port->uartclk, baud);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
mps2_uart_write32(port, bauddiv, UARTn_BAUDDIV);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,190 +0,0 @@
|
||||
From c9dc97ed38e7600973f83cfcd5a589f17fc59281 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:58 +0206
|
||||
Subject: [PATCH 067/198] serial: msm: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Bjorn Andersson <quic_bjorande@quicinc.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-42-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/msm_serial.c | 38 ++++++++++++++++-----------------
|
||||
1 file changed, 19 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
|
||||
index 90953e679e38..597264b546fd 100644
|
||||
--- a/drivers/tty/serial/msm_serial.c
|
||||
+++ b/drivers/tty/serial/msm_serial.c
|
||||
@@ -444,7 +444,7 @@ static void msm_complete_tx_dma(void *args)
|
||||
unsigned int count;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Already stopped */
|
||||
if (!dma->count)
|
||||
@@ -476,7 +476,7 @@ static void msm_complete_tx_dma(void *args)
|
||||
|
||||
msm_handle_tx(port);
|
||||
done:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int msm_handle_tx_dma(struct msm_port *msm_port, unsigned int count)
|
||||
@@ -549,7 +549,7 @@ static void msm_complete_rx_dma(void *args)
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Already stopped */
|
||||
if (!dma->count)
|
||||
@@ -587,16 +587,16 @@ static void msm_complete_rx_dma(void *args)
|
||||
if (!(port->read_status_mask & MSM_UART_SR_RX_BREAK))
|
||||
flag = TTY_NORMAL;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
sysrq = uart_handle_sysrq_char(port, dma->virt[i]);
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, dma->virt[i], flag);
|
||||
}
|
||||
|
||||
msm_start_rx_dma(msm_port);
|
||||
done:
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (count)
|
||||
tty_flip_buffer_push(tport);
|
||||
@@ -762,9 +762,9 @@ static void msm_handle_rx_dm(struct uart_port *port, unsigned int misr)
|
||||
if (!(port->read_status_mask & MSM_UART_SR_RX_BREAK))
|
||||
flag = TTY_NORMAL;
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
sysrq = uart_handle_sysrq_char(port, buf[i]);
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, buf[i], flag);
|
||||
}
|
||||
@@ -824,9 +824,9 @@ static void msm_handle_rx(struct uart_port *port)
|
||||
else if (sr & MSM_UART_SR_PAR_FRAME_ERR)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
sysrq = uart_handle_sysrq_char(port, c);
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, c, flag);
|
||||
}
|
||||
@@ -951,7 +951,7 @@ static irqreturn_t msm_uart_irq(int irq, void *dev_id)
|
||||
unsigned int misr;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
misr = msm_read(port, MSM_UART_MISR);
|
||||
msm_write(port, 0, MSM_UART_IMR); /* disable interrupt */
|
||||
|
||||
@@ -983,7 +983,7 @@ static irqreturn_t msm_uart_irq(int irq, void *dev_id)
|
||||
msm_handle_delta_cts(port);
|
||||
|
||||
msm_write(port, msm_port->imr, MSM_UART_IMR); /* restore interrupt */
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1128,13 +1128,13 @@ static int msm_set_baud_rate(struct uart_port *port, unsigned int baud,
|
||||
unsigned long flags, rate;
|
||||
|
||||
flags = *saved_flags;
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
entry = msm_find_best_baud(port, baud, &rate);
|
||||
clk_set_rate(msm_port->clk, rate);
|
||||
baud = rate / 16 / entry->divisor;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
*saved_flags = flags;
|
||||
port->uartclk = rate;
|
||||
|
||||
@@ -1266,7 +1266,7 @@ static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned long flags;
|
||||
unsigned int baud, mr;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (dma->chan) /* Terminate if any */
|
||||
msm_stop_dma(port, dma);
|
||||
@@ -1338,7 +1338,7 @@ static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
/* Try to use DMA */
|
||||
msm_start_rx_dma(msm_port);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *msm_type(struct uart_port *port)
|
||||
@@ -1620,9 +1620,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&port->lock);
|
||||
+ locked = uart_port_trylock(port);
|
||||
else
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
if (is_uartdm)
|
||||
msm_reset_dm_count(port, count);
|
||||
@@ -1661,7 +1661,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
}
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,113 +0,0 @@
|
||||
From edd893a7c3f9e51bf4e2a8ac4e5080073f179969 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:43:59 +0206
|
||||
Subject: [PATCH 068/198] serial: mvebu-uart: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-43-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/mvebu-uart.c | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
|
||||
index ea924e9b913b..0255646bc175 100644
|
||||
--- a/drivers/tty/serial/mvebu-uart.c
|
||||
+++ b/drivers/tty/serial/mvebu-uart.c
|
||||
@@ -187,9 +187,9 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int st;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
st = readl(port->membase + UART_STAT);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return (st & STAT_TX_EMP) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
@@ -249,14 +249,14 @@ static void mvebu_uart_break_ctl(struct uart_port *port, int brk)
|
||||
unsigned int ctl;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
ctl = readl(port->membase + UART_CTRL(port));
|
||||
if (brk == -1)
|
||||
ctl |= CTRL_SND_BRK_SEQ;
|
||||
else
|
||||
ctl &= ~CTRL_SND_BRK_SEQ;
|
||||
writel(ctl, port->membase + UART_CTRL(port));
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void mvebu_uart_rx_chars(struct uart_port *port, unsigned int status)
|
||||
@@ -540,7 +540,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
unsigned int baud, min_baud, max_baud;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = STAT_RX_RDY(port) | STAT_OVR_ERR |
|
||||
STAT_TX_RDY(port) | STAT_TX_FIFO_FUL;
|
||||
@@ -589,7 +589,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *mvebu_uart_type(struct uart_port *port)
|
||||
@@ -735,9 +735,9 @@ static void mvebu_uart_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
ier = readl(port->membase + UART_CTRL(port)) & CTRL_BRK_INT;
|
||||
intr = readl(port->membase + UART_INTR(port)) &
|
||||
@@ -758,7 +758,7 @@ static void mvebu_uart_console_write(struct console *co, const char *s,
|
||||
}
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int mvebu_uart_console_setup(struct console *co, char *options)
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,185 +0,0 @@
|
||||
From afbb80a0344372098b821a0c4899d17270fb0a0e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:00 +0206
|
||||
Subject: [PATCH 069/198] serial: omap: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-44-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/omap-serial.c | 38 ++++++++++++++++----------------
|
||||
1 file changed, 19 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
|
||||
index 135a838f517a..f4c6ff806465 100644
|
||||
--- a/drivers/tty/serial/omap-serial.c
|
||||
+++ b/drivers/tty/serial/omap-serial.c
|
||||
@@ -390,10 +390,10 @@ static void serial_omap_throttle(struct uart_port *port)
|
||||
struct uart_omap_port *up = to_uart_omap_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void serial_omap_unthrottle(struct uart_port *port)
|
||||
@@ -401,10 +401,10 @@ static void serial_omap_unthrottle(struct uart_port *port)
|
||||
struct uart_omap_port *up = to_uart_omap_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static unsigned int check_modem_status(struct uart_omap_port *up)
|
||||
@@ -527,7 +527,7 @@ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
int max_count = 256;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
do {
|
||||
iir = serial_in(up, UART_IIR);
|
||||
@@ -563,7 +563,7 @@ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
|
||||
}
|
||||
} while (max_count--);
|
||||
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
|
||||
@@ -579,9 +579,9 @@ static unsigned int serial_omap_tx_empty(struct uart_port *port)
|
||||
unsigned int ret = 0;
|
||||
|
||||
dev_dbg(up->port.dev, "serial_omap_tx_empty+%d\n", up->port.line);
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -647,13 +647,13 @@ static void serial_omap_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(up->port.dev, "serial_omap_break_ctl+%d\n", up->port.line);
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int serial_omap_startup(struct uart_port *port)
|
||||
@@ -701,13 +701,13 @@ static int serial_omap_startup(struct uart_port *port)
|
||||
* Now, initialize the UART
|
||||
*/
|
||||
serial_out(up, UART_LCR, UART_LCR_WLEN8);
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
/*
|
||||
* Most PC uarts need OUT2 raised to enable interrupts.
|
||||
*/
|
||||
up->port.mctrl |= TIOCM_OUT2;
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
up->msr_saved_flags = 0;
|
||||
/*
|
||||
@@ -742,10 +742,10 @@ static void serial_omap_shutdown(struct uart_port *port)
|
||||
up->ier = 0;
|
||||
serial_out(up, UART_IER, 0);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl &= ~TIOCM_OUT2;
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -815,7 +815,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -1013,7 +1013,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line);
|
||||
}
|
||||
|
||||
@@ -1216,9 +1216,9 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -1245,7 +1245,7 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
check_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,152 +0,0 @@
|
||||
From 556370f59ed3add619e904352a009448d76dcffb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:01 +0206
|
||||
Subject: [PATCH 070/198] serial: owl: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-45-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/owl-uart.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/owl-uart.c b/drivers/tty/serial/owl-uart.c
|
||||
index e99970a9437f..919f5e5aa0f1 100644
|
||||
--- a/drivers/tty/serial/owl-uart.c
|
||||
+++ b/drivers/tty/serial/owl-uart.c
|
||||
@@ -125,12 +125,12 @@ static unsigned int owl_uart_tx_empty(struct uart_port *port)
|
||||
u32 val;
|
||||
unsigned int ret;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_STAT);
|
||||
ret = (val & OWL_UART_STAT_TFES) ? TIOCSER_TEMT : 0;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -232,7 +232,7 @@ static irqreturn_t owl_uart_irq(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
u32 stat;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
stat = owl_uart_read(port, OWL_UART_STAT);
|
||||
|
||||
@@ -246,7 +246,7 @@ static irqreturn_t owl_uart_irq(int irq, void *dev_id)
|
||||
stat |= OWL_UART_STAT_RIP | OWL_UART_STAT_TIP;
|
||||
owl_uart_write(port, stat, OWL_UART_STAT);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -256,14 +256,14 @@ static void owl_uart_shutdown(struct uart_port *port)
|
||||
u32 val;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_CTL);
|
||||
val &= ~(OWL_UART_CTL_TXIE | OWL_UART_CTL_RXIE
|
||||
| OWL_UART_CTL_TXDE | OWL_UART_CTL_RXDE | OWL_UART_CTL_EN);
|
||||
owl_uart_write(port, val, OWL_UART_CTL);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -279,7 +279,7 @@ static int owl_uart_startup(struct uart_port *port)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_STAT);
|
||||
val |= OWL_UART_STAT_RIP | OWL_UART_STAT_TIP
|
||||
@@ -291,7 +291,7 @@ static int owl_uart_startup(struct uart_port *port)
|
||||
val |= OWL_UART_CTL_EN;
|
||||
owl_uart_write(port, val, OWL_UART_CTL);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -311,7 +311,7 @@ static void owl_uart_set_termios(struct uart_port *port,
|
||||
u32 ctl;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
ctl = owl_uart_read(port, OWL_UART_CTL);
|
||||
|
||||
@@ -371,7 +371,7 @@ static void owl_uart_set_termios(struct uart_port *port,
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void owl_uart_release_port(struct uart_port *port)
|
||||
@@ -515,9 +515,9 @@ static void owl_uart_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&port->lock);
|
||||
+ locked = uart_port_trylock(port);
|
||||
else {
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -541,7 +541,7 @@ static void owl_uart_port_write(struct uart_port *port, const char *s,
|
||||
owl_uart_write(port, old_ctl, OWL_UART_CTL);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,85 +0,0 @@
|
||||
From 787597c3d5c6eccc63a42080a9000b439febc947 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:02 +0206
|
||||
Subject: [PATCH 071/198] serial: pch: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-46-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/pch_uart.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
|
||||
index cc83b772b7ca..436cc6d52a11 100644
|
||||
--- a/drivers/tty/serial/pch_uart.c
|
||||
+++ b/drivers/tty/serial/pch_uart.c
|
||||
@@ -1347,7 +1347,7 @@ static void pch_uart_set_termios(struct uart_port *port,
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
rtn = pch_uart_hal_set_line(priv, baud, parity, bits, stb);
|
||||
@@ -1360,7 +1360,7 @@ static void pch_uart_set_termios(struct uart_port *port,
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
out:
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
@@ -1581,10 +1581,10 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
|
||||
port_locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
priv_locked = spin_trylock(&priv->lock);
|
||||
- port_locked = spin_trylock(&priv->port.lock);
|
||||
+ port_locked = uart_port_trylock(&priv->port);
|
||||
} else {
|
||||
spin_lock(&priv->lock);
|
||||
- spin_lock(&priv->port.lock);
|
||||
+ uart_port_lock(&priv->port);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1604,7 +1604,7 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
|
||||
iowrite8(ier, priv->membase + UART_IER);
|
||||
|
||||
if (port_locked)
|
||||
- spin_unlock(&priv->port.lock);
|
||||
+ uart_port_unlock(&priv->port);
|
||||
if (priv_locked)
|
||||
spin_unlock(&priv->lock);
|
||||
local_irq_restore(flags);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,123 +0,0 @@
|
||||
From 2b19ea0cccf8d64230e831e3e9412738abf3c7b6 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:03 +0206
|
||||
Subject: [PATCH 072/198] serial: pic32: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-47-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/pic32_uart.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/pic32_uart.c b/drivers/tty/serial/pic32_uart.c
|
||||
index e308d5022b3f..3a95bf5d55d3 100644
|
||||
--- a/drivers/tty/serial/pic32_uart.c
|
||||
+++ b/drivers/tty/serial/pic32_uart.c
|
||||
@@ -243,7 +243,7 @@ static void pic32_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
struct pic32_sport *sport = to_pic32_sport(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (ctl)
|
||||
pic32_uart_writel(sport, PIC32_SET(PIC32_UART_STA),
|
||||
@@ -252,7 +252,7 @@ static void pic32_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
pic32_uart_writel(sport, PIC32_CLR(PIC32_UART_STA),
|
||||
PIC32_UART_STA_UTXBRK);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* get port type in string format */
|
||||
@@ -274,7 +274,7 @@ static void pic32_uart_do_rx(struct uart_port *port)
|
||||
*/
|
||||
max_count = PIC32_UART_RX_FIFO_DEPTH;
|
||||
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
|
||||
tty = &port->state->port;
|
||||
|
||||
@@ -331,7 +331,7 @@ static void pic32_uart_do_rx(struct uart_port *port)
|
||||
|
||||
} while (--max_count);
|
||||
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
}
|
||||
@@ -410,9 +410,9 @@ static irqreturn_t pic32_uart_tx_interrupt(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
pic32_uart_do_tx(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -580,9 +580,9 @@ static void pic32_uart_shutdown(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
|
||||
/* disable uart */
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
pic32_uart_dsbl_and_mask(port);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
clk_disable_unprepare(sport->clk);
|
||||
|
||||
/* free all 3 interrupts for this UART */
|
||||
@@ -604,7 +604,7 @@ static void pic32_uart_set_termios(struct uart_port *port,
|
||||
unsigned int quot;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable uart and mask all interrupts while changing speed */
|
||||
pic32_uart_dsbl_and_mask(port);
|
||||
@@ -672,7 +672,7 @@ static void pic32_uart_set_termios(struct uart_port *port,
|
||||
/* enable uart */
|
||||
pic32_uart_en_and_unmask(port);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* serial core request to claim uart iomem */
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,237 +0,0 @@
|
||||
From 624b479df0eadf4c24e78331cd977bf078dd0efd Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:04 +0206
|
||||
Subject: [PATCH 073/198] serial: pmac_zilog: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-48-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/pmac_zilog.c | 52 ++++++++++++++++-----------------
|
||||
1 file changed, 26 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c
|
||||
index 29bc80d39e8b..77691fbbf779 100644
|
||||
--- a/drivers/tty/serial/pmac_zilog.c
|
||||
+++ b/drivers/tty/serial/pmac_zilog.c
|
||||
@@ -245,9 +245,9 @@ static bool pmz_receive_chars(struct uart_pmac_port *uap)
|
||||
#endif /* USE_CTRL_O_SYSRQ */
|
||||
if (uap->port.sysrq) {
|
||||
int swallow;
|
||||
- spin_unlock(&uap->port.lock);
|
||||
+ uart_port_unlock(&uap->port);
|
||||
swallow = uart_handle_sysrq_char(&uap->port, ch);
|
||||
- spin_lock(&uap->port.lock);
|
||||
+ uart_port_lock(&uap->port);
|
||||
if (swallow)
|
||||
goto next_char;
|
||||
}
|
||||
@@ -421,7 +421,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
uap_a = pmz_get_port_A(uap);
|
||||
uap_b = uap_a->mate;
|
||||
|
||||
- spin_lock(&uap_a->port.lock);
|
||||
+ uart_port_lock(&uap_a->port);
|
||||
r3 = read_zsreg(uap_a, R3);
|
||||
|
||||
/* Channel A */
|
||||
@@ -442,14 +442,14 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_a:
|
||||
- spin_unlock(&uap_a->port.lock);
|
||||
+ uart_port_unlock(&uap_a->port);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
if (!uap_b)
|
||||
goto out;
|
||||
|
||||
- spin_lock(&uap_b->port.lock);
|
||||
+ uart_port_lock(&uap_b->port);
|
||||
push = false;
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
if (!ZS_IS_OPEN(uap_b)) {
|
||||
@@ -467,7 +467,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_b:
|
||||
- spin_unlock(&uap_b->port.lock);
|
||||
+ uart_port_unlock(&uap_b->port);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
@@ -483,9 +483,9 @@ static inline u8 pmz_peek_status(struct uart_pmac_port *uap)
|
||||
unsigned long flags;
|
||||
u8 status;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
status = read_zsreg(uap, R0);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -671,7 +671,7 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
|
||||
else
|
||||
clear_bits |= SND_BRK;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
new_reg = (uap->curregs[R5] | set_bits) & ~clear_bits;
|
||||
if (new_reg != uap->curregs[R5]) {
|
||||
@@ -679,7 +679,7 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
@@ -851,18 +851,18 @@ static void pmz_irda_reset(struct uart_pmac_port *uap)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
uap->curregs[R5] |= DTR;
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
zssync(uap);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
msleep(110);
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
uap->curregs[R5] &= ~DTR;
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
zssync(uap);
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
@@ -882,9 +882,9 @@ static int pmz_startup(struct uart_port *port)
|
||||
* initialize the chip
|
||||
*/
|
||||
if (!ZS_IS_CONS(uap)) {
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
pwr_delay = __pmz_startup(uap);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
sprintf(uap->irq_name, PMACZILOG_NAME"%d", uap->port.line);
|
||||
if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
|
||||
@@ -907,9 +907,9 @@ static int pmz_startup(struct uart_port *port)
|
||||
pmz_irda_reset(uap);
|
||||
|
||||
/* Enable interrupt requests for the channel */
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
pmz_interrupt_control(uap, 1);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -919,7 +919,7 @@ static void pmz_shutdown(struct uart_port *port)
|
||||
struct uart_pmac_port *uap = to_pmz(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable interrupt requests for the channel */
|
||||
pmz_interrupt_control(uap, 0);
|
||||
@@ -934,19 +934,19 @@ static void pmz_shutdown(struct uart_port *port)
|
||||
pmz_maybe_update_regs(uap);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Release interrupt handler */
|
||||
free_irq(uap->port.irq, uap);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uap->flags &= ~PMACZILOG_FLAG_IS_OPEN;
|
||||
|
||||
if (!ZS_IS_CONS(uap))
|
||||
pmz_set_scc_power(uap, 0); /* Shut the chip down */
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Shared by TTY driver and serial console setup. The port lock is held
|
||||
@@ -1233,7 +1233,7 @@ static void pmz_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct uart_pmac_port *uap = to_pmz(port);
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable IRQs on the port */
|
||||
pmz_interrupt_control(uap, 0);
|
||||
@@ -1245,7 +1245,7 @@ static void pmz_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (ZS_IS_OPEN(uap))
|
||||
pmz_interrupt_control(uap, 1);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *pmz_type(struct uart_port *port)
|
||||
@@ -1882,7 +1882,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
|
||||
struct uart_pmac_port *uap = &pmz_ports[con->index];
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&uap->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
/* Turn of interrupts and enable the transmitter. */
|
||||
write_zsreg(uap, R1, uap->curregs[1] & ~TxINT_ENAB);
|
||||
@@ -1894,7 +1894,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
|
||||
write_zsreg(uap, R1, uap->curregs[1]);
|
||||
/* Don't disable the transmitter. */
|
||||
|
||||
- spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,155 +0,0 @@
|
||||
From 82029c6e95019551ecac0865e6c24ac7a1e52a96 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:05 +0206
|
||||
Subject: [PATCH 074/198] serial: pxa: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-49-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/pxa.c | 30 +++++++++++++++---------------
|
||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c
|
||||
index 73c60f5ea027..46e70e155aab 100644
|
||||
--- a/drivers/tty/serial/pxa.c
|
||||
+++ b/drivers/tty/serial/pxa.c
|
||||
@@ -225,14 +225,14 @@ static inline irqreturn_t serial_pxa_irq(int irq, void *dev_id)
|
||||
iir = serial_in(up, UART_IIR);
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return IRQ_NONE;
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
lsr = serial_in(up, UART_LSR);
|
||||
if (lsr & UART_LSR_DR)
|
||||
receive_chars(up, &lsr);
|
||||
check_modem_status(up);
|
||||
if (lsr & UART_LSR_THRE)
|
||||
transmit_chars(up);
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -242,9 +242,9 @@ static unsigned int serial_pxa_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -295,13 +295,13 @@ static void serial_pxa_break_ctl(struct uart_port *port, int break_state)
|
||||
struct uart_pxa_port *up = (struct uart_pxa_port *)port;
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int serial_pxa_startup(struct uart_port *port)
|
||||
@@ -346,10 +346,10 @@ static int serial_pxa_startup(struct uart_port *port)
|
||||
*/
|
||||
serial_out(up, UART_LCR, UART_LCR_WLEN8);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl |= TIOCM_OUT2;
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Finally, enable interrupts. Note: Modem status interrupts
|
||||
@@ -383,10 +383,10 @@ static void serial_pxa_shutdown(struct uart_port *port)
|
||||
up->ier = 0;
|
||||
serial_out(up, UART_IER, 0);
|
||||
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl &= ~TIOCM_OUT2;
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -434,7 +434,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Ensure the port will be enabled.
|
||||
@@ -504,7 +504,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
up->lcr = cval; /* Save LCR */
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
serial_out(up, UART_FCR, fcr);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -608,9 +608,9 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -628,7 +628,7 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
|
||||
serial_out(up, UART_IER, ier);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
local_irq_restore(flags);
|
||||
clk_disable(up->clk);
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,76 +0,0 @@
|
||||
From 966806d649a35aa824a2b2a8223c9bf0d4193270 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:06 +0206
|
||||
Subject: [PATCH 075/198] serial: qcom-geni: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Reviewed-by: Bjorn Andersson <quic_bjorande@quicinc.com>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-50-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/qcom_geni_serial.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c
|
||||
index 2e1b1c827dfe..549909644011 100644
|
||||
--- a/drivers/tty/serial/qcom_geni_serial.c
|
||||
+++ b/drivers/tty/serial/qcom_geni_serial.c
|
||||
@@ -482,9 +482,9 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
|
||||
|
||||
uport = &port->uport;
|
||||
if (oops_in_progress)
|
||||
- locked = spin_trylock_irqsave(&uport->lock, flags);
|
||||
+ locked = uart_port_trylock_irqsave(uport, &flags);
|
||||
else
|
||||
- spin_lock_irqsave(&uport->lock, flags);
|
||||
+ uart_port_lock_irqsave(uport, &flags);
|
||||
|
||||
geni_status = readl(uport->membase + SE_GENI_STATUS);
|
||||
|
||||
@@ -520,7 +520,7 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
|
||||
qcom_geni_serial_setup_tx(uport, port->tx_remaining);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock_irqrestore(&uport->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(uport, flags);
|
||||
}
|
||||
|
||||
static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop)
|
||||
@@ -972,7 +972,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev)
|
||||
if (uport->suspended)
|
||||
return IRQ_NONE;
|
||||
|
||||
- spin_lock(&uport->lock);
|
||||
+ uart_port_lock(uport);
|
||||
|
||||
m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS);
|
||||
s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,182 +0,0 @@
|
||||
From 62462308af959e397122c1a6219761e049471bec Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:07 +0206
|
||||
Subject: [PATCH 076/198] serial: rda: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-51-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/rda-uart.c | 34 +++++++++++++++++-----------------
|
||||
1 file changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/rda-uart.c b/drivers/tty/serial/rda-uart.c
|
||||
index be5c842b5ba9..d824c8318f33 100644
|
||||
--- a/drivers/tty/serial/rda-uart.c
|
||||
+++ b/drivers/tty/serial/rda-uart.c
|
||||
@@ -139,12 +139,12 @@ static unsigned int rda_uart_tx_empty(struct uart_port *port)
|
||||
unsigned int ret;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = rda_uart_read(port, RDA_UART_STATUS);
|
||||
ret = (val & RDA_UART_TX_FIFO_MASK) ? TIOCSER_TEMT : 0;
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -246,7 +246,7 @@ static void rda_uart_set_termios(struct uart_port *port,
|
||||
unsigned int baud;
|
||||
u32 irq_mask;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 9600, port->uartclk / 4);
|
||||
rda_uart_change_baudrate(rda_port, baud);
|
||||
@@ -325,7 +325,7 @@ static void rda_uart_set_termios(struct uart_port *port,
|
||||
/* update the per-port timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rda_uart_send_chars(struct uart_port *port)
|
||||
@@ -408,7 +408,7 @@ static irqreturn_t rda_interrupt(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
u32 val, irq_mask;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Clear IRQ cause */
|
||||
val = rda_uart_read(port, RDA_UART_IRQ_CAUSE);
|
||||
@@ -425,7 +425,7 @@ static irqreturn_t rda_interrupt(int irq, void *dev_id)
|
||||
rda_uart_send_chars(port);
|
||||
}
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -436,16 +436,16 @@ static int rda_uart_startup(struct uart_port *port)
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
rda_uart_write(port, 0, RDA_UART_IRQ_MASK);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = request_irq(port->irq, rda_interrupt, IRQF_NO_SUSPEND,
|
||||
"rda-uart", port);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = rda_uart_read(port, RDA_UART_CTRL);
|
||||
val |= RDA_UART_ENABLE;
|
||||
@@ -456,7 +456,7 @@ static int rda_uart_startup(struct uart_port *port)
|
||||
val |= (RDA_UART_RX_DATA_AVAILABLE | RDA_UART_RX_TIMEOUT);
|
||||
rda_uart_write(port, val, RDA_UART_IRQ_MASK);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -466,7 +466,7 @@ static void rda_uart_shutdown(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
rda_uart_stop_tx(port);
|
||||
rda_uart_stop_rx(port);
|
||||
@@ -475,7 +475,7 @@ static void rda_uart_shutdown(struct uart_port *port)
|
||||
val &= ~RDA_UART_ENABLE;
|
||||
rda_uart_write(port, val, RDA_UART_CTRL);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *rda_uart_type(struct uart_port *port)
|
||||
@@ -515,7 +515,7 @@ static void rda_uart_config_port(struct uart_port *port, int flags)
|
||||
rda_uart_request_port(port);
|
||||
}
|
||||
|
||||
- spin_lock_irqsave(&port->lock, irq_flags);
|
||||
+ uart_port_lock_irqsave(port, &irq_flags);
|
||||
|
||||
/* Clear mask, so no surprise interrupts. */
|
||||
rda_uart_write(port, 0, RDA_UART_IRQ_MASK);
|
||||
@@ -523,7 +523,7 @@ static void rda_uart_config_port(struct uart_port *port, int flags)
|
||||
/* Clear status register */
|
||||
rda_uart_write(port, 0, RDA_UART_STATUS);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, irq_flags);
|
||||
+ uart_port_unlock_irqrestore(port, irq_flags);
|
||||
}
|
||||
|
||||
static void rda_uart_release_port(struct uart_port *port)
|
||||
@@ -597,9 +597,9 @@ static void rda_uart_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq) {
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
- locked = spin_trylock(&port->lock);
|
||||
+ locked = uart_port_trylock(port);
|
||||
} else {
|
||||
- spin_lock(&port->lock);
|
||||
+ uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -615,7 +615,7 @@ static void rda_uart_port_write(struct uart_port *port, const char *s,
|
||||
rda_uart_write(port, old_irq_mask, RDA_UART_IRQ_MASK);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
+ uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,119 +0,0 @@
|
||||
From 0a9667b3c4f1f1fc911c939e86a18a7f59a37073 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Sep 2023 20:44:08 +0206
|
||||
Subject: [PATCH 077/198] serial: rp2: Use port lock wrappers
|
||||
|
||||
When a serial port is used for kernel console output, then all
|
||||
modifications to the UART registers which are done from other contexts,
|
||||
e.g. getty, termios, are interference points for the kernel console.
|
||||
|
||||
So far this has been ignored and the printk output is based on the
|
||||
principle of hope. The rework of the console infrastructure which aims to
|
||||
support threaded and atomic consoles, requires to mark sections which
|
||||
modify the UART registers as unsafe. This allows the atomic write function
|
||||
to make informed decisions and eventually to restore operational state. It
|
||||
also allows to prevent the regular UART code from modifying UART registers
|
||||
while printk output is in progress.
|
||||
|
||||
All modifications of UART registers are guarded by the UART port lock,
|
||||
which provides an obvious synchronization point with the console
|
||||
infrastructure.
|
||||
|
||||
To avoid adding this functionality to all UART drivers, wrap the
|
||||
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
||||
which just contain the spin_[un]lock*() invocations for now. In a
|
||||
subsequent step these helpers will gain the console synchronization
|
||||
mechanisms.
|
||||
|
||||
Converted with coccinelle. No functional change.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
||||
Link: https://lore.kernel.org/r/20230914183831.587273-52-john.ogness@linutronix.de
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/rp2.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/rp2.c b/drivers/tty/serial/rp2.c
|
||||
index de220ac8ca54..d46a81cddfcd 100644
|
||||
--- a/drivers/tty/serial/rp2.c
|
||||
+++ b/drivers/tty/serial/rp2.c
|
||||
@@ -276,9 +276,9 @@ static unsigned int rp2_uart_tx_empty(struct uart_port *port)
|
||||
* But the TXEMPTY bit doesn't seem to work unless the TX IRQ is
|
||||
* enabled.
|
||||
*/
|
||||
- spin_lock_irqsave(&up->port.lock, flags);
|
||||
+ uart_port_lock_irqsave(&up->port, &flags);
|
||||
tx_fifo_bytes = readw(up->base + RP2_TX_FIFO_COUNT);
|
||||
- spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
+ uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return tx_fifo_bytes ? 0 : TIOCSER_TEMT;
|
||||
}
|
||||
@@ -323,10 +323,10 @@ static void rp2_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
rp2_rmw(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_BREAK_m,
|
||||
break_state ? RP2_TXRX_CTL_BREAK_m : 0);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rp2_uart_enable_ms(struct uart_port *port)
|
||||
@@ -383,7 +383,7 @@ static void rp2_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
if (tty_termios_baud_rate(new))
|
||||
tty_termios_encode_baud_rate(new, baud, baud);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* ignore all characters if CREAD is not set */
|
||||
port->ignore_status_mask = (new->c_cflag & CREAD) ? 0 : RP2_DUMMY_READ;
|
||||
@@ -391,7 +391,7 @@ static void rp2_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
__rp2_uart_set_termios(up, new->c_cflag, new->c_iflag, baud_div);
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rp2_rx_chars(struct rp2_uart_port *up)
|
||||
@@ -440,7 +440,7 @@ static void rp2_ch_interrupt(struct rp2_uart_port *up)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
- spin_lock(&up->port.lock);
|
||||
+ uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* The IRQ status bits are clear-on-write. Other status bits in
|
||||
@@ -456,7 +456,7 @@ static void rp2_ch_interrupt(struct rp2_uart_port *up)
|
||||
if (status & RP2_CHAN_STAT_MS_CHANGED_MASK)
|
||||
wake_up_interruptible(&up->port.state->port.delta_msr_wait);
|
||||
|
||||
- spin_unlock(&up->port.lock);
|
||||
+ uart_port_unlock(&up->port);
|
||||
}
|
||||
|
||||
static int rp2_asic_interrupt(struct rp2_card *card, unsigned int asic_id)
|
||||
@@ -516,10 +516,10 @@ static void rp2_uart_shutdown(struct uart_port *port)
|
||||
|
||||
rp2_uart_break_ctl(port, 0);
|
||||
|
||||
- spin_lock_irqsave(&port->lock, flags);
|
||||
+ uart_port_lock_irqsave(port, &flags);
|
||||
rp2_mask_ch_irq(up, up->idx, 0);
|
||||
rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
|
||||
- spin_unlock_irqrestore(&port->lock, flags);
|
||||
+ uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *rp2_uart_type(struct uart_port *port)
|
||||
--
|
||||
2.45.2
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user