Merge keystone/android-mainline-keystone-qcom-release.6.0 (dcb3fbd
) into msm-pineapple
* refs/heads/tmp-dcb3fbd: ANDROID: GKI: Enable HCTR2 ANDROID: GKI: Change UCLAMP_BUCKETS_COUNT to 20 ANDROID: 16k target: don't write defconfig to source tree ANDROID: GKI: Add ARM64_16K_PAGES variant ANDROID: kleaf: add 16k variant of kernel_aarch64 Linux 6.0 i2c: davinci: fix PM disable depth imbalance in davinci_i2c_probe dt-bindings: i2c: st,stm32-i2c: Document wakeup-source property dt-bindings: i2c: st,stm32-i2c: Document interrupt-names property MIPS: pci: lantiq: switch to using gpiod API mips: allow firmware to pass RNG seed to kernel damon/sysfs: fix possible memleak on damon_sysfs_add_target mm: fix BUG splat with kvmalloc + GFP_ATOMIC MAINTAINERS: drop entry to removed file in ARM/RISCPC ARCHITECTURE drm/amdgpu/gfx11: switch to amdgpu_gfx_rlc_init_microcode drm/amdgpu: add helper to init rlc firmware drm/amdgpu: add helper to init rlc fw in header v2_4 drm/amdgpu: add helper to init rlc fw in header v2_3 drm/amdgpu: add helper to init rlc fw in header v2_2 drm/amdgpu: add helper to init rlc fw in header v2_1 drm/amdgpu: add helper to init rlc fw in header v2_0 drm/amdgpu: save rlcv/rlcp ucode version in amdgpu_gfx ACPI: LPSS: Deduplicate skipping device in acpi_lpss_create_device() ACPI: LPSS: Replace loop with first entry retrieval BACKPORT: FROMLIST: dma-heap: Let dma heap use dma_map_attrs to map & unmap iova Revert "pstore: migrate to crypto acomp interface" MIPS: Simplify __bswapdi2() and __bswapsi2() MIPS: Silence missing prototype warning mips: update config files KVM: selftests: Compare insn opcodes directly in fix_hypercall_test KVM: selftests: Implement memcmp(), memcpy(), and memset() for guest use KVM: x86: Hide IA32_PLATFORM_DCA_CAP[31:0] from the guest KVM: selftests: Gracefully handle empty stack traces KVM: selftests: replace assertion with warning in access_tracking_perf_test checkpatch: warn on usage of VM_BUG_ON() and other BUG variants coding-style.rst: document BUG() and WARN() rules ("do not crash the kernel") Documentation: devres: add missing IO helper Documentation: devres: update IRQ helper Documentation/mm: modify page_referenced to folio_referenced Documentation/CoC: Reflect current CoC interpretation and practices docs/doc-guide: Add documentation on SPHINX_IMGMATH docs: process/5.Posting.rst: clarify use of Reported-by: tag docs, kprobes: Fix the wrong location of Kprobes drm/amdgpu: Enable sram on vcn_4_0_2 drm/amdgpu: Enable VCN DPG for GC11_0_1 perf build: Fixup disabling of -Wdeprecated-declarations for the python scripting engine docs: add a man-pages link to the front page docs: put atomic*.txt and memory-barriers.txt into the core-api book docs: move asm-annotations.rst into core-api docs: remove some index.rst cruft docs: reconfigure the HTML left column docs: Rewrite the front page docs: promote the title of process/index.rst perf tests mmap-basic: Remove unused variable to address clang 15 warning perf parse-events: Ignore clang 15 warning about variable set but unused in bison produced code drm/amd/display: Prevent OTG shutdown during PSR SU perf tests record: Fail the test if the 'errs' counter is not zero perf test: Fix test case 87 ("perf record tests") for hybrid systems ANDROID: timer: Add vendor hook for timer calc index LoongArch: Clean up loongson3_smp_ops declaration LoongArch: Fix and cleanup csr_era handling in do_ri() LoongArch: Align the address of kernel_entry to 4KB mptcp: fix unreleased socket in accept queue mptcp: factor out __mptcp_close() without socket lock net: ethernet: mtk_eth_soc: fix mask of RX_DMA_GET_SPORT{,_V2} net: mscc: ocelot: fix tagged VLAN refusal while under a VLAN-unaware bridge clk: imx93: drop of_match_ptr clk: iproc: Do not rely on node name for correct PLL setup io_uring/poll: disable level triggered poll clk: sunxi-ng: h6: Fix default PLL GPU rate drm/i915/gt: Perf_limit_reasons are only available for Gen11+ clk: imx: imx6sx: remove the SET_RATE_PARENT flag for QSPI clocks m68k: Rework BI_VIRT_RNG_SEED as BI_RNG_SEED m68k: Process bootinfo records before saving them ACPI: x86: s2idle: Add another ID to s2idle_dmi_table ACPI: x86: s2idle: Fix a NULL pointer dereference [coredump] don't use __kernel_write() on kmap_local_page() x86/cacheinfo: Add a cpu_llc_shared_mask() UP variant Revert "net: set proper memcg for net_init hooks allocations" MAINTAINERS: Drop records pointing to 01.org/linux-acpi ACPI: Kconfig: Drop link to https://01.org/linux-acpi ACPI: docs: Drop useless DSDT override documentation ACPI: DPTF: Drop stale link from Kconfig help perf arm-spe: augment the data source type with neoverse_spe list perf tests vmlinux-kallsyms: Update is_ignored_symbol function to match the kernel ignored list ata: libata-sata: Fix device queue depth control ata: libata-scsi: Fix initialization of device queue depth can: c_can: don't cache TX messages for C_CAN cores vdpa/mlx5: Fix MQ to support non power of two num queues vduse: prevent uninitialized memory accesses virtio-blk: Fix WARN_ON_ONCE in virtio_queue_rq() virtio_test: fixup for vq reset virtio-crypto: fix memory-leak vdpa/ifcvf: fix the calculation of queuepair drm/amdgpu: Add amdgpu suspend-resume code path under SRIOV drm/amdgpu: Remove fence_process in count_emitted drm/amdgpu: Correct the position in patch_cond_exec drm/amd/display: fill in clock values when DPM is not enabled drm/amd/display: Avoid unnecessary pixel rate divider programming drm/amd/display: Remove assert for odm transition case drm/amd/display: Fix typo in get_pixel_rate_div drm/amd/display: Fix audio on display after unplugging another drm/amd/display: Add explicit FIFO disable for DP blank drm/amd/display: Wrap OTG disable workaround with FIFO control drm/amd/display: Do DIO FIFO enable after DP video stream enable drm/amd/display: Update DCN32 to use new SR latencies drm/amd/display: Avoid avoid unnecessary pixel rate divider programming drm/amdkfd: fix dropped interrupt in kfd_int_process_v11 drm/amdgpu: pass queue size and is_aql_queue to MES drm/amdkfd: fix MQD init for GFX11 in init_mqd drm/amd/pm: use adverse selection for dpm features unsupported by driver drm/amd/pm: enable gfxoff feature for SMU 13.0.0 drm/amdgpu: avoid gfx register accessing during gfxoff x86/alternative: Fix race in try_get_desc() MIPS: Lantiq: vmmc: fix compile break introduced by gpiod patch Documentation: devres: add missing SPI helper Documentation: devres: add missing PINCTRL helpers docs: hugetlbpage.rst: fix a typo of hugepage size docs/zh_CN: Add new translation of admin-guide/bootconfig.rst docs/zh_CN: Update zh_CN/admin-guide/README.rst to 6.0-rc2 docs/zh_CN: core-api: Add packing Chinese translation docs/zh_CN: core-api: Add generic-radix-tree Chinese translation docs/zh_CN: core-api: Add circular-buffers Chinese translation docs/zh_CN: core-api: Add idr Chinese translation docs: x86: replace do_IRQ int the entry_64.rst with common_interrupt() usb: chipidea: clarify Documentation/ABI text Documentation: W1: minor typo corrections Documentation: fb: udlfb: clean up text and formatting docs/core-api: expand Fedora instructions for GCC plugins Documentation: spufs: correct a duplicate word typo docs/zh_CN: Update zh_CN/process/coding-style.rst to 6.0-rc2 Documentation/hw-vuln: Update spectre doc Documentation: filesystems: correct possessive "its" Documentation: stable: Document alternative for referring upstream commit hash docs: update mediator information in CoC docs docs/zh_CN: add dt kernel-api translation docs/zh_CN: add dt overlay-notes translation docs/zh_CN: add dt dynamic-resolution-notes translation docs/zh_CN: add dt changesets translation docs/zh_CN: add PCI acpi-info translation Documentation: process/submitting-patches: misspelling "mesages" Delete duplicate words from kernel docs docs: admin-guide: for kernel bugs refer to other kernel documentation docs: admin-guide: do not mention the 'run a.out user programs' feature Documentation/ABI: correct possessive "its" typos Remove duplicate words inside documentation docs/conf.py: Respect env variable SPHINX_IMGMATH docs/conf.py: Treat mathjax as fallback math renderer docs/zh_CN: Update zh_CN/process/submit-checklist.rst to 6.0-rc2 docs: scheduler: Update new path for the sysctl knobs docs/zh_TW: Remove oops-tracing docs/zh_CN: Remove IRQ and oops-tracing docs/zh_CN: Update the translation of io_ordering to 6.0-rc2 Documentation: ext4: correct the document about superblock Documentation: filesystems: xfs: update pseudocode and typo fixes docs/zh_CN: Fix two missing labels in zh_CN/process docs/zh_CN: Update zh_CN/process/submitting-patches.rst to 5.19 docs/zh_CN: Update zh_CN/process/email-clients.rst to 5.19 ANDROID: dma/debug: fix warning of check_sync ice: xsk: drop power of 2 ring size restriction for AF_XDP ice: xsk: change batched Tx descriptor cleaning net: usb: qmi_wwan: Add new usb-id for Dell branded EM7455 Input: snvs_pwrkey - fix SNVS_HPVIDR1 register address KVM: selftests: Skip tests that require EPT when it is not available mmc: hsq: Fix data stomping during mmc recovery selftests: Fix the if conditions of in test_extra_filter() uas: ignore UAS for Thinkplus chips usb-storage: Add Hiksemi USB3-FW to IGNORE_UAS uas: add no-uas quirk for Hiksemi usb_disk usb: dwc3: st: Fix node's child name usb: typec: ucsi: Remove incorrect warning net: phy: Don't WARN for PHY_UP state in mdio_bus_phy_resume() net: stmmac: power up/down serdes in stmmac_open/release wifi: mac80211: mlme: Fix double unlock on assoc success handling wifi: mac80211: mlme: Fix missing unlock on beacon RX wifi: mac80211: fix memory corruption in minstrel_ht_update_rates() wifi: mac80211: fix regression with non-QoS drivers wifi: mac80211: ensure vif queues are operational after start wifi: mac80211: don't start TX with fq->lock to fix deadlock wifi: cfg80211: fix MCS divisor value media: rkvdec: Disable H.264 error detection media: mediatek: vcodec: Drop platform_get_resource(IORESOURCE_IRQ) media: dvb_vb2: fix possible out of bound access media: v4l2-ioctl.c: fix incorrect error path media: v4l2-compat-ioctl32.c: zero buffer passed to v4l2_compat_get_array_args() nvme-pci: disable Write Zeroes on Phison E3C/E4C nvme: Fix IOC_PR_CLEAR and IOC_PR_RELEASE ioctls for nvme devices libata: add ATA_HORKAGE_NOLPM for Pioneer BDR-207M and BDR-205 ARM: dts: integrator: Fix DMA ranges net: hippi: Add missing pci_disable_device() in rr_init_one() net/mlxbf_gige: Fix an IS_ERR() vs NULL bug in mlxbf_gige_mdio_probe cxgb4: fix missing unlock on ETHOFLD desc collect fail path net: sched: act_ct: fix possible refcount leak in tcf_ct_init() x86/uaccess: avoid check_object_size() in copy_from_user_nmi() mm/page_isolation: fix isolate_single_pageblock() isolation behavior mm,hwpoison: check mm when killing accessing process mm/hugetlb: correct demote page offset logic mm: prevent page_frag_alloc() from corrupting the memory mm: bring back update_mmu_cache() to finish_fault() frontswap: don't call ->init if no ops are registered mm/huge_memory: use pfn_to_online_page() in split_huge_pages_all() mm: fix madivse_pageout mishandling on non-LRU page powerpc/64s/radix: don't need to broadcast IPI for radix pmd collapse flush mm: gup: fix the fast GUP race against THP collapse usbnet: Fix memory leak in usbnet_disconnect() io_uring: register single issuer task at creation ext4: fixup possible uninitialized variable access in ext4_mb_choose_next_group_cr1() Revert "net: mvpp2: debugfs: fix memory leak when using debugfs_lookup()" drm/i915/gt: Restrict forced preemption to the active context perf tests powerpc: Fix branch stack sampling test to include sanity check for branch filter perf parse-events: Remove "not supported" hybrid cache events perf print-events: Fix "perf list" can not display the PMU prefix for some hybrid cache events perf tools: Get a perf cgroup more portably in BPF cpufreq: qcom-cpufreq-hw: Add cpufreq qos for LMh gpio: mvebu: Fix check for pwm support on non-A8K platforms cpufreq: Add __init annotation to module init funcs cpufreq: tegra194: change tegra239_cpufreq_soc to static Linux 6.0-rc7 PM / devfreq: rockchip-dfi: Fix an error message PM / devfreq: mtk-cci: Handle sram regulator probe deferral ACPI: x86: s2idle: Add a quirk for ASUSTeK COMPUTER INC. ROG Flow X13 ACPI: x86: s2idle: Add a quirk for Lenovo Slim 7 Pro 14ARH7 ACPI: x86: s2idle: Add a quirk for ASUS ROG Zephyrus G14 ACPI: x86: s2idle: Add a quirk for ASUS TUF Gaming A17 FA707RE ACPI: x86: s2idle: Add module parameter to prefer Microsoft GUID ACPI: x86: s2idle: If a new AMD _HID is missing assume Rembrandt ACPI: x86: s2idle: Move _HID handling for AMD systems into structures Input: synaptics - disable Intertouch for Lenovo T14 and P14s AMD G1 Input: iqs62x-keys - drop unused device node references Input: melfas_mip4 - fix return value check in mip4_probe() devdax: Fix soft-reservation memory description powercap: intel_rapl: Use standard Energy Unit for SPR Dram RAPL domain PM: runtime: Return -EINPROGRESS from rpm_resume() in the RPM_NOWAIT case platform/x86: int3472: Add board data for Surface Go2 IR camera platform/x86: int3472: Support multiple gpio lookups in board data platform/x86: int3472: Support multiple clock consumers ACPI: bus: Add iterator for dependent devices ACPI: scan: Add acpi_dev_get_next_consumer_dev() ACPI: resource: Add ASUS model S5402ZA to quirks ACPI: AMBA: Add ARM DMA-330 controller to the supported list ACPI: APEI: Remove unneeded result variables ACPI: fan: Reorder symbols to get rid of a few forward declarations ACPI: CPPC: Disable FIE if registers in PCC regions LoongArch: Use acpi_arch_dma_setup() and remove ARCH_HAS_PHYS_TO_DMA ACPI: scan: Support multiple DMA windows with different offsets ACPI: AC: Remove the leftover struct acpi_ac_bl ACPI: x86: Add a quirk for Dell Inspiron 14 2-in-1 for StorageD3Enable PNPBIOS: remove unused pnpid32_to_pnpid() declaration MIPS: IRQ: remove orphan allocate_irqno() declaration MIPS: remove orphan sb1250_time_init() declaration MIPS: Lantiq: switch vmmc to use gpiod API MIPS: lantiq: enable all hardware interrupts on second VPE sfc: correct filter_table_remove method for EF10 PFs Makefile.debug: re-enable debug info for .S files Makefile.debug: set -g unconditional on CONFIG_DEBUG_INFO_SPLIT io_uring: ensure that cached task references are always put on exit ACPI: processor idle: Practically limit "Dummy wait" workaround to old Intel systems ANDROID: GKI: Build-in REGMAP_SPMI certs: make system keyring depend on built-in x509 parser Kconfig: remove unused function 'menu_get_root_menu' scripts/clang-tools: remove unused module ANDROID: GKI: x86: Enable CONFIG_SPMI cgroup: cgroup_get_from_id() must check the looked-up kn is a directory ARM: dts: integrator: Tag PCI host with device_type Revert "drm: bridge: analogix/dp: add panel prepare/unprepare in suspend/resume time" net: mt7531: ensure all MACs are powered down before reset net: mt7531: only do PLL once after the reset MAINTAINERS: rectify file entry in TEAM DRIVER vmlinux.lds.h: CFI: Reduce alignment of jump-table to function alignment ARM: sunplus: fix serial console kconfig and build problems net: macb: Fix ZynqMP SGMII non-wakeup source resume failure tun: support not enabling carrier in TUNSETIFF drm/bridge: lt8912b: fix corrupted image output drm/bridge: lt8912b: set hdmi or dvi mode drm/bridge: lt8912b: add vsync hsync Revert "firmware: arm_scmi: Add clock management to the SCMI power domain" MAINTAINERS: switch graphics to airlied other addresses KVM: x86: Inject #UD on emulated XSETBV if XSAVES isn't enabled KVM: x86: Always enable legacy FP/SSE in allowed user XFEATURES KVM: x86: Reinstate kvm_vcpu_arch.guest_supported_xcr0 KVM: x86/mmu: add missing update to max_mmu_rmap_size selftests: kvm: Fix a compile error in selftests/kvm/rseq_test.c mm: slub: fix flush_cpu_slab()/__free_slab() invocations in task context. ACPI: PCI: Rework acpi_get_pci_dev() ACPI: PCC: Fix Tx acknowledge in the PCC address space handler ACPI: PCC: replace wait_for_completion() ACPI: PCC: Release resources on address space setup failure path ACPI: HMAT: Drop unused dev_fmt() and redundant 'HMAT' prefix reset: npcm: fix iprst2 and iprst4 setting ext4: limit the number of retries after discarding preallocations blocks ext4: fix bug in extents parsing when eh_entries == 0 and eh_depth > 0 serial: sifive: enable clocks for UART when probed serial: 8250: omap: Use serial8250_em485_supported serial: fsl_lpuart: Reset prior to registration selftests: forwarding: add shebang for sch_red.sh bnxt: prevent skb UAF after handing over to PTP worker net: marvell: Fix refcounting bugs in prestera_port_sfp_bind() net: sched: fix possible refcount leak in tc_new_tfilter() net: sunhme: Fix packet reception for len < RX_COPY_THRESHOLD udp: Use WARN_ON_ONCE() in udp_read_skb() selftests: bonding: cause oops in bond_rr_gen_slave_id bonding: fix NULL deref in bond_rr_gen_slave_id net: phy: micrel: fix shared interrupt on LAN8814 perf/arm-cmn: Add more bits to child node address offset field usb: typec: anx7411: Fix build error without CONFIG_POWER_SUPPLY ANDROID: Enable BUILD_GKI_CERTIFICATION_TOOLS for x86_64 GKI counter: 104-quad-8: Fix skipped IRQ lines during events configuration arm64: topology: fix possible overflow in amu_fie_setup() arm64: mm: don't acquire mutex when rewriting swapper ALSA: hda: intel-dsp-config: add missing RaptorLake PCI IDs thunderbolt: Explicitly reset plug events delay back to USB4 spec value drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES net/smc: Stop the CLC flow if no link to map buffers on media: flexcop-usb: fix endpoint type check efi: libstub: check Shim mode using MokSBStateRT efi: x86: Wipe setup_data on pure EFI boot ARM: 9247/1: mm: set readonly for MT_MEMORY_RO with ARM_LPAE ARM: 9244/1: dump: Fix wrong pg_level in walk_pmd() ARM: 9243/1: riscpc: Unbreak the build ext4: use buckets for cr 1 block scan instead of rbtree ext4: use locality group preallocation for small closed files ext4: make directory inode spreading reflect flexbg size ext4: avoid unnecessary spreading of allocations among groups ext4: make mballoc try target group first even with mb_optimize_scan ice: Fix ice_xdp_xmit() when XDP TX queue number is not sufficient drm/mediatek: dsi: Move mtk_dsi_stop() call back to mtk_dsi_poweroff() drm/amd/display: Reduce number of arguments of dml314's CalculateFlipSchedule() drm/amd/display: Reduce number of arguments of dml314's CalculateWatermarksAndDRAMSpeedChangeSupport() drm/amdgpu: don't register a dirty callback for non-atomic drm/amd/pm: drop the pptable related workarounds for SMU 13.0.0 drm/amd/pm: add support for 3794 pptable for SMU13.0.0 drm/amd/display: correct num_dsc based on HW cap drm/amd/display: Disable OTG WA for the plane_state NULL case on DCN314 drm/amd/display: Add shift and mask for ICH_RESET_AT_END_OF_LINE drm/amd/display: increase dcn315 pstate change latency drm/amd/display: Fix DP MST timeslot issue when fallback happened drm/amd/display: Display distortion after hotplug 5K tiled display drm/amd/display: Update dummy P-state search to use DCN32 DML drm/amd/display: skip audio setup when audio stream is enabled drm/amd/display: update gamut remap if plane has changed drm/amd/display: Assume an LTTPR is always present on fixed_vs links drm/amd/display: fix dcn315 memory channel count and width read drm/amd/display: Fix double cursor on non-video RGB MPO drm/amd/display: Only consider pixle rate div policy for DCN32+ drm/amd/display: Port DCN30 420 logic to DCN32 drm/amdgpu: Update PTE flags with TF enabled s390/vfio-ap: bypass unnecessary processing of AP resources i2c: mux: harden i2c_mux_alloc() against integer overflows ANDROID: selftests: incfs: Increase timeout in concurrent_reads_and_writes_test i2c: mlxbf: Fix frequency calculation perf tools: Honor namespace when synthesizing build-ids tools headers cpufeatures: Sync with the kernel sources perf kcore_copy: Do not check /proc/modules is unchanged libperf evlist: Fix polling of system-wide events perf record: Fix cpu mask bit setting for mixed mmaps perf test: Skip wp modify test on old kernels intel_idle: Add AlderLake-N support powercap: intel_rapl: fix UBSAN shift-out-of-bounds issue KVM: s390: pci: register pci hooks without interpretation KVM: s390: pci: fix GAIT physical vs virtual pointers usage KVM: s390: Pass initialized arg even if unused KVM: s390: pci: fix plain integer as NULL pointer warnings perf jit: Include program header in ELF files perf test: Add a new test for perf stat cgroup BPF counter perf stat: Use evsel->core.cpus to iterate cpus in BPF cgroup counters perf stat: Fix cpu map index in bperf cgroup code perf stat: Fix BPF program section name mmc: core: Terminate infinite loop in SD-UHS voltage switch net: atlantic: fix potential memory leak in aq_ndev_close() iommu/vt-d: Check correct capability for sagaw determination Revert "iommu/vt-d: Fix possible recursive locking in intel_iommu_init()" can: gs_usb: gs_usb_set_phys_id(): return with error if identify is not supported can: gs_usb: gs_can_open(): fix race dev->can.state condition can: flexcan: flexcan_mailbox_read() fix return value for drop = true gpiolib: cdev: Set lineevent_state::irq after IRQ register successfully gpio: tqmx86: fix uninitialized variable girq cpufreq: tegra194: Add support for Tegra239 cpufreq: qcom-cpufreq-hw: Fix uninitialized throttled_freq warning arch: um: Mark the stack non-executable to fix a binutils warning ANDROID: [GKI] Include ioremap_guard in cmdline arg ANDROID: [GKI] Include bootconfig in CONFIG_CMDLINE ANDROID: incfs: Add check for ATTR_KILL_SUID and ATTR_MODE in incfs_setattr ANDROID: GKI: vendor code needs __balance_callbacks access ANDROID: topology: Add a flag to indicate topology has been updated ANDROID: arch_topology: Add vendor hook ANDROID: Sched: Add vendor hooks in scheduler ANDROID: arm64: Export system_32bit_el0_cpumask symbol ANDROID: arch_topology: Export thermal pressure symbol ANDROID: sched: add hook point in do_sched_yield() ANDROID: sched: Add flags parameter to enq/deq after tracehooks ANDROID: sched: vendor hook for sched_getaffinity ANDROID: sched: core: hook for get_nohz_timer_target ANDROID: kernel: sched: tracehook for is_cpu_allowed ANDROID: sched: add hook to rto_next_cpu ANDROID: sched: allow access to critical common code for CPU Pause ANDROID: sched: support pick_migrate_task in common kernel ANDROID: Sched: Add restricted vendor hooks for scheduler net: sh_eth: Fix PHY state warning splat during system resume net: ravb: Fix PHY state warning splat during system resume netfilter: nf_ct_ftp: fix deadlock when nat rewrite is needed netfilter: ebtables: fix memory leak when blob is malformed netfilter: nf_tables: fix percpu memory leak at nf_tables_addchain() netfilter: nf_tables: fix nft_counters_enabled underflow at nf_tables_addchain() netfilter: conntrack: remove nf_conntrack_helper documentation MAINTAINERS: Add myself as a reviewer for Qualcomm ETHQOS Ethernet driver ice: Fix interface being down after reset with link-down-on-close flag on ice: config netdev tc before setting queues number net/sched: taprio: make qdisc_leaf() see the per-netdev-queue pfifo child qdiscs net/sched: taprio: avoid disabling offload when it was never enabled ipv6: Fix crash when IPv6 is administratively disabled net: enetc: deny offload of tc-based TSN features on VF interfaces net: enetc: move enetc_set_psfp() out of the common enetc_set_features() wireguard: netlink: avoid variable-sized memcpy on sockaddr wireguard: selftests: do not install headers on UML wireguard: ratelimiter: disable timings test by default sfc/siena: fix null pointer dereference in efx_hard_start_xmit sfc/siena: fix TX channel offset when using legacy interrupts efi: efibc: Guard against allocation failure net: clear msg_get_inq in __get_compat_msghdr() selftests: forwarding: Add test cases for unresolved multicast routes ipmr: Always call ip{,6}_mr_forward() from RCU read-side critical section net: ipa: properly limit modem routing table use of: mdio: Add of_node_put() when breaking out of for_each_xx drm/i915/gem: Really move i915_gem_context.link under ref protection drm/i915/gem: Flush contexts on driver release Revert "block: freeze the queue earlier in del_gendisk" gpio: ftgpio010: Make irqchip immutable gpio: mockup: Fix potential resource leakage when register a chip gpio: mockup: fix NULL pointer dereference when removing debugfs tcp: read multiple skbs in tcp_read_skb() Revert "ALSA: usb-audio: Split endpoint setups for hw_params and prepare" Revert "net: fec: Use a spinlock to guard `fep->ptp_clk_on`" Revert "fec: Restart PPS after link state change" net: dsa: microchip: lan937x: fix maximum frame length check open: always initialize ownership fields drm/hisilicon: Add depends on MMU drm/mgag200: Force 32 bpp on the console gve: Fix GFP flags when allocing pages bnxt_en: fix flags to check for supported fw version sfc: fix null pointer dereference in efx_hard_start_xmit sfc: fix TX channel offset when using legacy interrupts net: ethernet: mtk_eth_soc: enable XDP support just for MT7986 SoC net: mana: Add rmb after checking owner bits MAINTAINERS: gve: update developers netdevsim: Fix hwstats debugfs file permissions i40e: Fix set max_tx_rate when it is lower than 1 Mbps i40e: Fix VF set max MTU size iavf: Fix set max MTU size with port VLAN and jumbo frames mlxbf_gige: clear MDIO gateway lock after read iavf: Fix bad page state um: Prevent KASAN splats in dump_stack() um: fix default console kernel parameter um: Cleanup compiler warning in arch/x86/um/tls_32.c um: Cleanup syscall_handler_t cast in syscalls_32.h ASoC: tas2770: Reinit regcache on reset ASoC: nau8824: Fix semaphore is released unexpectedly KVM: arm64: Use kmemleak_free_part_phys() to unregister hyp_mem_base efi/dev-path-parser: Refactor _UID handling to use acpi_dev_uid_to_integer() spi: pxa2xx: Refactor _UID handling to use acpi_dev_uid_to_integer() perf: qcom_l2_pmu: Refactor _UID handling to use acpi_dev_uid_to_integer() i2c: mlxbf: Refactor _UID handling to use acpi_dev_uid_to_integer() i2c: amd-mp2-plat: Refactor _UID handling to use acpi_dev_uid_to_integer() ACPI: x86: Refactor _UID handling to use acpi_dev_uid_to_integer() ACPI: LPSS: Refactor _UID handling to use acpi_dev_uid_to_integer() ACPI: utils: Add acpi_dev_uid_to_integer() helper to get _UID as integer s390/dasd: fix Oops in dasd_alias_get_start_dev due to missing pavgroup MIPS: BCM47XX: Cast memcmp() of function to (void *) ASoC: Intel: sof_sdw: add support for Dell SKU 0AFF mips: ralink: convert to DEFINE_SHOW_ATTRIBUTE mips: kernel: convert to DEFINE_SHOW_ATTRIBUTE mips: cavium: convert to DEFINE_SHOW_ATTRIBUTE MIPS: AR7: remove orphan declarations from arch/mips/include/asm/mach-ar7/ar7.h MIPS: remove orphan sni_cpu_time_init() declaration MIPS: IRQ: remove orphan declarations from arch/mips/include/asm/irq.h MIPS: Octeon: remove orphan octeon_hal_setup_reserved32() declaration MIPS: Octeon: remove orphan cvmx_fpa_setup_pool() declaration MIPS: Octeon: remove orphan octeon_swiotlb declaration MIPS: Loongson2ef: remove orphan sbx00_acpi_init() declaration mips: bmips: bcm63268: add TWD block binding MIPS: SGI-IP27: Fix platform-device leak in bridge_platform_create() MIPS: SGI-IP30: Fix platform-device leak in bridge_platform_create() MIPS: Loongson32: Fix PHY-mode being left unspecified MIPS: lantiq: export clk_get_io() for lantiq_wdt.ko mm/slab_common: fix possible double free of kmem_cache ALSA: core: Fix double-free at snd_card_new() m68k: defconfig: Update defconfigs for v6.0-rc2 m68k: Allow kexec on M68KCLASSIC with MMU enabled only m68k: Move from strlcpy with unused retval to strscpy ALSA: hda/realtek: Add a quirk for HP OMEN 16 (8902) mute LED fpga: m10bmc-sec: Fix possible memory leak of flash_buf drm/panel: simple: Fix innolux_g121i1_l01 bus_format Linux 6.0-rc6 io_uring/opdef: rename SENDZC_NOTIF to SEND_ZC io_uring/net: fix zc fixed buf lifetime i2c: mlxbf: prevent stack overflow in mlxbf_i2c_smbus_start_transaction() i2c: mlxbf: incorrect base address passed during io write RISC-V: Avoid coupling the T-Head CMOs and Zicbom riscv: fix a nasty sigreturn bug... riscv: make t-head erratas depend on MMU riscv: fix RISCV_ISA_SVPBMT kconfig dependency warning kasan: call kasan_malloc() from __kmalloc_*track_caller() Documentation: i2c: fix references to other documents MAINTAINERS: remove Nehal Shah from AMD MP2 I2C DRIVER i2c: imx: If pm_runtime_get_sync() returned 1 device access is possible arm64: dts: qcom: sm8350: fix UFS PHY serdes size tcp: Use WARN_ON_ONCE() in tcp_read_skb() ALSA: hda/hdmi: Fix the converter reuse for the silent stream net: Add tests for bonding and team address list management net: team: Unsync device addresses on ndo_stop net: bonding: Unsync device addresses on ndo_stop net: bonding: Share lacpdu_mcast_addr definition net: marvell: prestera: add support for for Aldrin2 net/ieee802154: fix uninit value bug in dgram_sendmsg irqchip/loongson-pch-lpc: Add dependence on LoongArch xen/xenbus: fix xenbus_setup_ring() scsi: mpt3sas: Fix return value check of dma_get_required_mask() scsi: qla2xxx: Fix memory leak in __qlt_24xx_handle_abts() scsi: qedf: Fix a UAF bug in __qedf_probe() soc: bcm: brcmstb: biuctrl: Avoid double of_node_put() io_uring/msg_ring: check file type before putting ALSA: hda/realtek: Add quirk for ASUS GA503R laptop ALSA: hda/realtek: Add pincfg for ASUS G533Z HP jack ALSA: hda/realtek: Add pincfg for ASUS G513 HP jack ALSA: hda/realtek: Re-arrange quirk table entries ALSA: hda/realtek: Enable 4-speaker output Dell Precision 5530 laptop Revert "driver core: Set fw_devlink.strict=1 by default" blk-lib: fix blkdev_issue_secure_erase parisc: Allow CONFIG_64BIT with ARCH=parisc parisc: remove obsolete manual allocation aligning in iosapic drm/amdgpu/mes: zero the sdma_hqd_mask of 2nd SDMA engine for SDMA 6.0.1 drm/amdgpu: make sure to init common IP before gmc drm/amdgpu: move nbio sdma_doorbell_range() into sdma code for vega drm/amdgpu: move nbio ih_doorbell_range() into ih code for vega arm64: dts: qcom: sc8280xp-x13s: Update firmware location selftests/landlock: Fix out-of-tree builds pinctrl: ocelot: Fix interrupt controller gpio: mt7621: Make the irqchip immutable mmc: moxart: fix 4-bit bus width and remove 8-bit bus width mmc: sdhci: Fix host->cmd is null ALSA: hda/realtek: Enable 4-speaker output Dell Precision 5570 laptop cifs: update internal module number cifs: add missing spinlock around tcon refcount drm/rockchip: Fix return type of cdn_dp_connector_mode_valid clk: microchip: mpfs: make the rtc's ahb clock critical clk: microchip: mpfs: fix clk_cfg array bounds violation cifs: always initialize struct msghdr smb_msg completely cifs: don't send down the destination address to sendmsg for a SOCK_STREAM arm64: dts: imx8mp-venice-gw74xx: fix port/phy validation block: blk_queue_enter() / __bio_queue_enter() must return -EAGAIN for nowait drm/amd/display: Mark dml30's UseMinimumDCFCLK() as noinline for stack usage drm/amd/display: Reduce number of arguments of dml31's CalculateFlipSchedule() drm/amd/display: Reduce number of arguments of dml31's CalculateWatermarksAndDRAMSpeedChangeSupport() drm/amd/display: Reduce number of arguments of dml32_CalculatePrefetchSchedule() drm/amd/display: Reduce number of arguments of dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport() drm/amd/display: Refactor SubVP calculation to remove FPU drm/amd/display: Limit user regamma to a valid value drm/amd/display: add workaround for subvp cursor corruption for DCN32/321 drm/amd/display: SW cursor fallback for SubVP drm/amd/display: Round cursor width up for MALL allocation drm/amd/display: Correct dram channel width for dcn314 drm/amd/display: Relax swizzle checks for video non-RGB formats on DCN314 drm/amd/display: Hook up DCN314 specific dml implementation drm/amd/display: Enable dlg and vba compilation for dcn314 drm/amd/display: Fix compilation errors on DCN314 drm/amd/display: Fix divide by zero in DML drm/amd/display: Fixing DIG FIFO Error drm/amd/display: Update MBLK calculation for SubVP drm/amd/display: Revert "Fallback to SW cursor if SubVP + cursor too big" drm/amdgpu: Skip reset error status for psp v13_0_0 drm/amdgpu: add HDP remap functionality to nbio 7.7 drm/amdgpu: change the alignment size of TMR BO to 1M drm/amdgpu: Enable full reset when RAS is supported on gc v11_0_0 drm/amdgpu: use dirty framebuffer helper drm/amdgpu: Don't enable LTR if not supported drm/amd/pm: disable BACO entry/exit completely on several sienna cichlid cards Revert "fs/exec: allow to unshare a time namespace on vfork+exec" Revert "selftests/timens: add a test for vfork+exit" dt-bindings: pinctrl: qcom: drop non-working codeaurora.org emails dt-bindings: power: qcom,rpmpd: drop non-working codeaurora.org emails gpio: ixp4xx: Make irqchip immutable MAINTAINERS: Update HiSilicon GPIO Driver maintainer io_uring/rw: fix error'ed retry return values dt-bindings: apple,aic: Fix required item "apple,fiq-index" in affinity description USB: serial: option: add Quectel RM520N USB: serial: option: add Quectel BG95 0x0203 composition btrfs: zoned: wait for extent buffer IOs before finishing a zone btrfs: fix hang during unmount when stopping a space reclaim worker btrfs: fix hang during unmount when stopping block group reclaim worker tools/include/uapi: Fix <asm/errno.h> for parisc and xtensa Input: hp_sdc: fix spelling typo in comment ASoC: imx-card: Fix refcount issue with of_node_put RISC-V: Clean up the Zicbom block size probing Documentation: mptcp: fix pm_type formatting mptcp: fix fwd memory accounting on coalesce net: phy: aquantia: wait for the suspend/resume operations to finish ALSA: hda: Fix Nvidia dp infoframe ARM: dts: lan966x: Fix the interrupt number for internal PHYs parisc: ccio-dma: Add missing iounmap in error path in ccio_probe() ALSA: hda/realtek: Add quirk for Huawei WRT-WX9 ALSA: hda/tegra: set depop delay for tegra ALSA: hda: add Intel 5 Series / 3400 PCI DID nfsd_splice_actor(): handle compound pages arm64: dts: imx8mp-venice-gw74xx: fix ksz9477 cpu port arm64: dts: imx8mp-venice-gw74xx: fix CAN STBY polarity drm/mediatek: Fix wrong dither settings cifs: revalidate mapping when doing direct writes irqchip: Select downstream irqchip drivers for LoongArch CPU irqchip/gic-v3-its: Remove cpumask_var_t allocation irqchip/stm32-exti: Remove check on always false condition dt-bindings: memory-controllers: fsl,imx8m-ddrc: drop Leonard Crestez Revert "drm/i915/display: Re-add check for low voltage sku for max dp source rate" drm/i915/gt: Fix perf limit reasons bit positions drm/i915/guc: Cancel GuC engine busyness worker synchronously drm/i915: Set correct domains values at _i915_vma_move_to_active drm/i915/vdsc: Set VDSC PIC_HEIGHT before using for DP DSC MIPS: dts: lantiq: rename dts files with soc name being the prefix MIPS: Fix comments typo MIPS: ath25: clean up non-kernel-doc comment warning MIPS: move from strlcpy with unused retval to strscpy MIPS: Fix comment typo arm64: dts: tqma8mqml: Include phy-imx8-pcie.h header wifi: mt76: fix 5 GHz connection regression on mt76x0/mt76x2 wifi: mt76: fix reading current per-tid starting sequence number for aggregation wifi: iwlwifi: Mark IWLMEI as broken arm64: defconfig: enable ARCH_NXP arm64: dts: imx8mp-tqma8mpql-mba8mpxl: add missing pinctrl for RTC alarm ASoC: rt5640: Fix the issue of the abnormal JD2 status mm: fix dereferencing possible ERR_PTR vmscan: check folio_test_private(), not folio_get_private() mm: fix VM_BUG_ON in __delete_from_swap_cache() tools: fix compilation after gfp_types.h split mm/damon/dbgfs: fix memory leak when using debugfs_lookup() mm/migrate_device.c: copy pte dirty bit to page mm/migrate_device.c: add missing flush_cache_page() mm/migrate_device.c: flush TLB while holding PTL x86/mm: disable instrumentations of mm/pgprot.c mm/memory-failure: fall back to vma_address() when ->notify_failure() fails mm/memory-failure: fix detection of memory_failure() handlers xfs: fix SB_BORN check in xfs_dax_notify_failure() xfs: quiet notify_failure EOPNOTSUPP cases mm/page_alloc: fix race condition between build_all_zonelists and page allocation ntfs: fix BUG_ON in ntfs_lookup_inode_by_name() Linux 6.0-rc5 iommu: Fix false ownership failure on AMD systems with PASID activated iommu/vt-d: Fix possible recursive locking in intel_iommu_init() cpufreq: intel_pstate: Add Tigerlake support in no-HWP mode usb: typec: intel_pmc_mux: Use the helper acpi_dev_get_memory_resources() ACPI: resource: Skip IRQ override on Asus Vivobook K3402ZA/K3502ZA ACPI: LPSS: Use the helper acpi_dev_get_memory_resources() ACPI: APD: Use the helper acpi_dev_get_memory_resources() ACPI: resource: Add helper function acpi_dev_get_memory_resources() ACPI: resource: Filter out the non memory resources in is_memory() ACPI: tables: FPDT: Don't call acpi_os_map_memory() on invalid phys address ALSA: hda: Fix hang at HD-audio codec unbinding due to refcount saturation arm64: mm: fix resume for 52-bit enabled builds mksysmap: Fix the mismatch of 'L0' symbols in System.map Bluetooth: Fix HCIGETDEVINFO regression hwmon: (asus-ec-sensors) autoload module via DMI data mips: Select SPARSEMEM_EXTREME io_uring/rw: fix short rw error handling drm/rockchip: vop2: Fix eDP/HDMI sync polarities drm/gma500: Fix (vblank) IRQs not working after suspend/resume drm/gma500: Fix WARN_ON(lock->magic != lock) error drm/gma500: Fix BUG: sleeping function called from invalid context errors block: add missing request flags to debugfs code net: core: fix flow symmetric hash ipvlan: Fix out-of-bound bugs caused by unset skb->mac_header drm/meson: Fix OSD1 RGB to YCbCr coefficient drm/meson: Correct OSD1 global alpha value thunderbolt: Add support for Intel Maple Ridge single port controller NFSD: fix regression with setting ACLs. mm/slub: fix to return errno if kmalloc() fails tracefs: Only clobber mode/uid/gid on remount if asked kprobes: Prohibit probes in gate area perf: RISC-V: fix access beyond allocated array soc: sunxi: sram: Fix debugfs info for A64 SRAM C x86/sgx: Handle VA page allocation failure for EAUG on PF. soc: sunxi: sram: Fix probe function ordering issues x86/sgx: Do not fail on incomplete sanitization on premature stop of ksgxd soc: sunxi: sram: Prevent the driver from being unbound soc: sunxi: sram: Actually claim SRAM regions iavf: Fix cached head and tail value for iavf_get_tx_pending iavf: Fix change VF's mac address ice: Fix crash by keep old cfg when update TCs more than queues perf record: Fix synthesis failure warnings hwmon: (mr75203) enable polling for all VM channels hwmon: (mr75203) fix multi-channel voltage reading perf tools: Don't install data files with x permissions hwmon: (mr75203) fix voltage equation for negative source input hwmon: (mr75203) update pvt->v_num and vm_num to the actual number of used sensors hwmon: (mr75203) fix VM sensor allocation when "intel,vm-map" not defined dt-bindings: hwmon: (mr75203) fix "intel,vm-map" property to be optional perf script: Fix Cannot print 'iregs' field for hybrid systems perf lock: Remove redundant word 'contention' in help message ice: Don't double unplug aux on peer initiated reset drm/panel-edp: Fix delays for Innolux N116BCA-EA1 perf dlfilter dlfilter-show-cycles: Fix types for print format libperf evlist: Fix per-thread mmaps for multi-threaded targets Revert "SUNRPC: Remove unreachable error condition" NFSv4.2: Update mode bits after ALLOCATE and DEALLOCATE io_uring/net: copy addr for zc on POLL_FIRST ARM: dts: fix Moxa SDIO 'compatible', remove 'sdhci' misnomer arm64/ptrace: Don't clear calling process' TIF_SME on OOM fs: only do a memory barrier for the first set_buffer_uptodate() drm/panfrost: devfreq: set opp to the recommended one to configure regulator sch_sfb: Also store skb len before calling child enqueue net: phy: lan87xx: change interrupt src of link_up to comm_ready drm/ttm: cleanup the resource of ghost objects after locking them drm/amdgpu: prevent toc firmware memory leak drm/amdgpu: correct doorbell range/size value for CSDMA_DOORBELL_RANGE drm/amdkfd: print address in hex format rather than decimal drm/amd/display: fix memory leak when using debugfs_lookup() drm/amd/pm: add missing SetMGpuFanBoostLimitRpm mapping for SMU 13.0.7 drm/amd/amdgpu: add rlc_firmware_header_v2_4 to amdgpu_firmware_header powerpc/pseries: Fix plpks crash on non-pseries tools: Add new "test" taint to kernel-chktaint ANDROID: remove inclusions from hook definition headers ANDROID: subsystem-specific vendor_hooks.c for sched ANDROID: remove CONFIG_TRACEPOINTS from hook definition headers io_uring: recycle kbuf recycle on tw requeue io_uring/kbuf: fix not advancing READV kbuf ring efi: capsule-loader: Fix use-after-free in efi_capsule_write arch_topology: Make cluster topology span at least SMT CPUs ANDROID: clang: update to 15.0.1 FROMLIST: fortify: Fix __compiletime_strlen() under UBSAN_BOUNDS_LOCAL dt-bindings: interconnect: fsl,imx8m-noc: drop Leonard Crestez net/smc: Fix possible access to freed memory in link clear serial: tegra-tcu: Use uart_xmit_advance(), fixes icount.tx accounting serial: tegra: Use uart_xmit_advance(), fixes icount.tx accounting serial: Create uart_xmit_advance() usb: dwc3: core: leave default DMA if the controller does not support 64-bit DMA net: ethernet: mtk_eth_soc: check max allowed hash in mtk_ppe_check_skb net: skb: export skb drop reaons to user by TRACE_DEFINE_ENUM net: ethernet: mtk_eth_soc: fix typo in __mtk_foe_entry_clear netfilter: nfnetlink_osf: fix possible bogus match in nf_osf_find() netfilter: nf_conntrack_irc: Tighten matching on DCC message iommu/virtio: Fix interaction with VFIO iommu/vt-d: Fix lockdep splat due to klist iteration in atomic context iommu/vt-d: Fix recursive lock issue in iommu_flush_dev_iotlb() iommu/vt-d: Correctly calculate sagaw value of IOMMU iommu/vt-d: Fix kdump kernels boot failure with scalable mode MIPS: OCTEON: irq: Fix octeon_irq_force_ciu_mapping() selftests: nft_concat_range: add socat support netfilter: nf_conntrack_sip: fix ct_sip_walk_headers MIPS: octeon: Get rid of preprocessor directives around RESERVE32 net: dsa: felix: access QSYS_TAG_CONFIG under tas_lock in vsc9959_sched_speed_set net: dsa: felix: disable cut-through forwarding for frames oversized for tc-taprio net: dsa: felix: tc-taprio intervals smaller than MTU should send at least one packet s390/smp: enforce lowcore protection on CPU restart s390/boot: fix absolute zero lowcore corruption on boot gpio: mpc8xxx: Fix support for IRQ_TYPE_LEVEL_LOW flow_type in mpc85xx ALSA: usb-audio: Clear fixed clock rate at closing EP iommu/amd: use full 64-bit value in build_completion_wait() dma-mapping: mark dma_supported static swiotlb: fix a typo swiotlb: avoid potential left shift overflow dma-debug: improve search for partial syncs Revert "swiotlb: panic if nslabs is too small" RDMA/irdma: Report RNR NAK generation in device caps RDMA/irdma: Use s/g array in post send only when its valid RDMA/irdma: Return correct WC error for bind operation failure RDMA/irdma: Return error on MR deregister CQP failure RDMA/irdma: Report the correct max cqes from query device wifi: iwlwifi: don't spam logs with NSS>2 messages efi/x86: libstub: remove unused variable nvme: requeue aen after firmware activation nvmet: fix mar and mor off-by-one errors ALSA: emu10k1: Fix out of bounds access in snd_emu10k1_pcm_channel_alloc() scsi: mpt3sas: Fix use-after-free warning rv/reactor: add __init/__exit annotations to module init/exit funcs tracing: Fix to check event_mutex is held while accessing trigger list tracing: hold caller_addr to hardirq_{enable,disable}_ip tracepoint: Allow trace events in modules with TAINT_TEST MAINTAINERS: add scripts/tracing/ to TRACING MAINTAINERS: Add Runtime Verification (RV) entry rv/monitors: Make monitor's automata definition static afs: Return -EAGAIN, not -EREMOTEIO, when a file already locked ANDROID: Convert db845c to a mixed build. ANDROID: GKI: Add GKI_HIDDEN_MCP251XFD_CONFIGS drm/i915: consider HAS_FLAT_CCS() in needs_ccs_pages drm/i915: Implement WaEdpLinkRateDataReload drm/i915/slpc: Let's fix the PCODE min freq table setup for SLPC drm/i915/bios: Copy the whole MIPI sequence block ANDROID: kleaf: Do not include GKI modules in default output of //common:kernel_aarch64. cpuset: Add Waiman Long as a cpuset maintainer btrfs: fix the max chunk size and stripe length calculation perf c2c: Prevent potential memory leak in c2c_he_zalloc() perf genelf: Switch deprecated openssl MD5_* functions to new EVP API tools/perf: Fix out of bound access to cpu mask array perf affinity: Fix out of bound access to "sched_cpus" mask net: usb: qmi_wwan: add Quectel RM520N drm/ttm: update bulk move object of ghost BO perf/core: Fix reentry problem in perf_output_read_group() net: dsa: qca8k: fix NULL pointer dereference for of_device_get_match_data tcp: fix early ETIMEDOUT after spurious non-SACK RTO ALSA: hda: Once again fix regression of page allocations with IOMMU arm64/bti: Disable in kernel BTI when cross section thunks are broken ARM: dts: am5748: keep usb4_tm disabled ALSA: usb-audio: Fix an out-of-bounds bug in __snd_usb_parse_audio_interface() ALSA: hda/tegra: Align BDL entry to 4KB boundary nvme-tcp: fix regression that causes sporadic requests to time out nvme-tcp: fix UAF when detecting digest errors arm64: dts: imx8mm-verdin: extend pmic voltages hwmon: (tps23861) fix byte order in resistance register io_uring/notif: Remove the unused function io_notif_complete() Drivers: hv: Never allocate anything besides framebuffer from framebuffer memory region Drivers: hv: Always reserve framebuffer region for Gen1 VMs PCI: Move PCI_VENDOR_ID_MICROSOFT/PCI_DEVICE_ID_HYPERV_VIDEO definitions to pci_ids.h tools: hv: kvp: remove unnecessary (void*) conversions Drivers: hv: remove duplicate word in a comment erofs: fix pcluster use-after-free on UP platforms erofs: avoid the potentially wrong m_plen for big pcluster erofs: fix error return code in erofs_fscache_{meta_,}read_folio asm-generic: Conditionally enable do_softirq_own_stack() via Kconfig. btrfs: zoned: fix mounting with conventional zones btrfs: zoned: set pseudo max append zone limit in zone emulation mode btrfs: zoned: fix API misuse of zone finish waiting stmmac: intel: Simplify intel_eth_pci_remove() net: mvpp2: debugfs: fix memory leak when using debugfs_lookup() ALSA: hda/sigmatel: Fix unused variable warning for beep power change nvmet: fix a use-after-free ALSA: pcm: oss: Fix race at SNDCTL_DSP_SYNC MAINTAINERS: Update maintainers of HiSilicon RoCE RDMA/mlx5: Fix UMR cleanup on error flow of driver init RDMA/mlx5: Set local port to one when accessing counters RDMA/mlx5: Rely on RoCE fw cap instead of devlink when setting profile IB/core: Fix a nested dead lock as part of ODP flow USB: core: Fix RST error in hub.c sched/debug: fix dentry leak in update_sched_domain_debugfs debugfs: add debugfs_lookup_and_remove() driver core: fix driver_set_override() issue with empty strings arm64: dts: rockchip: Remove 'enable-active-low' from rk3566-quartz64-a arm64: dts: rockchip: Remove 'enable-active-low' from rk3399-puma arm64: dts: rockchip: fix property for usb2 phy supply on rk3568-evb1-v10 arm64: dts: rockchip: fix property for usb2 phy supply on rock-3a ipv6: sr: fix out-of-bounds read when setting HMAC data. bonding: accept unsolicited NA message bonding: add all node mcast address when slave up bonding: use unspecified address if no available link local address dmaengine: zynqmp_dma: Typecast with enum to fix the coverity warning dmaengine: ti: k3-udma-private: Fix refcount leak bug in of_xudma_dev_get() arm64: dts: imx8ulp: add #reset-cells for pcc arm64: dts: tqma8mpxl-ba8mpxl: Fix button GPIOs arm64: dts: imx8mn: remove GPU power domain reset Linux 6.0-rc4 Makefile.extrawarn: re-enable -Wformat for clang; take 2 dmaengine: xilinx_dma: Report error in case of dma_set_mask_and_coherent API failure dmaengine: xilinx_dma: cleanup for fetching xlnx,num-fstores property dmaengine: xilinx_dma: Fix devm_platform_ioremap_resource error handling arm64: dts: rockchip: Set RK3399-Gru PCLK_EDP to 24 MHz arm64: dts: imx8mm: Reverse CPLD_Dn GPIO label mapping on MX8Menlo ALSA: hda/sigmatel: Keep power up while beep is enabled RDMA/siw: Pass a pointer to virt_to_page() exfat: fix overflow for large capacity partition gpio: ws16c48: Make irq_chip immutable gpio: 104-idio-16: Make irq_chip immutable gpio: 104-idi-48: Make irq_chip immutable gpio: 104-dio-48e: Make irq_chip immutable ACPI: property: Silence missing-declarations warning in apple.c ACPI: platform: Use PLATFORM_DEVID_NONE in acpi_create_platform_device() ACPI: platform: Sort forbidden_id_list[] in ascending order ACPI: platform: Use sizeof(*pointer) instead of sizeof(type) ACPI: platform: Remove redundant print on -ENOMEM ACPI: platform: Get rid of redundant 'else' ACPI: property: Use acpi_dev_parent() ACPI: bus: Refactor ACPI matching functions for better readability ACPI: bus: Drop kernel doc annotation from acpi_bus_notify() ACPI: docs: enumeration: Fix a few typos and wording mistakes ACPI: tools: pfrut: Do not initialize ret in main() ACPI: EC: Drop unneeded result variable from ec_write() ACPI: video: Add Toshiba Satellite/Portege Z830 quirk ACPI: APEI: Add BERT error log footer powercap: intel_rapl: Add support for RAPTORLAKE_S cpufreq: amd-pstate: Fix initial highest_perf value cpuidle: Remove redundant check in cpuidle_switch_governor() PM: wakeup: Add extra debugging statement for multiple active IRQs block: don't add partitions if GD_SUPPRESS_PART_SCAN is set mm: pagewalk: Fix race between unmap and page walker wifi: use struct_group to copy addresses wifi: mac80211_hwsim: check length for virtio packets wifi: mac80211: fix locking in auth/assoc timeout wifi: mac80211: mlme: release deflink channel in error case wifi: mac80211: fix link warning in RX agg timer expiry LoongArch: mm: Remove the unneeded result variable LoongArch: Fix arch_remove_memory() undefined build error LoongArch: Fix section mismatch due to acpi_os_ioremap() LoongArch: Improve dump_tlb() output messages LoongArch: Adjust arch_do_signal_or_restart() to adapt generic entry LoongArch: Avoid orphan input sections net: dsa: microchip: fix kernel oops on ksz8 switches xen-netback: only remove 'hotplug-status' when the vif is actually destroyed Revert "arch_topology: Make cluster topology span at least SMT CPUs" net: fec: Use a spinlock to guard `fep->ptp_clk_on` net: fec: add pm_qos support on imx6q platform Bluetooth: hci_sync: Fix hci_read_buffer_size_sync iavf: Detach device during reset task i40e: Fix kernel crash during module removal i40e: Fix ADQ rate limiting for PF perf stat: Fix L2 Topdown metrics disappear for raw events Documentation: document ublk ice: use bitmap_free instead of devm_kfree ice: Fix DMA mappings leak drm/edid: Handle EDID 1.4 range descriptor h/vfreq offsets landlock: Fix file reparenting without explicit LANDLOCK_ACCESS_FS_REFER spi: spi: Fix queue hang if previous transfer failed spi: mux: Fix mux interaction with fast path optimisations tcp: TX zerocopy should not sense pfmemalloc status tipc: fix shift wrapping bug in map_get() sch_sfb: Don't assume the skb is still around after enqueueing to child soc: fsl: select FSL_GUTS driver for DPIO xen/grants: prevent integer overflow in gnttab_dma_alloc_pages() xen-blkfront: Cache feature_persistent value before advertisement xen-blkfront: Advertise feature-persistent as user requested xen-blkback: Advertise feature-persistent as user requested powerpc/papr_scm: Ensure rc is always initialized in papr_scm_pmu_register() Revert "powerpc/irq: Don't open code irq_soft_mask helpers" Revert "usb: gadget: udc-xilinx: replace memcpy with memcpy_toio" ALSA: aloop: Fix random zeros in capture data when using jiffies timer Revert "net: phy: meson-gxl: improve link-up behavior" KVM: x86: check validity of argument to KVM_SET_MP_STATE perf/x86/core: Completely disable guest PEBS via guest's global_ctrl KVM: x86: fix memoryleak in kvm_arch_vcpu_create() KVM: x86: Mask off unsupported and unknown bits of IA32_ARCH_CAPABILITIES kunit: fix Kconfig for build-in tests USB4 and Nitro Enclaves kunit: fix assert_type for comparison macros rcutorture: Use the barrier operation specified by cur_ops arch_topology: Make cluster topology span at least SMT CPUs platform/x86: p2sb: Fix UAF when caller uses resource name platform/x86: asus-wmi: Increase FAN_CURVE_BUF_LEN to 32 firmware_loader: Fix memory leak in firmware upload firmware_loader: Fix use-after-free during unregister kbuild: disable header exports for UML in a straightforward way selftests/net: return back io_uring zc send tests io_uring/net: simplify zerocopy send user API io_uring/notif: remove notif registration Revert "io_uring: rename IORING_OP_FILES_UPDATE" Revert "io_uring: add zc notification flush requests" selftests/net: temporarily disable io_uring zc test NFSv4: Turn off open-by-filehandle and NFS re-export for NFSv4.0 SUNRPC: Fix call completion races with call_decode() arch_topology: Silence early cacheinfo errors when non-existent binder: fix alloc->vma_vm_mm null-ptr dereference misc: fastrpc: increase maximum session count misc: fastrpc: fix memory corruption on open misc: fastrpc: fix memory corruption on probe usb: storage: Add ASUS <0x0b05:0x1932> to IGNORE_UAS driver core: Don't probe devices after bus_type.match() probe deferral ALSA: usb-audio: Split endpoint setups for hw_params and prepare platform/mellanox: Remove redundant 'NULL' check platform/mellanox: Remove unnecessary code platform/mellanox: mlxreg-lc: Fix locking issue platform/mellanox: mlxreg-lc: Fix coverity warning platform/x86: acer-wmi: Acer Aspire One AOD270/Packard Bell Dot keymap fixes arm64: mm: Reserve enough pages for the initial ID map perf/arm_pmu_platform: fix tests for platform_get_irq() failure arm64: head: Ignore bogus KASLR displacement on non-relocatable kernels arm64/kexec: Fix missing extra range for crashkres_low. rxrpc: Remove rxrpc_get_reply_time() which is no longer used afs: Use the operation issue time instead of the reply time for callbacks rxrpc: Fix calc of resend age rxrpc: Fix local destruction being repeated rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2() rxrpc: Fix ICMP/ICMP6 error handling mm/slab_common: Deleting kobject in kmem_cache_destroy() without holding slab_mutex/cpu_hotplug_lock perf/x86/core: Completely disable guest PEBS via guest's global_ctrl perf/x86/intel: Fix unchecked MSR access error for Alder Lake N soundwire: qcom: fix device status array range ALSA: usb-audio: Register card again for iface over delayed_register option ALSA: usb-audio: Inform the delayed registration more properly net/smc: Remove redundant refcount increase RDMA/srp: Set scmnd->result only when scmnd is not NULL scsi: core: Fix a use-after-free scsi: core: Revert "Make sure that targets outlive devices" scsi: core: Revert "Make sure that hosts outlive targets" scsi: core: Revert "Simplify LLD module reference counting" scsi: core: Revert "Call blk_mq_free_tag_set() earlier" scsi: lpfc: Add missing destroy_workqueue() in error path scsi: lpfc: Return DID_TRANSPORT_DISRUPTED instead of DID_REQUEUE cpufreq: tegra194: Remove the unneeded result variable Revert "sch_cake: Return __NET_XMIT_STOLEN when consuming enqueued skb" tcp: make global challenge ack rate limitation per net-ns and default disabled tcp: annotate data-race around challenge_timestamp net: dsa: hellcreek: Print warning only once ip: fix triggering of 'icmp redirect' clk: ingenic-tcu: Properly enable registers before accessing timers netfilter: nf_conntrack_irc: Fix forged IP logic mm/rmap: Fix anon_vma->degree ambiguity leading to double-reuse sch_cake: Return __NET_XMIT_STOLEN when consuming enqueued skb x86/cpu: Add CPU model numbers for Meteor Lake drm/amd/amdgpu: skip ucode loading if ucode_size == 0 selftests: net: sort .gitignore file Documentation: networking: correct possessive "its" kcm: fix strp_init() order and cleanup PM: suspend: move from strlcpy() with unused retval to strscpy() mlxbf_gige: compute MDIO period based on i1clk intel_idle: move from strlcpy() with unused retval to strscpy() cpuidle: powernv: move from strlcpy() with unused retval to strscpy() Revert "clk: core: Honor CLK_OPS_PARENT_ENABLE for clk gate ops" cpufreq: amd-pstate: update pstate frequency transition delay time cpufreq: amd_pstate: map desired perf into pstate scope for powersave governor cpufreq: amd_pstate: fix wrong lowest perf fetch cpufreq: amd-pstate: fix white-space cpufreq: amd-pstate: simplify cpudata pointer assignment cpuidle: coupled: Drop duplicate word from a comment Revert "ANDROID: virt_wifi: Add data ops for scan data simulation" perf script: Skip dummy event attr check riscv: dts: microchip: use an mpfs specific l2 compatible dt-bindings: riscv: sifive-l2: add a PolarFire SoC compatible gpio: realtek-otto: switch to 32-bit I/O cachefiles: make on-demand request distribution fairer cachefiles: fix error return code in cachefiles_ondemand_copen() vfio/type1: Unpin zero pages fscache: fix misdocumented parameter USB: serial: ch341: fix disabled rx timer on older devices USB: serial: ch341: fix lost character on LCR updates powerpc: Fix hard_irq_disable() with sanitizer ethernet: rocker: fix sleep in atomic context bug in neigh_timer_handler USB: serial: cp210x: add Decagon UCA device id perf metric: Return early if no CPU PMU table exists selftests/nolibc: Avoid generated files being committed selftests/nolibc: add a "help" target selftests/nolibc: "sysroot" target installs a local copy of the sysroot selftests/nolibc: add a "run" target to start the kernel in QEMU selftests/nolibc: add a "defconfig" target selftests/nolibc: add a "kernel" target to build the kernel with the initramfs selftests/nolibc: support glibc as well selftests/nolibc: condition some tests on /proc existence selftests/nolibc: recreate and populate /dev and /proc if missing selftests/nolibc: on x86, support exiting with isa-debug-exit selftests/nolibc: exit with poweroff on success when getpid() == 1 selftests/nolibc: add a few tests for some libc functions selftests/nolibc: implement a few tests for various syscalls selftests/nolibc: support a test definition format selftests/nolibc: add basic infrastructure to ease creation of nolibc tests tools/nolibc: make sys_mmap() automatically use the right __NR_mmap definition tools/nolibc: fix build warning in sys_mmap() when my_syscall6 is not defined tools/nolibc: make argc 32-bit in riscv startup code tools/memory-model: Clarify LKMM's limitations in litmus-tests.txt docs/memory-barriers.txt: Fixup long lines docs/memory-barriers.txt: Fix confusing name of 'data dependency barrier' rcu-tasks: Make RCU Tasks Trace check for userspace execution rcu-tasks: Ensure RCU Tasks Trace loops have quiescent states rcu-tasks: Convert RCU_LOCKDEP_WARN() to WARN_ONCE() srcu: Make Tiny SRCU use full-sized grace-period counters srcu: Make Tiny SRCU poll_state_synchronize_srcu() more precise srcu: Add GP and maximum requested GP to Tiny SRCU rcutorture output rcutorture: Make "srcud" option also test polled grace-period API rcutorture: Limit read-side polling-API testing rcu: Add functions to compare grace-period state values rcutorture: Expand rcu_torture_write_types() first "if" statement rcutorture: Use 1-suffixed variable in rcu_torture_write_types() check rcu: Make synchronize_rcu() fastpath update only boot-CPU counters rcutorture: Adjust rcu_poll_need_2gp() for rcu_gp_oldstate field removal rcu: Remove ->rgos_polled field from rcu_gp_oldstate structure rcu: Make synchronize_rcu_expedited() fast path update .expedited_sequence rcu: Remove expedited grace-period fast-path forward-progress helper rcu: Make synchronize_rcu() fast path update ->gp_seq counters rcu-tasks: Remove grace-period fast-path rcu-tasks helper rcu: Set rcu_data structures' initial ->gpwrap value to true rcu: Disable run-time single-CPU grace-period optimization rcu: Add full-sized polling for cond_sync_exp_full() rcu: Add full-sized polling for cond_sync_full() rcu: Remove blank line from poll_state_synchronize_rcu() docbook header rcu: Add full-sized polling for start_poll_expedited() rcu: Add full-sized polling for start_poll() rcutorture: Verify long-running reader prevents full polling from completing rcutorture: Remove redundant RTWS_DEF_FREE check rcutorture: Verify RCU reader prevents full polling from completing rcutorture: Allow per-RCU-flavor polled double-GP check rcutorture: Abstract synchronous and polled API testing rcu: Add full-sized polling for get_state() rcu: Add full-sized polling for get_completed*() and poll_state*() rcu/nocb: Add CPU number to CPU-{,de}offload failure messages rcu/nocb: Choose the right rcuog/rcuop kthreads to output rcu/kvfree: Update KFREE_DRAIN_JIFFIES interval rcu/kfree: Fix kfree_rcu_shrink_count() return value rcu: Back off upon fill_page_cache_func() allocation failure rcu: Exclude outgoing CPU when it is the last to leave rcu: Avoid triggering strict-GP irq-work when RCU is idle sched/debug: Show the registers of 'current' in dump_cpu_task() sched/debug: Try trigger_single_cpu_backtrace(cpu) in dump_cpu_task() rcu: Update rcu_access_pointer() header for rcu_dereference_protected() rcu: Document reason for rcu_all_qs() call to preempt_disable() rcu: Make tiny RCU support leak callbacks for debug-object errors rcu: Add QS check in rcu_exp_handler() for non-preemptible kernels rcu: Update rcu_preempt_deferred_qs() comments for !PREEMPT kernels rcu: Fix rcu_read_unlock_strict() strict QS reporting doc/rcu: Update LWN article URLs and add 2019 article doc: SLAB_TYPESAFE_BY_RCU uses cannot rely on spinlocks doc: Update rcu_access_pointer() advice in rcu_dereference.rst doc: Fix list: rcu_access_pointer() is not lockdep-checked doc: Use rcu_barrier() to rate-limit RCU callbacks doc: Call out queue_rcu_work() for blocking RCU callbacks doc: Emphasize the need for explicit RCU read-side markers gpio: pca953x: Add mutex_lock for regcache sync in PM netfilter: nf_tables: clean up hook list when offload flags check fails regulator: Fix qcom,spmi-regulator schema netfilter: br_netfilter: Drop dst references before setting. netfilter: remove nf_conntrack_helper sysctl and modparam toggles Revert "usb: add quirks for Lenovo OneLink+ Dock" media: uvcvideo: Fix InterfaceProtocol for Quanta camera ARM: dts: at91: sama5d2_icp: don't keep vdd_other enabled all the time ARM: dts: at91: sama5d27_wlsom1: don't keep ldo2 enabled all the time ARM: dts: at91: sama7g5ek: specify proper regulator output ranges ARM: dts: at91: sama5d2_icp: specify proper regulator output ranges ARM: dts: at91: sama5d27_wlsom1: specify proper regulator output ranges ARM: at91: pm: fix DDR recalibration when resuming from backup and self-refresh ARM: at91: pm: fix self-refresh for sama7g5 net: lan966x: improve error handle in lan966x_fdma_rx_get_frame() nfp: fix the access to management firmware hanging net: phy: micrel: Make the GPIO to be non-exclusive net: virtio_net: fix notification coalescing comments nvmet-tcp: fix unhandled tcp states in nvmet_tcp_state_change() nvmet-auth: add missing goto in nvmet_setup_auth() nvme-pci: add NVME_QUIRK_BOGUS_NID for Lexar NM610 cifs: fix small mempool leak in SMB2_negotiate() smb3: use filemap_write_and_wait_range instead of filemap_write_and_wait drm/amdgpu: only init tap_delay ucode when it's included in ucode binary drm/amd/display: Fix black flash when switching from ODM2to1 to ODMBypass drm/amd/display: Fix check for stream and plane drm/amd/display: Re-initialize viewport after pipe merge drm/amd/display: Use correct plane for CAB cursor size allocation drm/amdgpu: ensure no PCIe peer access for CPU XGMI iolinks drm/amd/pm: bump SMU 13.0.0 driver_if header version drm/amd/pm: use vbios carried pptable for all SMU13.0.7 SKUs drm/amd/pm: use vbios carried pptable for those supported SKUs drm/amd/display: fix wrong register access drm/amd/display: use actual cursor size instead of max for CAB allocation drm/amd/display: disable display fresh from MALL on an edge case for DCN321 drm/amd/display: Fix CAB cursor size allocation for DCN32/321 drm/amd/display: Missing HPO instance added drm/amd/display: set dig fifo read start level to 7 before dig fifo reset drm/amdgpu: Fix use-after-free in amdgpu_cs_ioctl drm/amd/display: Fix OTG H timing reset for dcn314 drm/amd/display: Fix DCN32 DPSTREAMCLK_CNTL programming drm/amdgpu: Update mes_v11_api_def.h drm/amdgpu: disable FRU access on special SIENNA CICHLID card s390/hugetlb: fix prepare_hugepage_range() check for 2 GB hugepages s390: update defconfigs s390: fix nospec table alignments s390/mm: remove useless hugepage address alignment wifi: iwlegacy: 4965: corrected fix for potential off-by-one overflow in il4965_rs_fill_link_cmd() wifi: wilc1000: fix DMA on stack objects staging: rtl8712: fix use after free bugs reset: microchip-sparx5: issue a reset on startup reset: imx7: Fix the iMX8MP PCIe PHY PERST support usb: cdns3: fix issue with rearming ISO OUT endpoint usb: cdns3: fix incorrect handling TRB_SMM flag for ISOC transfer usb: gadget: mass_storage: Fix cdrom data transfers on MAC-OS media: mceusb: Use new usb_control_msg_*() routines USB: core: Prevent nested device-reset calls USB: gadget: Fix obscure lockdep violation for udc_mutex usb: dwc2: fix wrong order of phy_power_on and phy_init usb: gadget: udc-xilinx: replace memcpy with memcpy_toio usb: typec: Remove retimers properly usb: dwc3: disable USB core PHY management usb: add quirks for Lenovo OneLink+ Dock net/sched: fix netdevice reference leaks in attach_default_qdiscs() tty: n_gsm: avoid call of sleeping functions from atomic context tty: n_gsm: replace kicktimer with delayed_work tty: n_gsm: initialize more members at gsm_alloc_mux() tty: n_gsm: add sanity check for gsm->receive in gsm_receive_buf() tty: serial: atmel: Preserve previous USART mode if RS485 disabled tty: serial: lpuart: disable flow control while waiting for the transmit engine to complete tty: Fix lookahead_buf crash with serdev serial: fsl_lpuart: RS485 RTS polariy is inverse vt: Clear selection before changing the font ACPI: Drop redundant acpi_dev_parent() header ACPI: PM: Fix NULL argument handling in acpi_device_get/set_power() ARM: 9229/1: amba: Fix use-after-free in amba_read_periphid() dt-bindings: i2c: renesas,riic: Fix 'unevaluatedProperties' warnings net: sched: tbf: don't call qdisc_put() while holding tree lock cpufreq: bmips-cpufreq: Use module_init and add module_exit RDMA/hns: Remove the num_qpc_timer variable RDMA/hns: Fix wrong fixed value of qp->rq.wqe_shift RDMA/hns: Fix supported page size phy: marvell: phy-mvebu-a3700-comphy: Remove broken reset support hwmon: (gpio-fan) Fix array out of bounds access MAINTAINERS: Update Bjorn's email address arm64: dts: qcom: sc7280: move USB wakeup-source property arm64: dts: qcom: thinkpad-x13s: Fix firmware location arm64: dts: qcom: sm8150: Fix fastrpc iommu values tracing: Define the is_signed_type() macro once docs: i2c: piix4: Fix typos, add markup, drop link Input: iforce - add support for Boeder Force Feedback Wheel soc: brcmstb: pm-arm: Fix refcount leak and __iomem leak bugs bus: mhi: host: Fix up null pointer access in mhi_irq_handler drm/i915: Skip wm/ddb readout for disabled pipes drm/i915/glk: ECS Liva Q2 needs GLK HDMI port timing quirk drm/i915: fix null pointer dereference drm/i915/backlight: Disable pps power hook for aux based backlight drm/i915/display: avoid warnings when registering dual panel backlight drm/i915/dsi: fix dual-link DSI backlight and CABC ports for display 11+ drm/i915/dsi: filter invalid backlight and CABC ports drm/i915/guc: clear stalled request after a reset drm/i915/ttm: fix CCS handling USB: serial: option: add support for Cinterion MV32-WA/WB RmNet mode USB: serial: ftdi_sio: add Omron CS1W-CIF31 device id USB: serial: option: add Quectel EM060K modem MIPS: loongson32: ls1c: Fix hang during startup net: Use u64_stats_fetch_begin_irq() for stats fetch. net: dsa: xrs700x: Use irqsave variant for u64 stats update USB: serial: option: add support for OPPO R11 diag port KVM: s390: pci: Hook to access KVM lowlevel from VFIO ARM: configs: at91: remove CONFIG_MICROCHIP_PIT64B docs: i2c: i2c-topology: reorder sections more logically docs: i2c: i2c-topology: fix incorrect heading docs: i2c: i2c-topology: fix typo ieee802154: cc2520: add rc code in cc2520_tx() net: mac802154: Fix a condition in the receive path ARM: ixp4xx: fix typos in comments RDMA/cma: Fix arguments order in net device validation arm64: dts: renesas: r8a779g0: Fix HSCIF0 interrupt number scripts/extract-ikconfig: add zstd compression support scripts: remove obsolete gcc-ld script smb3: fix temporary data corruption in insert range smb3: fix temporary data corruption in collapse range smb3: Move the flush out of smb2_copychunk_range() into its callers gpio: mockup: remove gpio debugfs when remove device RDMA/irdma: Fix drain SQ hang with no completion ALSA: usb-audio: Add quirk for LH Labs Geek Out HD Audio 1V5 ALSA: hda/realtek: Add speaker AMP init for Samsung laptops with ALC298 Input: iforce - wake up after clearing IFORCE_XMIT_RUNNING flag r8152: add PID for the Lenovo OneLink+ Dock nfp: flower: fix ingress police using matchall filter openvswitch: fix memory leak at failed datapath creation net: smsc911x: Stop and start PHY during suspend and resume tg3: Disable tg3 device on system reboot to avoid triggering AER net: sparx5: fix handling uneven length packets in manual extraction docs/conf.py: add function attribute '__fix_address' to conf.py Smack: Provide read control for io_uring_cmd io_uring/net: fix overexcessive retries /dev/null: add IORING_OP_URING_CMD support selinux: implement the security_uring_cmd() LSM hook lsm,io_uring: add LSM hooks for the new uring_cmd file op ALSA: control: Re-order bounds checking in get_ctl_id_hash() wifi: mt76: mt7921e: fix crash in chip reset fail platform/x86: thinkpad_acpi: Explicitly set to balanced mode on startup crypto: lib - remove unneeded selection of XOR_BLOCKS platform/x86: asus-wmi: Fix the name of the mic-mute LED classdev pinctrl: sunxi: Fix name for A100 R_PIO Bluetooth: hci_sync: hold hdev->lock when cleanup hci_conn Bluetooth: move from strlcpy with unused retval to strscpy Bluetooth: hci_event: Fix checking conn for le_conn_complete_evt Bluetooth: ISO: Fix not handling shutdown condition Bluetooth: hci_sync: fix double mgmt_pending_free() in remove_adv_monitor() Bluetooth: MGMT: Fix Get Device Flags Bluetooth: L2CAP: Fix build errors in some archs Bluetooth: hci_sync: Fix suspend performance regression Bluetooth: hci_event: Fix vendor (unknown) opcode status handling powerpc/rtas: Fix RTAS MSR[HV] handling for Cell Revert "powerpc: Remove unused FW_FEATURE_NATIVE references" powerpc: align syscall table for ppc32 bpf: Don't use tnum_range on array range checking for poke descriptors selftests/bpf: Add regression test for pruning fix bpf: Do mark_chain_precision for ARG_CONST_ALLOC_SIZE_OR_ZERO of/device: Fix up of_dma_configure_id() stub Docs/admin-guide/mm/damon/usage: fix the example code snip docs: Update version number from 5.x to 6.x in README.rst ACPI: bus: Remove the unneeded result variable ACPI: OSI: Update Documentation on custom _OSI strings ACPI: OSI: Remove Linux-HPI-Hybrid-Graphics _OSI string ACPI: OSI: Remove Linux-Lenovo-NV-HDMI-Audio _OSI string ACPI: OSI: Remove Linux-Dell-Video _OSI string Revert "xhci: turn off port power in shutdown" xhci: Add grace period after xHC start to prevent premature runtime suspend. xhci: Fix null pointer dereference in remove if xHC has only one roothub drm/mediatek: dsi: Add atomic {destroy,duplicate}_state, reset callbacks ASoC: fsl_aud2htx: Add error handler for pm_runtime_enable ASoC: fsl_aud2htx: register platform component before registering cpu dai HID: nintendo: fix rumble worker null pointer deref HID: intel-ish-hid: ipc: Add Meteor Lake PCI device ID pinctrl: rockchip: Enhance support for IRQ_TYPE_EDGE_BOTH ACPI: CPPC: Add ACPI disabled check to acpi_cpc_valid() regulator: pfuze100: Fix the global-out-of-bounds access in pfuze100_regulator_probe() dma-buf/dma-resv: check if the new fence is really later HID: input: fix uclogic tablets HID: Add Apple Touchbar on T2 Macs in hid_have_special_driver list HID: add Lenovo Yoga C630 battery quirk HID: AMD_SFH: Add a DMI quirk entry for Chromebooks tee: fix compiler warning in tee_shm_register() HID: thrustmaster: Add sparco wheel and fix array length hid: intel-ish-hid: ishtp: Fix ishtp client sending disordered message HID: ishtp-hid-clientHID: ishtp-hid-client: Fix comment typo HID: asus: ROG NKey: Ignore portion of 0x5a report HID: hidraw: fix memory leak in hidraw_release() efi: libstub: Disable struct randomization HID: steam: Prevent NULL pointer dereference in steam_{recv,send}_report wifi: mac80211: potential NULL dereference in ieee80211_tx_control_port() wifi: cfg80211: debugfs: fix return type in ht40allow_map_read() wifi: mac80211: Don't finalize CSA in IBSS mode if state is disconnected wifi: mac80211: fix possible leak in ieee80211_tx_control_port() wifi: mac80211: always free sta in __sta_info_alloc in case of error wifi: mac80211: Fix UAF in ieee80211_scan_rx() powerpc/pci: Enable PCI domains in /proc when PCI bus numbers are not unique ACPI: Drop parent field from struct acpi_device ALSA: control: Fix an out-of-bounds bug in get_ctl_id_hash() dt-bindings: opp: Add missing (unevaluated|additional)Properties on child nodes ALSA: hda: intel-nhlt: Correct the handling of fmt_config flexible array ALSA: seq: Fix data-race at module auto-loading drm/i915/backlight: Disable pps power hook for aux based backlight drm/i915/display: avoid warnings when registering dual panel backlight drm/i915/dsi: fix dual-link DSI backlight and CABC ports for display 11+ drm/i915/dsi: filter invalid backlight and CABC ports drm/i915/guc: clear stalled request after a reset drm/i915/ttm: fix CCS handling clk: bcm: rpi: Show clock id limit in error case clk: bcm: rpi: Add missing newline clk: bcm: rpi: Prevent out-of-bounds access bpf: Fix a data-race around bpf_jit_limit. cpufreq: schedutil: Move max CPU capacity to sugov_policy Input: goodix - add compatible string for GT1158 ACPI: move from strlcpy() with unused retval to strscpy() ACPI: PM: Fix acpi_dev_state_d0() kerneldoc ASoC: SOF: ipc4-topology: fix alh_group_ida max value ASoC: mchp-spdiftx: Fix clang -Wbitfield-constant-conversion ACPI: scan: Eliminate __acpi_device_add() ACPI: scan: Rearrange initialization of ACPI device objects ACPI: scan: Rename acpi_bus_get_parent() and rearrange it ACPI: Rename acpi_bus_get/put_acpi_device() soundwire: qcom: remove duplicate reset control get ALSA: seq: oss: Fix data-race for max_midi_devs access ASoC: SOF: Kconfig: Make IPC_MESSAGE_INJECTOR depend on SND_SOC_SOF ASoC: SOF: Kconfig: Make IPC_FLOOD_TEST depend on SND_SOC_SOF arm64: dts: rockchip: fix upper usb port on BPI-R2-Pro arm64: dts: rockchip: Fix typo in lisense text for PX30.Core arm64: dts: rockchip: Pull up wlan wake# on Gru-Bob arm64: dts: rockchip: Lower sd speed on quartz64-b ASoC: fsl_mqs: Fix supported clock DAI format ASoC: nau8540: Implement hw constraint for rates ASoC: nau8825: Implement hw constraint for rates ASoC: nau8824: Implement hw constraint for rates ASoC: nau8824: Fix semaphore unbalance at error paths ASoC: nau8821: Implement hw constraint for rates firmware: arm_scmi: Harmonize SCMI tracing message format firmware: arm_scmi: Add SCMI PM driver remove routine firmware: arm_scmi: Fix the asynchronous reset requests firmware: arm_scmi: Harden accesses to the reset domains Revert "iommu/of: Delete usage of driver_deferred_probe_check_state()" Revert "PM: domains: Delete usage of driver_deferred_probe_check_state()" Revert "net: mdio: Delete usage of driver_deferred_probe_check_state()" Revert "driver core: Delete driver_deferred_probe_check_state()" net/ieee802154: fix repeated words in comments ieee802154/adf7242: defer destroy_workqueue call Revert "usb: typec: ucsi: add a common function ucsi_unregister_connectors()" usb: dwc3: qcom: suppress unused-variable warning MAINTAINERS: add include/dt-bindings/input to INPUT DRIVERS clk: bcm: rpi: Fix error handling of raspberrypi_fw_get_rate powerpc/papr_scm: Fix nvdimm event mappings Input: rk805-pwrkey - fix module autoloading clk: core: Fix runtime PM sequence in clk_core_unprepare() clk: core: Honor CLK_OPS_PARENT_ENABLE for clk gate ops firmware: arm_scmi: Harden accesses to the sensor domains firmware: arm_scmi: Improve checks in the info_get operations firmware: arm_scmi: Fix missing kernel-doc in optee spi: cadence-quadspi: Disable irqs during indirect reads regulator: core: Clean up on enable failure ASoC: mediatek: mt8186: fix DMIC record noise ALSA: memalloc: Revive x86-specific WC page allocations again mmc: core: Fix inconsistent sd3_bus_mode at UHS-I SD voltage switch failure mmc: core: Fix UHS-I SD 1.8V workaround branch pinctrl: qcom: sc8180x: Fix wrong pin numbers pinctrl: qcom: sc8180x: Fix gpio_wakeirq_map drm/i915/gvt: Fix Comet Lake drm/i915/reg: Fix spelling mistake "Unsupport" -> "Unsupported" arm64: dts: freescale: verdin-imx8mp: fix atmel_mxt_ts reset polarity arm64: dts: freescale: verdin-imx8mm: fix atmel_mxt_ts reset polarity arm64: dts: imx8mp: Fix I2C5 GPIO assignment on i.MX8M Plus DHCOM arm64: dts: imx8mm-venice-gw7901: fix port/phy validation arm64: dts: verdin-imx8mm: add otg2 pd to usbphy iio: light: cm32181: make cm32181_pm_ops static iio: ad7292: Prevent regulator double disable dt-bindings: iio: gyroscope: bosch,bmg160: correct number of pins iio: adc: mcp3911: use correct formula for AD conversion iio: adc: mcp3911: correct "microchip,device-addr" property soc: imx: gpcv2: Assert reset before ungating clock arm64: dts: ls1028a-qds-65bb: don't use in-band autoneg for 2500base-x ARM: dts: imx6qdl-kontron-samx6i: fix spi-flash compatible ARM: dts: imx6qdl-kontron-samx6i: remove duplicated node ARM: dts: imx6qdl-vicut1.dtsi: Fix node name backlight_led RDMA/rtrs-srv: Pass the correct number of entries for dma mapped SGL RDMA/rtrs-clt: Use the right sg_cnt after ib_dma_map_sg arm64: dts: imx8mq-tqma8mq: Remove superfluous interrupt-names arm64: dts: imx8mp: Adjust ECSPI1 pinmux on i.MX8M Plus DHCOM arm64: dts: imx8mp-venice-gw74xx: fix sai2 pin settings batman-adv: Fix hang up with small MTU hard-interface clk: ti: Fix missing of_node_get() ti_find_clock_provider() riscv: kvm: move extern sbi_ext declarations to a header riscv: kvm: vcpu_timer: fix unused variable warnings docs/ja_JP/SubmittingPatches: Remove reference to submitting-drivers.rst gpio: pxa: use devres for the clock struct MAINTAINERS: rectify entry for XILINX GPIO DRIVER KVM: selftests: Fix ambiguous mov in KVM_ASM_SAFE() KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang KVM: VMX: Heed the 'msr' argument in msr_write_intercepted() kvm: x86: mmu: Always flush TLBs when enabling dirty logging kvm: x86: mmu: Drop the need_remote_flush() function dt-bindings: usb: mtu3: add compatible for mt8188 USB: cdc-acm: Add Icom PMR F3400 support (0c26:0020) usb: gadget: f_uac2: fix superspeed transfer Revert "binder_alloc: Add missing mmap_lock calls when using the VMA" ARM: dts: versatile: Update spi clock-names property ARM: dts: realview: Update spi clock-names property ARM: dts: integratorap: Update spi node properties usb: xhci-mtk: fix bandwidth release issue usb: xhci-mtk: relax TT periodic bandwidth allocation bpf, cgroup: Fix kernel BUG in purge_effective_progs usb: typec: altmodes/displayport: correct pin assignment for UFP receptacles ip_tunnel: Respect tunnel key's "flow_flags" in IP tunnels usb: misc: onboard_usb_hub: Drop reset delay in onboard_hub_power_off() usb: dwc3: gadget: Avoid duplicate requests to enable Run/Stop usb: dwc3: pci: Add support for Intel Raptor Lake usb: typec: intel_pmc_mux: Add new ACPI ID for Meteor Lake IOM device dt-bindings: usb: qcom,dwc3: Add SM6375 compatible usb: dwc3: qcom: clean up suspend callbacks usb: dwc3: qcom: fix wakeup implementation dt-bindings: usb: qcom,dwc3: add wakeup-source property usb: dwc3: qcom: fix peripheral and OTG suspend usb: dwc3: qcom: fix runtime PM wakeup usb: dwc3: qcom: fix use-after-free on runtime-PM wakeup usb: dwc3: qcom: fix gadget-only builds Revert "usb: dwc3: qcom: Keep power domain on to retain controller status" usb: dwc3: fix PHY disable sequence docs: kerneldoc-preamble: Test xeCJK.sty before loading MAINTAINERS: Update email of Neil Armstrong maintainer-pgp-guide: minor wording tweaks maintainer-pgp-guide: add a section on PGP-signed patches maintainer-pgp-guide: update ECC support information maintainer-pgp-guide: remove keyserver instructions maintainer-pgp-guide: use key terminology consistent with upstream Documentation: irqdomain: Fix typo of "at least once" docs/zh_CN: Update the translation of gpio to 6.0-rc1 usb-storage: Add ignore-residue quirk for NXP PN7462AU usb: typec: tcpm: Return ENOTSUPP for power supply prop writes serial: document start_rx member at struct uart_ops musb: fix USB_MUSB_TUSB6010 dependency binder_alloc: Add missing mmap_lock calls when using the VMA binder: fix UAF of ref->proc caused by race condition regmap: spi: Reserve space for register address/padding ASoC: SOF: ipc4-topology: fix wrong use of sizeof in sof_ipc4_widget_setup_comp_src() thunderbolt: Check router generation before connecting xHCI thunderbolt: Use the actual buffer in tb_async_error() bpf: Restrict bpf_sys_bpf to CAP_PERFMON bpf: Partially revert flexible-array member replacement skmsg: Fix wrong last sg check in sk_msg_recvmsg() hwmon: (pmbus) Fix vout margin caching hwmon: (pmbus) Use dev_err_probe() to filter -EPROBE_DEFER error messages ASoC: qcom: sm8250: add missing module owner arm64: dts: imx8mm-verdin: use level interrupt for mcp251xfd arm64: dts: imx8mm-verdin: update CAN clock to 40MHz Revert "soc: imx: imx8m-blk-ctrl: set power device name" of: fdt: fix off-by-one error in unflatten_dt_nodes() workqueue: don't skip lockdep work dependency in cancel_work_sync() staging: r8188eu: Add Rosewill USB-N150 Nano to device tables staging: r8188eu: add firmware dependency ASoC: fsl_sai: fix incorrect mclk number in error message cpufreq: Add SM6115 to cpufreq-dt-platdev blocklist OPP: Fix an un-initialized variable usage iio: light: cm3605: Fix an error handling path in cm3605_probe() iio: adc: mcp3911: make use of the sign bit peci: cpu: Fix use-after-free in adev_release() peci: aspeed: fix error check return value of platform_get_irq() drm/msm/rd: Fix FIFO-full deadlock drm/msm/gpu: Drop qos request if devm_devfreq_add_device() fails ARM: dts: bcmbca: bcm6878: cosmetic change ARM: dts: bcmbca: bcm6878: fix timer node cpu mask flag ARM: dts: bcmbca: bcm6846: fix interrupt controller node ARM: dts: bcmbca: bcm6846: clean up psci node ARM: dts: bcmbca: bcm6846: fix timer node cpu mask flag ARM: dts: bcmbca: bcm63178: cosmetic change ARM: dts: bcmbca: bcm63178: fix interrupt controller node ARM: dts: bcmbca: bcm63178: clean up psci node ARM: dts: bcmbca: bcm63178: fix timer node cpu mask flag tools: hv: Remove an extraneous "the" drm/hyperv: Fix an error handling path in hyperv_vmbus_probe() xsk: Fix corrupted packets for XDP_SHARED_UMEM ASoC: cs42l42: Only report button state if there was a button interrupt arm64: dts: juno: Add missing MHU secure-irq arm64: dts: arm: juno: Remove legacy Coresight 'slave-mode' property platform/surface: aggregator_registry: Add HID devices for sensors and UCSI client to SP8 platform/surface: aggregator_registry: Rename HID device nodes based on new findings platform/surface: aggregator_registry: Rename HID device nodes based on their function platform/surface: aggregator_registry: Add support for Surface Laptop Go 2 platform/x86: x86-android-tablets: Fix broken touchscreen on Chuwi Hi8 with Windows BIOS platform/x86: pmc_atom: Fix SLP_TYPx bitfield mask drm/i915/gvt: Fix kernel-doc drm/i915/gvt: Fix kernel-doc drm/i915/gvt: Fix kernel-doc drm/i915/gvt: fix typo in comment spi: bitbang: Fix lsb-first Rx selftests/bpf: Add lru_bug to s390x deny list Input: goodix - add support for GT1158 dt-bindings: input: touchscreen: add compatible string for Goodix GT1158 drm/msm/dsi: Fix number of regulators for SDM660 drm/msm/dsi: Fix number of regulators for msm8996_dsi_cfg drm/msm/dp: delete DP_RECOVERED_CLOCK_OUT_EN to fix tps4 MAINTAINERS: add the Polarfire SoC's i2c driver MAINTAINERS: add PolarFire SoC dt bindings fsdax: Fix infinite loop in dax_iomap_rw() drm/msm/dpu: populate wb or intf before reset_intf_cfg drm/msm/dsi: fix the inconsistent indenting drm/msm/dp: make eDP panel as the first connected connector nvdimm/namespace: drop nested variable in create_namespace_pmem() ndtest: Cleanup all of blk namespace specific code pmem: fix a name collision ARM: dts: am33xx: Fix MMCHS0 dma properties Conflicts: Documentation/devicetree/bindings Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-gx-ao-secure.yaml Documentation/devicetree/bindings/display/amlogic,meson-dw-hdmi.yaml Documentation/devicetree/bindings/display/amlogic,meson-vpu.yaml Documentation/devicetree/bindings/display/bridge/analogix,anx7814.yaml Documentation/devicetree/bindings/display/bridge/ite,it66121.yaml Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.yaml Documentation/devicetree/bindings/dma/moxa,moxart-dma.txt Documentation/devicetree/bindings/hwmon/moortec,mr75203.yaml Documentation/devicetree/bindings/i2c/amlogic,meson6-i2c.yaml Documentation/devicetree/bindings/i2c/renesas,riic.yaml Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml Documentation/devicetree/bindings/iio/gyroscope/bosch,bmg160.yaml Documentation/devicetree/bindings/input/touchscreen/goodix.yaml Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml Documentation/devicetree/bindings/interrupt-controller/apple,aic.yaml Documentation/devicetree/bindings/mailbox/amlogic,meson-gxbb-mhu.yaml Documentation/devicetree/bindings/media/amlogic,axg-ge2d.yaml Documentation/devicetree/bindings/media/amlogic,gx-vdec.yaml Documentation/devicetree/bindings/media/amlogic,meson-gx-ao-cec.yaml Documentation/devicetree/bindings/memory-controllers/fsl/imx8m-ddrc.yaml Documentation/devicetree/bindings/mfd/khadas,mcu.yaml Documentation/devicetree/bindings/net/amlogic,meson-dwmac.yaml Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml Documentation/devicetree/bindings/opp/opp-v2-qcom-level.yaml Documentation/devicetree/bindings/phy/amlogic,axg-mipi-dphy.yaml Documentation/devicetree/bindings/phy/amlogic,meson-g12a-usb2-phy.yaml Documentation/devicetree/bindings/phy/amlogic,meson-g12a-usb3-pcie-phy.yaml Documentation/devicetree/bindings/pinctrl/qcom,sc7280-lpass-lpi-pinctrl.yaml Documentation/devicetree/bindings/pinctrl/qcom,sc7280-pinctrl.yaml Documentation/devicetree/bindings/power/amlogic,meson-ee-pwrc.yaml Documentation/devicetree/bindings/power/qcom,rpmpd.yaml Documentation/devicetree/bindings/regulator/qcom,spmi-regulator.yaml Documentation/devicetree/bindings/reset/amlogic,meson-reset.yaml Documentation/devicetree/bindings/riscv/sifive-l2-cache.yaml Documentation/devicetree/bindings/rng/amlogic,meson-rng.yaml Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml Documentation/devicetree/bindings/soc/amlogic/amlogic,canvas.yaml Documentation/devicetree/bindings/spi/amlogic,meson-gx-spicc.yaml Documentation/devicetree/bindings/spi/amlogic,meson6-spifc.yaml Documentation/devicetree/bindings/usb/amlogic,meson-g12a-usb-ctrl.yaml Documentation/devicetree/bindings/usb/mediatek,mtu3.yaml Documentation/devicetree/bindings/usb/qcom,dwc3.yaml Documentation/devicetree/bindings/watchdog/amlogic,meson-gxbb-wdt.yaml drivers/bus/mhi/host/main.c drivers/cpufreq/qcom-cpufreq-hw.c kernel/sched/Makefile Change-Id: I399f2841e8004cc7dd00ef6547f0fff1305beb02 Upstream-Build:ks_qcom-android-mainline-keystone-qcom-release@9153521 SKQ4.221007.002 Signed-off-by: jianzhou <quic_jianzhou@quicinc.com>
This commit is contained in:
commit
101292e206
4
.mailmap
4
.mailmap
@ -71,6 +71,9 @@ Ben M Cahill <ben.m.cahill@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben@bwidawsk.net>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben.widawsky@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <benjamin.widawsky@intel.com>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn@kryo.se>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn.andersson@linaro.org>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn.andersson@sonymobile.com>
|
||||
Björn Steinbrink <B.Steinbrink@gmx.de>
|
||||
Björn Töpel <bjorn@kernel.org> <bjorn.topel@gmail.com>
|
||||
Björn Töpel <bjorn@kernel.org> <bjorn.topel@intel.com>
|
||||
@ -315,6 +318,7 @@ Morten Welinder <welinder@troll.com>
|
||||
Mythri P K <mythripk@ti.com>
|
||||
Nadia Yvette Chambers <nyc@holomorphy.com> William Lee Irwin III <wli@holomorphy.com>
|
||||
Nathan Chancellor <nathan@kernel.org> <natechancellor@gmail.com>
|
||||
Neil Armstrong <neil.armstrong@linaro.org> <narmstrong@baylibre.com>
|
||||
Nguyen Anh Quynh <aquynh@gmail.com>
|
||||
Nicholas Piggin <npiggin@gmail.com> <npiggen@suse.de>
|
||||
Nicholas Piggin <npiggin@gmail.com> <npiggin@kernel.dk>
|
||||
|
20
BUILD.bazel
20
BUILD.bazel
@ -17,18 +17,25 @@ package(
|
||||
],
|
||||
)
|
||||
|
||||
load("//build/kernel/kleaf:constants.bzl", "aarch64_gz_outs")
|
||||
load("//build/kernel/kleaf:common_kernels.bzl", "define_common_kernels", "define_db845c")
|
||||
|
||||
define_common_kernels(target_configs = {
|
||||
"kernel_aarch64": {
|
||||
"module_outs": [
|
||||
"module_implicit_outs": [
|
||||
"drivers/block/zram/zram.ko",
|
||||
"mm/zsmalloc.ko",
|
||||
],
|
||||
},
|
||||
# Sync with build.config.gki.aarch64.16k
|
||||
"kernel_aarch64_16k": {
|
||||
"module_implicit_outs": [
|
||||
"drivers/block/zram/zram.ko",
|
||||
"mm/zsmalloc.ko",
|
||||
],
|
||||
},
|
||||
# Sync with build.config.gki-debug.aarch64
|
||||
"kernel_aarch64_debug": {
|
||||
"module_outs": [
|
||||
"module_implicit_outs": [
|
||||
"drivers/block/zram/zram.ko",
|
||||
"mm/zsmalloc.ko",
|
||||
],
|
||||
@ -38,7 +45,7 @@ define_common_kernels(target_configs = {
|
||||
# Sync with build.config.db845c
|
||||
define_db845c(
|
||||
name = "db845c",
|
||||
outs = aarch64_gz_outs + [
|
||||
outs = [
|
||||
"arch/arm64/boot/dts/qcom/qrb5165-rb5.dtb",
|
||||
"arch/arm64/boot/dts/qcom/sdm845-db845c.dtb",
|
||||
"arch/arm64/boot/dts/qcom/sm8450-qrd.dtb",
|
||||
@ -48,9 +55,6 @@ define_db845c(
|
||||
"crypto/michael_mic.ko",
|
||||
"drivers/base/regmap/regmap-sdw.ko",
|
||||
"drivers/base/regmap/regmap-slimbus.ko",
|
||||
"drivers/base/regmap/regmap-spmi.ko",
|
||||
# TODO(b/233404531): Remove zram.ko when db845c is a mixed build
|
||||
"drivers/block/zram/zram.ko",
|
||||
"drivers/bus/mhi/host/mhi.ko",
|
||||
"drivers/clk/qcom/clk-qcom.ko",
|
||||
"drivers/clk/qcom/clk-rpmh.ko",
|
||||
@ -195,8 +199,6 @@ define_db845c(
|
||||
"drivers/usb/typec/qcom-pmic-typec.ko",
|
||||
"drivers/watchdog/pm8916_wdt.ko",
|
||||
"drivers/watchdog/qcom-wdt.ko",
|
||||
# TODO(b/233404531): Remove zsmalloc.ko when db845c is a mixed build
|
||||
"mm/zsmalloc.ko",
|
||||
"net/qrtr/qrtr.ko",
|
||||
"net/qrtr/qrtr-mhi.ko",
|
||||
"net/qrtr/qrtr-smd.ko",
|
||||
|
@ -3,7 +3,7 @@ Date: May 2011
|
||||
KernelVersion: 3.0
|
||||
Contact: Rafał Miłecki <zajec5@gmail.com>
|
||||
Description:
|
||||
Each BCMA core has it's manufacturer id. See
|
||||
Each BCMA core has its manufacturer id. See
|
||||
include/linux/bcma/bcma.h for possible values.
|
||||
|
||||
What: /sys/bus/bcma/devices/.../id
|
||||
|
@ -31,7 +31,7 @@ Description: 'FCoE Controller' instances on the fcoe bus.
|
||||
1) Write interface name to ctlr_create 2) Configure the FCoE
|
||||
Controller (ctlr_X) 3) Enable the FCoE Controller to begin
|
||||
discovery and login. The FCoE Controller is destroyed by
|
||||
writing it's name, i.e. ctlr_X to the ctlr_delete file.
|
||||
writing its name, i.e. ctlr_X to the ctlr_delete file.
|
||||
|
||||
Attributes:
|
||||
|
||||
|
@ -18,7 +18,7 @@ Description:
|
||||
on the signal from which time of flight measurements are
|
||||
taken.
|
||||
The appropriate values to take is dependent on both the
|
||||
sensor and it's operating environment:
|
||||
sensor and its operating environment:
|
||||
* as3935 (0-31 range)
|
||||
18 = indoors (default)
|
||||
14 = outdoors
|
||||
|
@ -296,7 +296,7 @@ Description: Processor frequency boosting control
|
||||
|
||||
This switch controls the boost setting for the whole system.
|
||||
Boosting allows the CPU and the firmware to run at a frequency
|
||||
beyond it's nominal limit.
|
||||
beyond its nominal limit.
|
||||
|
||||
More details can be found in
|
||||
Documentation/admin-guide/pm/cpufreq.rst
|
||||
|
@ -2,8 +2,8 @@ What: /sys/bus/platform/devices/ci_hdrc.0/role
|
||||
Date: Mar 2017
|
||||
Contact: Peter Chen <peter.chen@nxp.com>
|
||||
Description:
|
||||
It returns string "gadget" or "host" when read it, it indicates
|
||||
current controller role.
|
||||
When read, it returns string "gadget" or "host", indicating
|
||||
the current controller role.
|
||||
|
||||
It will do role switch when write "gadget" or "host" to it.
|
||||
It will do role switch when "gadget" or "host" is written to it.
|
||||
Only controller at dual-role configuration supports writing.
|
||||
|
@ -152,7 +152,7 @@ Description:
|
||||
case further investigation is required to determine which
|
||||
device is causing the problem. Note that genuine RTC clock
|
||||
values (such as when pm_trace has not been used), can still
|
||||
match a device and output it's name here.
|
||||
match a device and output its name here.
|
||||
|
||||
What: /sys/power/pm_async
|
||||
Date: January 2009
|
||||
|
@ -66,8 +66,13 @@ over a rather long period of time, but improvements are always welcome!
|
||||
As a rough rule of thumb, any dereference of an RCU-protected
|
||||
pointer must be covered by rcu_read_lock(), rcu_read_lock_bh(),
|
||||
rcu_read_lock_sched(), or by the appropriate update-side lock.
|
||||
Disabling of preemption can serve as rcu_read_lock_sched(), but
|
||||
is less readable and prevents lockdep from detecting locking issues.
|
||||
Explicit disabling of preemption (preempt_disable(), for example)
|
||||
can serve as rcu_read_lock_sched(), but is less readable and
|
||||
prevents lockdep from detecting locking issues.
|
||||
|
||||
Please not that you *cannot* rely on code known to be built
|
||||
only in non-preemptible kernels. Such code can and will break,
|
||||
especially in kernels built with CONFIG_PREEMPT_COUNT=y.
|
||||
|
||||
Letting RCU-protected pointers "leak" out of an RCU read-side
|
||||
critical section is every bit as bad as letting them leak out
|
||||
@ -185,6 +190,9 @@ over a rather long period of time, but improvements are always welcome!
|
||||
|
||||
5. If call_rcu() or call_srcu() is used, the callback function will
|
||||
be called from softirq context. In particular, it cannot block.
|
||||
If you need the callback to block, run that code in a workqueue
|
||||
handler scheduled from the callback. The queue_rcu_work()
|
||||
function does this for you in the case of call_rcu().
|
||||
|
||||
6. Since synchronize_rcu() can block, it cannot be called
|
||||
from any sort of irq context. The same rule applies
|
||||
@ -297,7 +305,8 @@ over a rather long period of time, but improvements are always welcome!
|
||||
the machine.
|
||||
|
||||
d. Periodically invoke synchronize_rcu(), permitting a limited
|
||||
number of updates per grace period.
|
||||
number of updates per grace period. Better yet, periodically
|
||||
invoke rcu_barrier() to wait for all outstanding callbacks.
|
||||
|
||||
The same cautions apply to call_srcu() and kfree_rcu().
|
||||
|
||||
@ -477,6 +486,6 @@ over a rather long period of time, but improvements are always welcome!
|
||||
So if you need to wait for both an RCU grace period and for
|
||||
all pre-existing call_rcu() callbacks, you will need to execute
|
||||
both rcu_barrier() and synchronize_rcu(), if necessary, using
|
||||
something like workqueues to to execute them concurrently.
|
||||
something like workqueues to execute them concurrently.
|
||||
|
||||
See rcubarrier.rst for more information.
|
||||
|
@ -61,7 +61,7 @@ checking of rcu_dereference() primitives:
|
||||
rcu_access_pointer(p):
|
||||
Return the value of the pointer and omit all barriers,
|
||||
but retain the compiler constraints that prevent duplicating
|
||||
or coalescsing. This is useful when when testing the
|
||||
or coalescsing. This is useful when testing the
|
||||
value of the pointer itself, for example, against NULL.
|
||||
|
||||
The rcu_dereference_check() check expression can be any boolean
|
||||
|
@ -128,10 +128,16 @@ Follow these rules to keep your RCU code working properly:
|
||||
This sort of comparison occurs frequently when scanning
|
||||
RCU-protected circular linked lists.
|
||||
|
||||
Note that if checks for being within an RCU read-side
|
||||
critical section are not required and the pointer is never
|
||||
dereferenced, rcu_access_pointer() should be used in place
|
||||
of rcu_dereference().
|
||||
Note that if the pointer comparison is done outside
|
||||
of an RCU read-side critical section, and the pointer
|
||||
is never dereferenced, rcu_access_pointer() should be
|
||||
used in place of rcu_dereference(). In most cases,
|
||||
it is best to avoid accidental dereferences by testing
|
||||
the rcu_access_pointer() return value directly, without
|
||||
assigning it to a variable.
|
||||
|
||||
Within an RCU read-side critical section, there is little
|
||||
reason to use rcu_access_pointer().
|
||||
|
||||
- The comparison is against a pointer that references memory
|
||||
that was initialized "a long time ago." The reason
|
||||
|
@ -6,13 +6,15 @@ What is RCU? -- "Read, Copy, Update"
|
||||
Please note that the "What is RCU?" LWN series is an excellent place
|
||||
to start learning about RCU:
|
||||
|
||||
| 1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
|
||||
| 2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
|
||||
| 3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
|
||||
| 4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
|
||||
| 2010 Big API Table http://lwn.net/Articles/419086/
|
||||
| 5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
|
||||
| 2014 Big API Table http://lwn.net/Articles/609973/
|
||||
| 1. What is RCU, Fundamentally? https://lwn.net/Articles/262464/
|
||||
| 2. What is RCU? Part 2: Usage https://lwn.net/Articles/263130/
|
||||
| 3. RCU part 3: the RCU API https://lwn.net/Articles/264090/
|
||||
| 4. The RCU API, 2010 Edition https://lwn.net/Articles/418853/
|
||||
| 2010 Big API Table https://lwn.net/Articles/419086/
|
||||
| 5. The RCU API, 2014 Edition https://lwn.net/Articles/609904/
|
||||
| 2014 Big API Table https://lwn.net/Articles/609973/
|
||||
| 6. The RCU API, 2019 Edition https://lwn.net/Articles/777036/
|
||||
| 2019 Big API Table https://lwn.net/Articles/777165/
|
||||
|
||||
|
||||
What is RCU?
|
||||
@ -915,13 +917,18 @@ which an RCU reference is held include:
|
||||
The understanding that RCU provides a reference that only prevents a
|
||||
change of type is particularly visible with objects allocated from a
|
||||
slab cache marked ``SLAB_TYPESAFE_BY_RCU``. RCU operations may yield a
|
||||
reference to an object from such a cache that has been concurrently
|
||||
freed and the memory reallocated to a completely different object,
|
||||
though of the same type. In this case RCU doesn't even protect the
|
||||
identity of the object from changing, only its type. So the object
|
||||
found may not be the one expected, but it will be one where it is safe
|
||||
to take a reference or spinlock and then confirm that the identity
|
||||
matches the expectations.
|
||||
reference to an object from such a cache that has been concurrently freed
|
||||
and the memory reallocated to a completely different object, though of
|
||||
the same type. In this case RCU doesn't even protect the identity of the
|
||||
object from changing, only its type. So the object found may not be the
|
||||
one expected, but it will be one where it is safe to take a reference
|
||||
(and then potentially acquiring a spinlock), allowing subsequent code
|
||||
to check whether the identity matches expectations. It is tempting
|
||||
to simply acquire the spinlock without first taking the reference, but
|
||||
unfortunately any spinlock in a ``SLAB_TYPESAFE_BY_RCU`` object must be
|
||||
initialized after each and every call to kmem_cache_alloc(), which renders
|
||||
reference-free spinlock acquisition completely unsafe. Therefore, when
|
||||
using ``SLAB_TYPESAFE_BY_RCU``, make proper use of a reference counter.
|
||||
|
||||
With traditional reference counting -- such as that implemented by the
|
||||
kref library in Linux -- there is typically code that runs when the last
|
||||
@ -1057,14 +1064,20 @@ SRCU: Initialization/cleanup::
|
||||
init_srcu_struct
|
||||
cleanup_srcu_struct
|
||||
|
||||
All: lockdep-checked RCU-protected pointer access::
|
||||
All: lockdep-checked RCU utility APIs::
|
||||
|
||||
rcu_access_pointer
|
||||
rcu_dereference_raw
|
||||
RCU_LOCKDEP_WARN
|
||||
rcu_sleep_check
|
||||
RCU_NONIDLE
|
||||
|
||||
All: Unchecked RCU-protected pointer access::
|
||||
|
||||
rcu_dereference_raw
|
||||
|
||||
All: Unchecked RCU-protected pointer access with dereferencing prohibited::
|
||||
|
||||
rcu_access_pointer
|
||||
|
||||
See the comment headers in the source code (or the docbook generated
|
||||
from them) for more information.
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
.. _readme:
|
||||
|
||||
Linux kernel release 5.x <http://kernel.org/>
|
||||
Linux kernel release 6.x <http://kernel.org/>
|
||||
=============================================
|
||||
|
||||
These are the release notes for Linux version 5. Read them carefully,
|
||||
These are the release notes for Linux version 6. Read them carefully,
|
||||
as they tell you what this is all about, explain how to install the
|
||||
kernel, and what to do if something goes wrong.
|
||||
|
||||
@ -63,7 +63,7 @@ Installing the kernel source
|
||||
directory where you have permissions (e.g. your home directory) and
|
||||
unpack it::
|
||||
|
||||
xz -cd linux-5.x.tar.xz | tar xvf -
|
||||
xz -cd linux-6.x.tar.xz | tar xvf -
|
||||
|
||||
Replace "X" with the version number of the latest kernel.
|
||||
|
||||
@ -72,12 +72,12 @@ Installing the kernel source
|
||||
files. They should match the library, and not get messed up by
|
||||
whatever the kernel-du-jour happens to be.
|
||||
|
||||
- You can also upgrade between 5.x releases by patching. Patches are
|
||||
- You can also upgrade between 6.x releases by patching. Patches are
|
||||
distributed in the xz format. To install by patching, get all the
|
||||
newer patch files, enter the top level directory of the kernel source
|
||||
(linux-5.x) and execute::
|
||||
(linux-6.x) and execute::
|
||||
|
||||
xz -cd ../patch-5.x.xz | patch -p1
|
||||
xz -cd ../patch-6.x.xz | patch -p1
|
||||
|
||||
Replace "x" for all versions bigger than the version "x" of your current
|
||||
source tree, **in_order**, and you should be ok. You may want to remove
|
||||
@ -85,13 +85,13 @@ Installing the kernel source
|
||||
that there are no failed patches (some-file-name# or some-file-name.rej).
|
||||
If there are, either you or I have made a mistake.
|
||||
|
||||
Unlike patches for the 5.x kernels, patches for the 5.x.y kernels
|
||||
Unlike patches for the 6.x kernels, patches for the 6.x.y kernels
|
||||
(also known as the -stable kernels) are not incremental but instead apply
|
||||
directly to the base 5.x kernel. For example, if your base kernel is 5.0
|
||||
and you want to apply the 5.0.3 patch, you must not first apply the 5.0.1
|
||||
and 5.0.2 patches. Similarly, if you are running kernel version 5.0.2 and
|
||||
want to jump to 5.0.3, you must first reverse the 5.0.2 patch (that is,
|
||||
patch -R) **before** applying the 5.0.3 patch. You can read more on this in
|
||||
directly to the base 6.x kernel. For example, if your base kernel is 6.0
|
||||
and you want to apply the 6.0.3 patch, you must not first apply the 6.0.1
|
||||
and 6.0.2 patches. Similarly, if you are running kernel version 6.0.2 and
|
||||
want to jump to 6.0.3, you must first reverse the 6.0.2 patch (that is,
|
||||
patch -R) **before** applying the 6.0.3 patch. You can read more on this in
|
||||
:ref:`Documentation/process/applying-patches.rst <applying_patches>`.
|
||||
|
||||
Alternatively, the script patch-kernel can be used to automate this
|
||||
@ -114,7 +114,7 @@ Installing the kernel source
|
||||
Software requirements
|
||||
---------------------
|
||||
|
||||
Compiling and running the 5.x kernels requires up-to-date
|
||||
Compiling and running the 6.x kernels requires up-to-date
|
||||
versions of various software packages. Consult
|
||||
:ref:`Documentation/process/changes.rst <changes>` for the minimum version numbers
|
||||
required and how to get updates for these packages. Beware that using
|
||||
@ -132,12 +132,12 @@ Build directory for the kernel
|
||||
place for the output files (including .config).
|
||||
Example::
|
||||
|
||||
kernel source code: /usr/src/linux-5.x
|
||||
kernel source code: /usr/src/linux-6.x
|
||||
build directory: /home/name/build/kernel
|
||||
|
||||
To configure and build the kernel, use::
|
||||
|
||||
cd /usr/src/linux-5.x
|
||||
cd /usr/src/linux-6.x
|
||||
make O=/home/name/build/kernel menuconfig
|
||||
make O=/home/name/build/kernel
|
||||
sudo make O=/home/name/build/kernel modules_install install
|
||||
@ -262,8 +262,6 @@ Compiling the kernel
|
||||
- Make sure you have at least gcc 5.1 available.
|
||||
For more information, refer to :ref:`Documentation/process/changes.rst <changes>`.
|
||||
|
||||
Please note that you can still run a.out user programs with this kernel.
|
||||
|
||||
- Do a ``make`` to create a compressed kernel image. It is also
|
||||
possible to do ``make install`` if you have lilo installed to suit the
|
||||
kernel makefiles, but you may want to check your particular lilo setup first.
|
||||
@ -332,85 +330,10 @@ Compiling the kernel
|
||||
If something goes wrong
|
||||
-----------------------
|
||||
|
||||
- If you have problems that seem to be due to kernel bugs, please check
|
||||
the file MAINTAINERS to see if there is a particular person associated
|
||||
with the part of the kernel that you are having trouble with. If there
|
||||
isn't anyone listed there, then the second best thing is to mail
|
||||
them to me (torvalds@linux-foundation.org), and possibly to any other
|
||||
relevant mailing-list or to the newsgroup.
|
||||
If you have problems that seem to be due to kernel bugs, please follow the
|
||||
instructions at 'Documentation/admin-guide/reporting-issues.rst'.
|
||||
|
||||
- In all bug-reports, *please* tell what kernel you are talking about,
|
||||
how to duplicate the problem, and what your setup is (use your common
|
||||
sense). If the problem is new, tell me so, and if the problem is
|
||||
old, please try to tell me when you first noticed it.
|
||||
|
||||
- If the bug results in a message like::
|
||||
|
||||
unable to handle kernel paging request at address C0000010
|
||||
Oops: 0002
|
||||
EIP: 0010:XXXXXXXX
|
||||
eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx
|
||||
esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx
|
||||
ds: xxxx es: xxxx fs: xxxx gs: xxxx
|
||||
Pid: xx, process nr: xx
|
||||
xx xx xx xx xx xx xx xx xx xx
|
||||
|
||||
or similar kernel debugging information on your screen or in your
|
||||
system log, please duplicate it *exactly*. The dump may look
|
||||
incomprehensible to you, but it does contain information that may
|
||||
help debugging the problem. The text above the dump is also
|
||||
important: it tells something about why the kernel dumped code (in
|
||||
the above example, it's due to a bad kernel pointer). More information
|
||||
on making sense of the dump is in Documentation/admin-guide/bug-hunting.rst
|
||||
|
||||
- If you compiled the kernel with CONFIG_KALLSYMS you can send the dump
|
||||
as is, otherwise you will have to use the ``ksymoops`` program to make
|
||||
sense of the dump (but compiling with CONFIG_KALLSYMS is usually preferred).
|
||||
This utility can be downloaded from
|
||||
https://www.kernel.org/pub/linux/utils/kernel/ksymoops/ .
|
||||
Alternatively, you can do the dump lookup by hand:
|
||||
|
||||
- In debugging dumps like the above, it helps enormously if you can
|
||||
look up what the EIP value means. The hex value as such doesn't help
|
||||
me or anybody else very much: it will depend on your particular
|
||||
kernel setup. What you should do is take the hex value from the EIP
|
||||
line (ignore the ``0010:``), and look it up in the kernel namelist to
|
||||
see which kernel function contains the offending address.
|
||||
|
||||
To find out the kernel function name, you'll need to find the system
|
||||
binary associated with the kernel that exhibited the symptom. This is
|
||||
the file 'linux/vmlinux'. To extract the namelist and match it against
|
||||
the EIP from the kernel crash, do::
|
||||
|
||||
nm vmlinux | sort | less
|
||||
|
||||
This will give you a list of kernel addresses sorted in ascending
|
||||
order, from which it is simple to find the function that contains the
|
||||
offending address. Note that the address given by the kernel
|
||||
debugging messages will not necessarily match exactly with the
|
||||
function addresses (in fact, that is very unlikely), so you can't
|
||||
just 'grep' the list: the list will, however, give you the starting
|
||||
point of each kernel function, so by looking for the function that
|
||||
has a starting address lower than the one you are searching for but
|
||||
is followed by a function with a higher address you will find the one
|
||||
you want. In fact, it may be a good idea to include a bit of
|
||||
"context" in your problem report, giving a few lines around the
|
||||
interesting one.
|
||||
|
||||
If you for some reason cannot do the above (you have a pre-compiled
|
||||
kernel image or similar), telling me as much about your setup as
|
||||
possible will help. Please read
|
||||
'Documentation/admin-guide/reporting-issues.rst' for details.
|
||||
|
||||
- Alternatively, you can use gdb on a running kernel. (read-only; i.e. you
|
||||
cannot change values or set break points.) To do this, first compile the
|
||||
kernel with -g; edit arch/x86/Makefile appropriately, then do a ``make
|
||||
clean``. You'll also need to enable CONFIG_PROC_FS (via ``make config``).
|
||||
|
||||
After you've rebooted with the new kernel, do ``gdb vmlinux /proc/kcore``.
|
||||
You can now use all the usual gdb commands. The command to look up the
|
||||
point where your system crashed is ``l *0xXXXXXXXX``. (Replace the XXXes
|
||||
with the EIP value.)
|
||||
|
||||
gdb'ing a non-running kernel currently fails because ``gdb`` (wrongly)
|
||||
disregards the starting offset for which the kernel is compiled.
|
||||
Hints on understanding kernel bug reports are in
|
||||
'Documentation/admin-guide/bug-hunting.rst'. More on debugging the kernel
|
||||
with gdb is in 'Documentation/dev-tools/gdb-kernel-debugging.rst' and
|
||||
'Documentation/dev-tools/kgdb.rst'.
|
||||
|
@ -1,13 +0,0 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============
|
||||
Overriding DSDT
|
||||
===============
|
||||
|
||||
Linux supports a method of overriding the BIOS DSDT:
|
||||
|
||||
CONFIG_ACPI_CUSTOM_DSDT - builds the image into the kernel.
|
||||
|
||||
When to use this method is described in detail on the
|
||||
Linux/ACPI home page:
|
||||
https://01.org/linux-acpi/documentation/overriding-dsdt
|
@ -613,6 +613,7 @@ kernel command line.
|
||||
eibrs enhanced IBRS
|
||||
eibrs,retpoline enhanced IBRS + Retpolines
|
||||
eibrs,lfence enhanced IBRS + LFENCE
|
||||
ibrs use IBRS to protect kernel
|
||||
|
||||
Not specifying this option is equivalent to
|
||||
spectre_v2=auto.
|
||||
|
@ -200,7 +200,7 @@ prb
|
||||
|
||||
A pointer to the printk ringbuffer (struct printk_ringbuffer). This
|
||||
may be pointing to the static boot ringbuffer or the dynamically
|
||||
allocated ringbuffer, depending on when the the core dump occurred.
|
||||
allocated ringbuffer, depending on when the core dump occurred.
|
||||
Used by user-space tools to read the active kernel log buffer.
|
||||
|
||||
printk_rb_static
|
||||
|
@ -50,10 +50,10 @@ For a short example, users can monitor the virtual address space of a given
|
||||
workload as below. ::
|
||||
|
||||
# cd /sys/kernel/mm/damon/admin/
|
||||
# echo 1 > kdamonds/nr && echo 1 > kdamonds/0/contexts/nr
|
||||
# echo 1 > kdamonds/nr_kdamonds && echo 1 > kdamonds/0/contexts/nr_contexts
|
||||
# echo vaddr > kdamonds/0/contexts/0/operations
|
||||
# echo 1 > kdamonds/0/contexts/0/targets/nr
|
||||
# echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid
|
||||
# echo 1 > kdamonds/0/contexts/0/targets/nr_targets
|
||||
# echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid_target
|
||||
# echo on > kdamonds/0/state
|
||||
|
||||
Files Hierarchy
|
||||
@ -366,12 +366,12 @@ memory rate becomes larger than 60%, or lower than 30%". ::
|
||||
# echo 1 > kdamonds/0/contexts/0/schemes/nr_schemes
|
||||
# cd kdamonds/0/contexts/0/schemes/0
|
||||
# # set the basic access pattern and the action
|
||||
# echo 4096 > access_patterns/sz/min
|
||||
# echo 8192 > access_patterns/sz/max
|
||||
# echo 0 > access_patterns/nr_accesses/min
|
||||
# echo 5 > access_patterns/nr_accesses/max
|
||||
# echo 10 > access_patterns/age/min
|
||||
# echo 20 > access_patterns/age/max
|
||||
# echo 4096 > access_pattern/sz/min
|
||||
# echo 8192 > access_pattern/sz/max
|
||||
# echo 0 > access_pattern/nr_accesses/min
|
||||
# echo 5 > access_pattern/nr_accesses/max
|
||||
# echo 10 > access_pattern/age/min
|
||||
# echo 20 > access_pattern/age/max
|
||||
# echo pageout > action
|
||||
# # set quotas
|
||||
# echo 10 > quotas/ms
|
||||
|
@ -65,7 +65,7 @@ HugePages_Surp
|
||||
may be temporarily larger than the maximum number of surplus huge
|
||||
pages when the system is under memory pressure.
|
||||
Hugepagesize
|
||||
is the default hugepage size (in Kb).
|
||||
is the default hugepage size (in kB).
|
||||
Hugetlb
|
||||
is the total amount of memory (in kB), consumed by huge
|
||||
pages of all sizes.
|
||||
|
@ -23,3 +23,4 @@ Block
|
||||
stat
|
||||
switching-sched
|
||||
writeback_cache_control
|
||||
ublk
|
||||
|
253
Documentation/block/ublk.rst
Normal file
253
Documentation/block/ublk.rst
Normal file
@ -0,0 +1,253 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===========================================
|
||||
Userspace block device driver (ublk driver)
|
||||
===========================================
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
ublk is a generic framework for implementing block device logic from userspace.
|
||||
The motivation behind it is that moving virtual block drivers into userspace,
|
||||
such as loop, nbd and similar can be very helpful. It can help to implement
|
||||
new virtual block device such as ublk-qcow2 (there are several attempts of
|
||||
implementing qcow2 driver in kernel).
|
||||
|
||||
Userspace block devices are attractive because:
|
||||
|
||||
- They can be written many programming languages.
|
||||
- They can use libraries that are not available in the kernel.
|
||||
- They can be debugged with tools familiar to application developers.
|
||||
- Crashes do not kernel panic the machine.
|
||||
- Bugs are likely to have a lower security impact than bugs in kernel
|
||||
code.
|
||||
- They can be installed and updated independently of the kernel.
|
||||
- They can be used to simulate block device easily with user specified
|
||||
parameters/setting for test/debug purpose
|
||||
|
||||
ublk block device (``/dev/ublkb*``) is added by ublk driver. Any IO request
|
||||
on the device will be forwarded to ublk userspace program. For convenience,
|
||||
in this document, ``ublk server`` refers to generic ublk userspace
|
||||
program. ``ublksrv`` [#userspace]_ is one of such implementation. It
|
||||
provides ``libublksrv`` [#userspace_lib]_ library for developing specific
|
||||
user block device conveniently, while also generic type block device is
|
||||
included, such as loop and null. Richard W.M. Jones wrote userspace nbd device
|
||||
``nbdublk`` [#userspace_nbdublk]_ based on ``libublksrv`` [#userspace_lib]_.
|
||||
|
||||
After the IO is handled by userspace, the result is committed back to the
|
||||
driver, thus completing the request cycle. This way, any specific IO handling
|
||||
logic is totally done by userspace, such as loop's IO handling, NBD's IO
|
||||
communication, or qcow2's IO mapping.
|
||||
|
||||
``/dev/ublkb*`` is driven by blk-mq request-based driver. Each request is
|
||||
assigned by one queue wide unique tag. ublk server assigns unique tag to each
|
||||
IO too, which is 1:1 mapped with IO of ``/dev/ublkb*``.
|
||||
|
||||
Both the IO request forward and IO handling result committing are done via
|
||||
``io_uring`` passthrough command; that is why ublk is also one io_uring based
|
||||
block driver. It has been observed that using io_uring passthrough command can
|
||||
give better IOPS than block IO; which is why ublk is one of high performance
|
||||
implementation of userspace block device: not only IO request communication is
|
||||
done by io_uring, but also the preferred IO handling in ublk server is io_uring
|
||||
based approach too.
|
||||
|
||||
ublk provides control interface to set/get ublk block device parameters.
|
||||
The interface is extendable and kabi compatible: basically any ublk request
|
||||
queue's parameter or ublk generic feature parameters can be set/get via the
|
||||
interface. Thus, ublk is generic userspace block device framework.
|
||||
For example, it is easy to setup a ublk device with specified block
|
||||
parameters from userspace.
|
||||
|
||||
Using ublk
|
||||
==========
|
||||
|
||||
ublk requires userspace ublk server to handle real block device logic.
|
||||
|
||||
Below is example of using ``ublksrv`` to provide ublk-based loop device.
|
||||
|
||||
- add a device::
|
||||
|
||||
ublk add -t loop -f ublk-loop.img
|
||||
|
||||
- format with xfs, then use it::
|
||||
|
||||
mkfs.xfs /dev/ublkb0
|
||||
mount /dev/ublkb0 /mnt
|
||||
# do anything. all IOs are handled by io_uring
|
||||
...
|
||||
umount /mnt
|
||||
|
||||
- list the devices with their info::
|
||||
|
||||
ublk list
|
||||
|
||||
- delete the device::
|
||||
|
||||
ublk del -a
|
||||
ublk del -n $ublk_dev_id
|
||||
|
||||
See usage details in README of ``ublksrv`` [#userspace_readme]_.
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
Control plane
|
||||
-------------
|
||||
|
||||
ublk driver provides global misc device node (``/dev/ublk-control``) for
|
||||
managing and controlling ublk devices with help of several control commands:
|
||||
|
||||
- ``UBLK_CMD_ADD_DEV``
|
||||
|
||||
Add a ublk char device (``/dev/ublkc*``) which is talked with ublk server
|
||||
WRT IO command communication. Basic device info is sent together with this
|
||||
command. It sets UAPI structure of ``ublksrv_ctrl_dev_info``,
|
||||
such as ``nr_hw_queues``, ``queue_depth``, and max IO request buffer size,
|
||||
for which the info is negotiated with the driver and sent back to the server.
|
||||
When this command is completed, the basic device info is immutable.
|
||||
|
||||
- ``UBLK_CMD_SET_PARAMS`` / ``UBLK_CMD_GET_PARAMS``
|
||||
|
||||
Set or get parameters of the device, which can be either generic feature
|
||||
related, or request queue limit related, but can't be IO logic specific,
|
||||
because the driver does not handle any IO logic. This command has to be
|
||||
sent before sending ``UBLK_CMD_START_DEV``.
|
||||
|
||||
- ``UBLK_CMD_START_DEV``
|
||||
|
||||
After the server prepares userspace resources (such as creating per-queue
|
||||
pthread & io_uring for handling ublk IO), this command is sent to the
|
||||
driver for allocating & exposing ``/dev/ublkb*``. Parameters set via
|
||||
``UBLK_CMD_SET_PARAMS`` are applied for creating the device.
|
||||
|
||||
- ``UBLK_CMD_STOP_DEV``
|
||||
|
||||
Halt IO on ``/dev/ublkb*`` and remove the device. When this command returns,
|
||||
ublk server will release resources (such as destroying per-queue pthread &
|
||||
io_uring).
|
||||
|
||||
- ``UBLK_CMD_DEL_DEV``
|
||||
|
||||
Remove ``/dev/ublkc*``. When this command returns, the allocated ublk device
|
||||
number can be reused.
|
||||
|
||||
- ``UBLK_CMD_GET_QUEUE_AFFINITY``
|
||||
|
||||
When ``/dev/ublkc`` is added, the driver creates block layer tagset, so
|
||||
that each queue's affinity info is available. The server sends
|
||||
``UBLK_CMD_GET_QUEUE_AFFINITY`` to retrieve queue affinity info. It can
|
||||
set up the per-queue context efficiently, such as bind affine CPUs with IO
|
||||
pthread and try to allocate buffers in IO thread context.
|
||||
|
||||
- ``UBLK_CMD_GET_DEV_INFO``
|
||||
|
||||
For retrieving device info via ``ublksrv_ctrl_dev_info``. It is the server's
|
||||
responsibility to save IO target specific info in userspace.
|
||||
|
||||
Data plane
|
||||
----------
|
||||
|
||||
ublk server needs to create per-queue IO pthread & io_uring for handling IO
|
||||
commands via io_uring passthrough. The per-queue IO pthread
|
||||
focuses on IO handling and shouldn't handle any control & management
|
||||
tasks.
|
||||
|
||||
The's IO is assigned by a unique tag, which is 1:1 mapping with IO
|
||||
request of ``/dev/ublkb*``.
|
||||
|
||||
UAPI structure of ``ublksrv_io_desc`` is defined for describing each IO from
|
||||
the driver. A fixed mmaped area (array) on ``/dev/ublkc*`` is provided for
|
||||
exporting IO info to the server; such as IO offset, length, OP/flags and
|
||||
buffer address. Each ``ublksrv_io_desc`` instance can be indexed via queue id
|
||||
and IO tag directly.
|
||||
|
||||
The following IO commands are communicated via io_uring passthrough command,
|
||||
and each command is only for forwarding the IO and committing the result
|
||||
with specified IO tag in the command data:
|
||||
|
||||
- ``UBLK_IO_FETCH_REQ``
|
||||
|
||||
Sent from the server IO pthread for fetching future incoming IO requests
|
||||
destined to ``/dev/ublkb*``. This command is sent only once from the server
|
||||
IO pthread for ublk driver to setup IO forward environment.
|
||||
|
||||
- ``UBLK_IO_COMMIT_AND_FETCH_REQ``
|
||||
|
||||
When an IO request is destined to ``/dev/ublkb*``, the driver stores
|
||||
the IO's ``ublksrv_io_desc`` to the specified mapped area; then the
|
||||
previous received IO command of this IO tag (either ``UBLK_IO_FETCH_REQ``
|
||||
or ``UBLK_IO_COMMIT_AND_FETCH_REQ)`` is completed, so the server gets
|
||||
the IO notification via io_uring.
|
||||
|
||||
After the server handles the IO, its result is committed back to the
|
||||
driver by sending ``UBLK_IO_COMMIT_AND_FETCH_REQ`` back. Once ublkdrv
|
||||
received this command, it parses the result and complete the request to
|
||||
``/dev/ublkb*``. In the meantime setup environment for fetching future
|
||||
requests with the same IO tag. That is, ``UBLK_IO_COMMIT_AND_FETCH_REQ``
|
||||
is reused for both fetching request and committing back IO result.
|
||||
|
||||
- ``UBLK_IO_NEED_GET_DATA``
|
||||
|
||||
With ``UBLK_F_NEED_GET_DATA`` enabled, the WRITE request will be firstly
|
||||
issued to ublk server without data copy. Then, IO backend of ublk server
|
||||
receives the request and it can allocate data buffer and embed its addr
|
||||
inside this new io command. After the kernel driver gets the command,
|
||||
data copy is done from request pages to this backend's buffer. Finally,
|
||||
backend receives the request again with data to be written and it can
|
||||
truly handle the request.
|
||||
|
||||
``UBLK_IO_NEED_GET_DATA`` adds one additional round-trip and one
|
||||
io_uring_enter() syscall. Any user thinks that it may lower performance
|
||||
should not enable UBLK_F_NEED_GET_DATA. ublk server pre-allocates IO
|
||||
buffer for each IO by default. Any new project should try to use this
|
||||
buffer to communicate with ublk driver. However, existing project may
|
||||
break or not able to consume the new buffer interface; that's why this
|
||||
command is added for backwards compatibility so that existing projects
|
||||
can still consume existing buffers.
|
||||
|
||||
- data copy between ublk server IO buffer and ublk block IO request
|
||||
|
||||
The driver needs to copy the block IO request pages into the server buffer
|
||||
(pages) first for WRITE before notifying the server of the coming IO, so
|
||||
that the server can handle WRITE request.
|
||||
|
||||
When the server handles READ request and sends
|
||||
``UBLK_IO_COMMIT_AND_FETCH_REQ`` to the server, ublkdrv needs to copy
|
||||
the server buffer (pages) read to the IO request pages.
|
||||
|
||||
Future development
|
||||
==================
|
||||
|
||||
Container-aware ublk deivice
|
||||
----------------------------
|
||||
|
||||
ublk driver doesn't handle any IO logic. Its function is well defined
|
||||
for now and very limited userspace interfaces are needed, which is also
|
||||
well defined too. It is possible to make ublk devices container-aware block
|
||||
devices in future as Stefan Hajnoczi suggested [#stefan]_, by removing
|
||||
ADMIN privilege.
|
||||
|
||||
Zero copy
|
||||
---------
|
||||
|
||||
Zero copy is a generic requirement for nbd, fuse or similar drivers. A
|
||||
problem [#xiaoguang]_ Xiaoguang mentioned is that pages mapped to userspace
|
||||
can't be remapped any more in kernel with existing mm interfaces. This can
|
||||
occurs when destining direct IO to ``/dev/ublkb*``. Also, he reported that
|
||||
big requests (IO size >= 256 KB) may benefit a lot from zero copy.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [#userspace] https://github.com/ming1/ubdsrv
|
||||
|
||||
.. [#userspace_lib] https://github.com/ming1/ubdsrv/tree/master/lib
|
||||
|
||||
.. [#userspace_nbdublk] https://gitlab.com/rwmjones/libnbd/-/tree/nbdublk
|
||||
|
||||
.. [#userspace_readme] https://github.com/ming1/ubdsrv/blob/master/README
|
||||
|
||||
.. [#stefan] https://lore.kernel.org/linux-block/YoOr6jBfgVm8GvWg@stefanha-x1.localdomain/
|
||||
|
||||
.. [#xiaoguang] https://lore.kernel.org/linux-block/YoOr6jBfgVm8GvWg@stefanha-x1.localdomain/
|
@ -133,7 +133,7 @@ code field of ``BPF_END``.
|
||||
The byte swap instructions operate on the destination register
|
||||
only and do not use a separate source register or immediate value.
|
||||
|
||||
The 1-bit source operand field in the opcode is used to to select what byte
|
||||
The 1-bit source operand field in the opcode is used to select what byte
|
||||
order the operation convert from or to:
|
||||
|
||||
========= ===== =================================================
|
||||
|
@ -31,7 +31,7 @@ The map uses key of type of either ``__u64 cgroup_inode_id`` or
|
||||
};
|
||||
|
||||
``cgroup_inode_id`` is the inode id of the cgroup directory.
|
||||
``attach_type`` is the the program's attach type.
|
||||
``attach_type`` is the program's attach type.
|
||||
|
||||
Linux 5.9 added support for type ``__u64 cgroup_inode_id`` as the key type.
|
||||
When this key type is used, then all attach types of the particular cgroup and
|
||||
@ -155,7 +155,7 @@ However, the BPF program can still only associate with one map of each type
|
||||
``BPF_MAP_TYPE_CGROUP_STORAGE`` or more than one
|
||||
``BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE``.
|
||||
|
||||
In all versions, userspace may use the the attach parameters of cgroup and
|
||||
In all versions, userspace may use the attach parameters of cgroup and
|
||||
attach type pair in ``struct bpf_cgroup_storage_key`` as the key to the BPF map
|
||||
APIs to read or update the storage for a given attachment. For Linux 5.9
|
||||
attach type shared storages, only the first value in the struct, cgroup inode
|
||||
|
@ -15,6 +15,18 @@
|
||||
import sys
|
||||
import os
|
||||
import sphinx
|
||||
import shutil
|
||||
|
||||
# helper
|
||||
# ------
|
||||
|
||||
def have_command(cmd):
|
||||
"""Search ``cmd`` in the ``PATH`` environment.
|
||||
|
||||
If found, return True.
|
||||
If not found, return False.
|
||||
"""
|
||||
return shutil.which(cmd) is not None
|
||||
|
||||
# Get Sphinx version
|
||||
major, minor, patch = sphinx.version_info[:3]
|
||||
@ -86,6 +98,7 @@ if major >= 3:
|
||||
"__used",
|
||||
"__weak",
|
||||
"noinline",
|
||||
"__fix_address",
|
||||
|
||||
# include/linux/memblock.h:
|
||||
"__init_memblock",
|
||||
@ -106,7 +119,32 @@ else:
|
||||
autosectionlabel_prefix_document = True
|
||||
autosectionlabel_maxdepth = 2
|
||||
|
||||
extensions.append("sphinx.ext.imgmath")
|
||||
# Load math renderer:
|
||||
# For html builder, load imgmath only when its dependencies are met.
|
||||
# mathjax is the default math renderer since Sphinx 1.8.
|
||||
have_latex = have_command('latex')
|
||||
have_dvipng = have_command('dvipng')
|
||||
load_imgmath = have_latex and have_dvipng
|
||||
|
||||
# Respect SPHINX_IMGMATH (for html docs only)
|
||||
if 'SPHINX_IMGMATH' in os.environ:
|
||||
env_sphinx_imgmath = os.environ['SPHINX_IMGMATH']
|
||||
if 'yes' in env_sphinx_imgmath:
|
||||
load_imgmath = True
|
||||
elif 'no' in env_sphinx_imgmath:
|
||||
load_imgmath = False
|
||||
else:
|
||||
sys.stderr.write("Unknown env SPHINX_IMGMATH=%s ignored.\n" % env_sphinx_imgmath)
|
||||
|
||||
# Always load imgmath for Sphinx <1.8 or for epub docs
|
||||
load_imgmath = (load_imgmath or (major == 1 and minor < 8)
|
||||
or 'epub' in sys.argv)
|
||||
|
||||
if load_imgmath:
|
||||
extensions.append("sphinx.ext.imgmath")
|
||||
math_renderer = 'imgmath'
|
||||
else:
|
||||
math_renderer = 'mathjax'
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
@ -332,7 +370,8 @@ html_static_path = ['sphinx-static']
|
||||
html_use_smartypants = False
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
# Note that the RTD theme ignores this.
|
||||
html_sidebars = { '**': ['searchbox.html', 'localtoc.html', 'sourcelink.html']}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
|
@ -43,10 +43,11 @@ annotated objects like this, tools can be run on them to generate more useful
|
||||
information. In particular, on properly annotated objects, ``objtool`` can be
|
||||
run to check and fix the object if needed. Currently, ``objtool`` can report
|
||||
missing frame pointer setup/destruction in functions. It can also
|
||||
automatically generate annotations for :doc:`ORC unwinder <x86/orc-unwinder>`
|
||||
automatically generate annotations for the ORC unwinder
|
||||
(Documentation/x86/orc-unwinder.rst)
|
||||
for most code. Both of these are especially important to support reliable
|
||||
stack traces which are in turn necessary for :doc:`Kernel live patching
|
||||
<livepatch/livepatch>`.
|
||||
stack traces which are in turn necessary for kernel live patching
|
||||
(Documentation/livepatch/livepatch.rst).
|
||||
|
||||
Caveat and Discussion
|
||||
---------------------
|
@ -560,7 +560,7 @@ available:
|
||||
* cpuhp_state_remove_instance(state, node)
|
||||
* cpuhp_state_remove_instance_nocalls(state, node)
|
||||
|
||||
The arguments are the same as for the the cpuhp_state_add_instance*()
|
||||
The arguments are the same as for the cpuhp_state_add_instance*()
|
||||
variants above.
|
||||
|
||||
The functions differ in the way how the installed callbacks are treated:
|
||||
|
@ -23,6 +23,7 @@ it.
|
||||
printk-formats
|
||||
printk-index
|
||||
symbol-namespaces
|
||||
asm-annotations
|
||||
|
||||
Data structures and low-level utilities
|
||||
=======================================
|
||||
@ -44,6 +45,8 @@ Library functionality that is used throughout the kernel.
|
||||
this_cpu_ops
|
||||
timekeeping
|
||||
errseq
|
||||
wrappers/atomic_t
|
||||
wrappers/atomic_bitops
|
||||
|
||||
Low level entry and exit
|
||||
========================
|
||||
@ -67,6 +70,7 @@ Documentation/locking/index.rst for more related documentation.
|
||||
local_ops
|
||||
padata
|
||||
../RCU/index
|
||||
wrappers/memory-barriers.rst
|
||||
|
||||
Low-level hardware management
|
||||
=============================
|
||||
|
@ -71,7 +71,7 @@ variety of methods:
|
||||
Note that irq domain lookups must happen in contexts that are
|
||||
compatible with a RCU read-side critical section.
|
||||
|
||||
The irq_create_mapping() function must be called *atleast once*
|
||||
The irq_create_mapping() function must be called *at least once*
|
||||
before any call to irq_find_mapping(), lest the descriptor will not
|
||||
be allocated.
|
||||
|
||||
|
18
Documentation/core-api/wrappers/atomic_bitops.rst
Normal file
18
Documentation/core-api/wrappers/atomic_bitops.rst
Normal file
@ -0,0 +1,18 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
This is a simple wrapper to bring atomic_bitops.txt into the RST world
|
||||
until such a time as that file can be converted directly.
|
||||
|
||||
=============
|
||||
Atomic bitops
|
||||
=============
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../../atomic_bitops.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
19
Documentation/core-api/wrappers/atomic_t.rst
Normal file
19
Documentation/core-api/wrappers/atomic_t.rst
Normal file
@ -0,0 +1,19 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
This is a simple wrapper to bring atomic_t.txt into the RST world
|
||||
until such a time as that file can be converted directly.
|
||||
|
||||
============
|
||||
Atomic types
|
||||
============
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../../atomic_t.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
18
Documentation/core-api/wrappers/memory-barriers.rst
Normal file
18
Documentation/core-api/wrappers/memory-barriers.rst
Normal file
@ -0,0 +1,18 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
This is a simple wrapper to bring memory-barriers.txt into the RST world
|
||||
until such a time as that file can be converted directly.
|
||||
|
||||
============================
|
||||
Linux kernel memory barriers
|
||||
============================
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../../memory-barriers.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
@ -48,10 +48,6 @@ or ``virtualenv``, depending on how your distribution packaged Python 3.
|
||||
on the Sphinx version, it should be installed separately,
|
||||
with ``pip install sphinx_rtd_theme``.
|
||||
|
||||
#) Some ReST pages contain math expressions. Due to the way Sphinx works,
|
||||
those expressions are written using LaTeX notation. It needs texlive
|
||||
installed with amsfonts and amsmath in order to evaluate them.
|
||||
|
||||
In summary, if you want to install Sphinx version 2.4.4, you should do::
|
||||
|
||||
$ virtualenv sphinx_2.4.4
|
||||
@ -86,6 +82,27 @@ Depending on the distribution, you may also need to install a series of
|
||||
``texlive`` packages that provide the minimal set of functionalities
|
||||
required for ``XeLaTeX`` to work.
|
||||
|
||||
Math Expressions in HTML
|
||||
------------------------
|
||||
|
||||
Some ReST pages contain math expressions. Due to the way Sphinx works,
|
||||
those expressions are written using LaTeX notation.
|
||||
There are two options for Sphinx to render math expressions in html output.
|
||||
One is an extension called `imgmath`_ which converts math expressions into
|
||||
images and embeds them in html pages.
|
||||
The other is an extension called `mathjax`_ which delegates math rendering
|
||||
to JavaScript capable web browsers.
|
||||
The former was the only option for pre-6.1 kernel documentation and it
|
||||
requires quite a few texlive packages including amsfonts and amsmath among
|
||||
others.
|
||||
|
||||
Since kernel release 6.1, html pages with math expressions can be built
|
||||
without installing any texlive packages. See `Choice of Math Renderer`_ for
|
||||
further info.
|
||||
|
||||
.. _imgmath: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.imgmath
|
||||
.. _mathjax: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.mathjax
|
||||
|
||||
.. _sphinx-pre-install:
|
||||
|
||||
Checking for Sphinx dependencies
|
||||
@ -164,6 +181,38 @@ To remove the generated documentation, run ``make cleandocs``.
|
||||
as well would improve the quality of images embedded in PDF
|
||||
documents, especially for kernel releases 5.18 and later.
|
||||
|
||||
Choice of Math Renderer
|
||||
-----------------------
|
||||
|
||||
Since kernel release 6.1, mathjax works as a fallback math renderer for
|
||||
html output.\ [#sph1_8]_
|
||||
|
||||
Math renderer is chosen depending on available commands as shown below:
|
||||
|
||||
.. table:: Math Renderer Choices for HTML
|
||||
|
||||
============= ================= ============
|
||||
Math renderer Required commands Image format
|
||||
============= ================= ============
|
||||
imgmath latex, dvipng PNG (raster)
|
||||
mathjax
|
||||
============= ================= ============
|
||||
|
||||
The choice can be overridden by setting an environment variable
|
||||
``SPHINX_IMGMATH`` as shown below:
|
||||
|
||||
.. table:: Effect of Setting ``SPHINX_IMGMATH``
|
||||
|
||||
====================== ========
|
||||
Setting Renderer
|
||||
====================== ========
|
||||
``SPHINX_IMGMATH=yes`` imgmath
|
||||
``SPHINX_IMGMATH=no`` mathjax
|
||||
====================== ========
|
||||
|
||||
.. [#sph1_8] Fallback of math renderer requires Sphinx >=1.8.
|
||||
|
||||
|
||||
Writing Documentation
|
||||
=====================
|
||||
|
||||
|
@ -301,6 +301,7 @@ IO region
|
||||
devm_release_region()
|
||||
devm_release_resource()
|
||||
devm_request_mem_region()
|
||||
devm_request_free_mem_region()
|
||||
devm_request_region()
|
||||
devm_request_resource()
|
||||
|
||||
@ -334,7 +335,7 @@ IRQ
|
||||
devm_irq_alloc_descs_from()
|
||||
devm_irq_alloc_generic_chip()
|
||||
devm_irq_setup_generic_chip()
|
||||
devm_irq_sim_init()
|
||||
devm_irq_domain_create_sim()
|
||||
|
||||
LED
|
||||
devm_led_classdev_register()
|
||||
@ -392,7 +393,9 @@ PHY
|
||||
PINCTRL
|
||||
devm_pinctrl_get()
|
||||
devm_pinctrl_put()
|
||||
devm_pinctrl_get_select()
|
||||
devm_pinctrl_register()
|
||||
devm_pinctrl_register_and_init()
|
||||
devm_pinctrl_unregister()
|
||||
|
||||
POWER
|
||||
@ -427,6 +430,8 @@ SLAVE DMA ENGINE
|
||||
devm_acpi_dma_controller_register()
|
||||
|
||||
SPI
|
||||
devm_spi_alloc_master()
|
||||
devm_spi_alloc_slave()
|
||||
devm_spi_register_master()
|
||||
|
||||
WATCHDOG
|
||||
|
@ -100,7 +100,7 @@ I believe platform_data is available for this, but if rather not, moving
|
||||
the isa_driver pointer to the private struct isa_dev is ofcourse fine as
|
||||
well.
|
||||
|
||||
Then, if the the driver did not provide a .match, it matches. If it did,
|
||||
Then, if the driver did not provide a .match, it matches. If it did,
|
||||
the driver match() method is called to determine a match.
|
||||
|
||||
If it did **not** match, dev->platform_data is reset to indicate this to
|
||||
|
@ -86,17 +86,24 @@ Module Options
|
||||
Special configuration for udlfb is usually unnecessary. There are a few
|
||||
options, however.
|
||||
|
||||
From the command line, pass options to modprobe
|
||||
modprobe udlfb fb_defio=0 console=1 shadow=1
|
||||
From the command line, pass options to modprobe::
|
||||
|
||||
Or modify options on the fly at /sys/module/udlfb/parameters directory via
|
||||
sudo nano fb_defio
|
||||
change the parameter in place, and save the file.
|
||||
modprobe udlfb fb_defio=0 console=1 shadow=1
|
||||
|
||||
Unplug/replug USB device to apply with new settings
|
||||
Or change options on the fly by editing
|
||||
/sys/module/udlfb/parameters/PARAMETER_NAME ::
|
||||
|
||||
Or for permanent option, create file like /etc/modprobe.d/udlfb.conf with text
|
||||
options udlfb fb_defio=0 console=1 shadow=1
|
||||
cd /sys/module/udlfb/parameters
|
||||
ls # to see a list of parameter names
|
||||
sudo nano PARAMETER_NAME
|
||||
# change the parameter in place, and save the file.
|
||||
|
||||
Unplug/replug USB device to apply with new settings.
|
||||
|
||||
Or to apply options permanently, create a modprobe configuration file
|
||||
like /etc/modprobe.d/udlfb.conf with text::
|
||||
|
||||
options udlfb fb_defio=0 console=1 shadow=1
|
||||
|
||||
Accepted boolean options:
|
||||
|
||||
|
@ -122,7 +122,7 @@ volumes, calling::
|
||||
to tell fscache that a volume has been withdrawn. This waits for all
|
||||
outstanding accesses on the volume to complete before returning.
|
||||
|
||||
When the the cache is completely withdrawn, fscache should be notified by
|
||||
When the cache is completely withdrawn, fscache should be notified by
|
||||
calling::
|
||||
|
||||
void fscache_relinquish_cache(struct fscache_cache *cache);
|
||||
|
@ -456,15 +456,15 @@ The ext4 superblock is laid out as follows in
|
||||
* - 0x277
|
||||
- __u8
|
||||
- s_lastcheck_hi
|
||||
- Upper 8 bits of the s_lastcheck_hi field.
|
||||
- Upper 8 bits of the s_lastcheck field.
|
||||
* - 0x278
|
||||
- __u8
|
||||
- s_first_error_time_hi
|
||||
- Upper 8 bits of the s_first_error_time_hi field.
|
||||
- Upper 8 bits of the s_first_error_time field.
|
||||
* - 0x279
|
||||
- __u8
|
||||
- s_last_error_time_hi
|
||||
- Upper 8 bits of the s_last_error_time_hi field.
|
||||
- Upper 8 bits of the s_last_error_time field.
|
||||
* - 0x27A
|
||||
- __u8
|
||||
- s_pad[2]
|
||||
|
@ -286,9 +286,8 @@ compress_algorithm=%s:%d Control compress algorithm and its compress level, now,
|
||||
algorithm level range
|
||||
lz4 3 - 16
|
||||
zstd 1 - 22
|
||||
compress_log_size=%u Support configuring compress cluster size, the size will
|
||||
be 4KB * (1 << %u), 16KB is minimum size, also it's
|
||||
default size.
|
||||
compress_log_size=%u Support configuring compress cluster size. The size will
|
||||
be 4KB * (1 << %u). The default and minimum sizes are 16KB.
|
||||
compress_extension=%s Support adding specified extension, so that f2fs can enable
|
||||
compression on those corresponding files, e.g. if all files
|
||||
with '.ext' has high compression rate, we can set the '.ext'
|
||||
|
@ -661,7 +661,7 @@ idmappings::
|
||||
mount idmapping: u0:k10000:r10000
|
||||
|
||||
Assume a file owned by ``u1000`` is read from disk. The filesystem maps this id
|
||||
to ``k21000`` according to it's idmapping. This is what is stored in the
|
||||
to ``k21000`` according to its idmapping. This is what is stored in the
|
||||
inode's ``i_uid`` and ``i_gid`` fields.
|
||||
|
||||
When the caller queries the ownership of this file via ``stat()`` the kernel
|
||||
|
@ -176,7 +176,7 @@ Then userspace.
|
||||
The requirement for a static, fixed preallocated system area comes from how
|
||||
qnx6fs deals with writes.
|
||||
|
||||
Each superblock got it's own half of the system area. So superblock #1
|
||||
Each superblock got its own half of the system area. So superblock #1
|
||||
always uses blocks from the lower half while superblock #2 just writes to
|
||||
blocks represented by the upper half bitmap system area bits.
|
||||
|
||||
|
@ -227,7 +227,7 @@ Files
|
||||
from the data buffer, updating the value of the specified signal
|
||||
notification register. The signal notification register will
|
||||
either be replaced with the input data or will be updated to the
|
||||
bitwise OR or the old value and the input data, depending on the
|
||||
bitwise OR of the old value and the input data, depending on the
|
||||
contents of the signal1_type, or signal2_type respectively,
|
||||
file.
|
||||
|
||||
|
@ -100,7 +100,7 @@ transactions together::
|
||||
|
||||
ntp = xfs_trans_dup(tp);
|
||||
xfs_trans_commit(tp);
|
||||
xfs_log_reserve(ntp);
|
||||
xfs_trans_reserve(ntp);
|
||||
|
||||
This results in a series of "rolling transactions" where the inode is locked
|
||||
across the entire chain of transactions. Hence while this series of rolling
|
||||
@ -191,7 +191,7 @@ transaction rolling mechanism to re-reserve space on every transaction roll. We
|
||||
know from the implementation of the permanent transactions how many transaction
|
||||
rolls are likely for the common modifications that need to be made.
|
||||
|
||||
For example, and inode allocation is typically two transactions - one to
|
||||
For example, an inode allocation is typically two transactions - one to
|
||||
physically allocate a free inode chunk on disk, and another to allocate an inode
|
||||
from an inode chunk that has free inodes in it. Hence for an inode allocation
|
||||
transaction, we might set the reservation log count to a value of 2 to indicate
|
||||
@ -200,7 +200,7 @@ chain. Each time a permanent transaction rolls, it consumes an entire unit
|
||||
reservation.
|
||||
|
||||
Hence when the permanent transaction is first allocated, the log space
|
||||
reservation is increases from a single unit reservation to multiple unit
|
||||
reservation is increased from a single unit reservation to multiple unit
|
||||
reservations. That multiple is defined by the reservation log count, and this
|
||||
means we can roll the transaction multiple times before we have to re-reserve
|
||||
log space when we roll the transaction. This ensures that the common
|
||||
@ -259,7 +259,7 @@ the next transaction in the sequeunce, but we have none remaining. We cannot
|
||||
sleep during the transaction commit process waiting for new log space to become
|
||||
available, as we may end up on the end of the FIFO queue and the items we have
|
||||
locked while we sleep could end up pinning the tail of the log before there is
|
||||
enough free space in the log to fulfil all of the pending reservations and
|
||||
enough free space in the log to fulfill all of the pending reservations and
|
||||
then wake up transaction commit in progress.
|
||||
|
||||
To take a new reservation without sleeping requires us to be able to take a
|
||||
@ -551,14 +551,14 @@ Essentially, this shows that an item that is in the AIL can still be modified
|
||||
and relogged, so any tracking must be separate to the AIL infrastructure. As
|
||||
such, we cannot reuse the AIL list pointers for tracking committed items, nor
|
||||
can we store state in any field that is protected by the AIL lock. Hence the
|
||||
committed item tracking needs it's own locks, lists and state fields in the log
|
||||
committed item tracking needs its own locks, lists and state fields in the log
|
||||
item.
|
||||
|
||||
Similar to the AIL, tracking of committed items is done through a new list
|
||||
called the Committed Item List (CIL). The list tracks log items that have been
|
||||
committed and have formatted memory buffers attached to them. It tracks objects
|
||||
in transaction commit order, so when an object is relogged it is removed from
|
||||
it's place in the list and re-inserted at the tail. This is entirely arbitrary
|
||||
its place in the list and re-inserted at the tail. This is entirely arbitrary
|
||||
and done to make it easy for debugging - the last items in the list are the
|
||||
ones that are most recently modified. Ordering of the CIL is not necessary for
|
||||
transactional integrity (as discussed in the next section) so the ordering is
|
||||
@ -615,7 +615,7 @@ those changes into the current checkpoint context. We then initialise a new
|
||||
context and attach that to the CIL for aggregation of new transactions.
|
||||
|
||||
This allows us to unlock the CIL immediately after transfer of all the
|
||||
committed items and effectively allow new transactions to be issued while we
|
||||
committed items and effectively allows new transactions to be issued while we
|
||||
are formatting the checkpoint into the log. It also allows concurrent
|
||||
checkpoints to be written into the log buffers in the case of log force heavy
|
||||
workloads, just like the existing transaction commit code does. This, however,
|
||||
@ -884,9 +884,9 @@ pin the object the first time it is inserted into the CIL - if it is already in
|
||||
the CIL during a transaction commit, then we do not pin it again. Because there
|
||||
can be multiple outstanding checkpoint contexts, we can still see elevated pin
|
||||
counts, but as each checkpoint completes the pin count will retain the correct
|
||||
value according to it's context.
|
||||
value according to its context.
|
||||
|
||||
Just to make matters more slightly more complex, this checkpoint level context
|
||||
Just to make matters slightly more complex, this checkpoint level context
|
||||
for the pin count means that the pinning of an item must take place under the
|
||||
CIL commit/flush lock. If we pin the object outside this lock, we cannot
|
||||
guarantee which context the pin count is associated with. This is because of
|
||||
|
@ -21,7 +21,7 @@ possible we decided to do following:
|
||||
- Devices behind real busses where there is a connector resource
|
||||
are represented as struct spi_device or struct i2c_device. Note
|
||||
that standard UARTs are not busses so there is no struct uart_device,
|
||||
although some of them may be represented by sturct serdev_device.
|
||||
although some of them may be represented by struct serdev_device.
|
||||
|
||||
As both ACPI and Device Tree represent a tree of devices (and their
|
||||
resources) this implementation follows the Device Tree way as much as
|
||||
@ -205,7 +205,7 @@ Here is what the ACPI namespace for a SPI slave might look like::
|
||||
}
|
||||
...
|
||||
|
||||
The SPI device drivers only need to add ACPI IDs in a similar way than with
|
||||
The SPI device drivers only need to add ACPI IDs in a similar way to
|
||||
the platform device drivers. Below is an example where we add ACPI support
|
||||
to at25 SPI eeprom driver (this is meant for the above ACPI snippet)::
|
||||
|
||||
@ -362,7 +362,7 @@ These GPIO numbers are controller relative and path "\\_SB.PCI0.GPI0"
|
||||
specifies the path to the controller. In order to use these GPIOs in Linux
|
||||
we need to translate them to the corresponding Linux GPIO descriptors.
|
||||
|
||||
There is a standard GPIO API for that and is documented in
|
||||
There is a standard GPIO API for that and it is documented in
|
||||
Documentation/admin-guide/gpio/.
|
||||
|
||||
In the above example we can get the corresponding two GPIO descriptors with
|
||||
@ -538,8 +538,8 @@ information.
|
||||
PCI hierarchy representation
|
||||
============================
|
||||
|
||||
Sometimes could be useful to enumerate a PCI device, knowing its position on the
|
||||
PCI bus.
|
||||
Sometimes it could be useful to enumerate a PCI device, knowing its position on
|
||||
the PCI bus.
|
||||
|
||||
For example, some systems use PCI devices soldered directly on the mother board,
|
||||
in a fixed position (ethernet, Wi-Fi, serial ports, etc.). In this conditions it
|
||||
@ -550,7 +550,7 @@ To identify a PCI device, a complete hierarchical description is required, from
|
||||
the chipset root port to the final device, through all the intermediate
|
||||
bridges/switches of the board.
|
||||
|
||||
For example, let us assume to have a system with a PCIe serial port, an
|
||||
For example, let's assume we have a system with a PCIe serial port, an
|
||||
Exar XR17V3521, soldered on the main board. This UART chip also includes
|
||||
16 GPIOs and we want to add the property ``gpio-line-names`` [1] to these pins.
|
||||
In this case, the ``lspci`` output for this component is::
|
||||
@ -593,8 +593,8 @@ of the chipset bridge (also called "root port") with address::
|
||||
|
||||
Bus: 0 - Device: 14 - Function: 1
|
||||
|
||||
To find this information is necessary disassemble the BIOS ACPI tables, in
|
||||
particular the DSDT (see also [2])::
|
||||
To find this information, it is necessary to disassemble the BIOS ACPI tables,
|
||||
in particular the DSDT (see also [2])::
|
||||
|
||||
mkdir ~/tables/
|
||||
cd ~/tables/
|
||||
|
@ -41,26 +41,23 @@ But it is likely that they will all eventually be added.
|
||||
What should an OEM do if they want to support Linux and Windows
|
||||
using the same BIOS image? Often they need to do something different
|
||||
for Linux to deal with how Linux is different from Windows.
|
||||
Here the BIOS should ask exactly what it wants to know:
|
||||
|
||||
In this case, the OEM should create custom ASL to be executed by the
|
||||
Linux kernel and changes to Linux kernel drivers to execute this custom
|
||||
ASL. The easiest way to accomplish this is to introduce a device specific
|
||||
method (_DSM) that is called from the Linux kernel.
|
||||
|
||||
In the past the kernel used to support something like:
|
||||
_OSI("Linux-OEM-my_interface_name")
|
||||
where 'OEM' is needed if this is an OEM-specific hook,
|
||||
and 'my_interface_name' describes the hook, which could be a
|
||||
quirk, a bug, or a bug-fix.
|
||||
|
||||
In addition, the OEM should send a patch to upstream Linux
|
||||
via the linux-acpi@vger.kernel.org mailing list. When that patch
|
||||
is checked into Linux, the OS will answer "YES" when the BIOS
|
||||
on the OEM's system uses _OSI to ask if the interface is supported
|
||||
by the OS. Linux distributors can back-port that patch for Linux
|
||||
pre-installs, and it will be included by all distributions that
|
||||
re-base to upstream. If the distribution can not update the kernel binary,
|
||||
they can also add an acpi_osi=Linux-OEM-my_interface_name
|
||||
cmdline parameter to the boot loader, as needed.
|
||||
|
||||
If the string refers to a feature where the upstream kernel
|
||||
eventually grows support, a patch should be sent to remove
|
||||
the string when that support is added to the kernel.
|
||||
However this was discovered to be abused by other BIOS vendors to change
|
||||
completely unrelated code on completely unrelated systems. This prompted
|
||||
an evaluation of all of it's uses. This uncovered that they aren't needed
|
||||
for any of the original reasons. As such, the kernel will not respond to
|
||||
any custom Linux-* strings by default.
|
||||
|
||||
That was easy. Read on, to find out how to do it wrong.
|
||||
|
||||
|
@ -64,7 +64,7 @@ correct address for this module, you could get in big trouble (read:
|
||||
crashes, data corruption, etc.). Try this only as a last resort (try BIOS
|
||||
updates first, for example), and backup first! An even more dangerous
|
||||
option is 'force_addr=<IOPORT>'. This will not only enable the PIIX4 like
|
||||
'force' foes, but it will also set a new base I/O port address. The SMBus
|
||||
'force' does, but it will also set a new base I/O port address. The SMBus
|
||||
parts of the PIIX4 needs a range of 8 of these addresses to function
|
||||
correctly. If these addresses are already reserved by some other device,
|
||||
you will get into big trouble! DON'T USE THIS IF YOU ARE NOT VERY SURE
|
||||
@ -86,15 +86,15 @@ If you own Force CPCI735 motherboard or other OSB4 based systems you may need
|
||||
to change the SMBus Interrupt Select register so the SMBus controller uses
|
||||
the SMI mode.
|
||||
|
||||
1) Use lspci command and locate the PCI device with the SMBus controller:
|
||||
1) Use ``lspci`` command and locate the PCI device with the SMBus controller:
|
||||
00:0f.0 ISA bridge: ServerWorks OSB4 South Bridge (rev 4f)
|
||||
The line may vary for different chipsets. Please consult the driver source
|
||||
for all possible PCI ids (and lspci -n to match them). Lets assume the
|
||||
for all possible PCI ids (and ``lspci -n`` to match them). Let's assume the
|
||||
device is located at 00:0f.0.
|
||||
2) Now you just need to change the value in 0xD2 register. Get it first with
|
||||
command: lspci -xxx -s 00:0f.0
|
||||
command: ``lspci -xxx -s 00:0f.0``
|
||||
If the value is 0x3 then you need to change it to 0x1:
|
||||
setpci -s 00:0f.0 d2.b=1
|
||||
``setpci -s 00:0f.0 d2.b=1``
|
||||
|
||||
Please note that you don't need to do that in all cases, just when the SMBus is
|
||||
not working properly.
|
||||
@ -109,6 +109,3 @@ which can easily get corrupted due to a state machine bug. These are mostly
|
||||
Thinkpad laptops, but desktop systems may also be affected. We have no list
|
||||
of all affected systems, so the only safe solution was to prevent access to
|
||||
the SMBus on all IBM systems (detected using DMI data.)
|
||||
|
||||
For additional information, read:
|
||||
http://www.lm-sensors.org/browser/lm-sensors/trunk/README
|
||||
|
@ -148,7 +148,7 @@ You can do plain I2C transactions by using read(2) and write(2) calls.
|
||||
You do not need to pass the address byte; instead, set it through
|
||||
ioctl I2C_SLAVE before you try to access the device.
|
||||
|
||||
You can do SMBus level transactions (see documentation file smbus-protocol
|
||||
You can do SMBus level transactions (see documentation file smbus-protocol.rst
|
||||
for details) through the following functions::
|
||||
|
||||
__s32 i2c_smbus_write_quick(int file, __u8 value);
|
||||
|
@ -5,6 +5,8 @@ I2C muxes and complex topologies
|
||||
There are a couple of reasons for building more complex I2C topologies
|
||||
than a straight-forward I2C bus with one adapter and one or more devices.
|
||||
|
||||
Some example use cases are:
|
||||
|
||||
1. A mux may be needed on the bus to prevent address collisions.
|
||||
|
||||
2. The bus may be accessible from some external bus master, and arbitration
|
||||
@ -14,10 +16,10 @@ than a straight-forward I2C bus with one adapter and one or more devices.
|
||||
from the I2C bus, at least most of the time, and sits behind a gate
|
||||
that has to be operated before the device can be accessed.
|
||||
|
||||
Etc
|
||||
===
|
||||
Several types of hardware components such as I2C muxes, I2C gates and I2C
|
||||
arbitrators allow to handle such needs.
|
||||
|
||||
These constructs are represented as I2C adapter trees by Linux, where
|
||||
These components are represented as I2C adapter trees by Linux, where
|
||||
each adapter has a parent adapter (except the root adapter) and zero or
|
||||
more child adapters. The root adapter is the actual adapter that issues
|
||||
I2C transfers, and all adapters with a parent are part of an "i2c-mux"
|
||||
@ -35,46 +37,7 @@ Locking
|
||||
=======
|
||||
|
||||
There are two variants of locking available to I2C muxes, they can be
|
||||
mux-locked or parent-locked muxes. As is evident from below, it can be
|
||||
useful to know if a mux is mux-locked or if it is parent-locked. The
|
||||
following list was correct at the time of writing:
|
||||
|
||||
In drivers/i2c/muxes/:
|
||||
|
||||
====================== =============================================
|
||||
i2c-arb-gpio-challenge Parent-locked
|
||||
i2c-mux-gpio Normally parent-locked, mux-locked iff
|
||||
all involved gpio pins are controlled by the
|
||||
same I2C root adapter that they mux.
|
||||
i2c-mux-gpmux Normally parent-locked, mux-locked iff
|
||||
specified in device-tree.
|
||||
i2c-mux-ltc4306 Mux-locked
|
||||
i2c-mux-mlxcpld Parent-locked
|
||||
i2c-mux-pca9541 Parent-locked
|
||||
i2c-mux-pca954x Parent-locked
|
||||
i2c-mux-pinctrl Normally parent-locked, mux-locked iff
|
||||
all involved pinctrl devices are controlled
|
||||
by the same I2C root adapter that they mux.
|
||||
i2c-mux-reg Parent-locked
|
||||
====================== =============================================
|
||||
|
||||
In drivers/iio/:
|
||||
|
||||
====================== =============================================
|
||||
gyro/mpu3050 Mux-locked
|
||||
imu/inv_mpu6050/ Mux-locked
|
||||
====================== =============================================
|
||||
|
||||
In drivers/media/:
|
||||
|
||||
======================= =============================================
|
||||
dvb-frontends/lgdt3306a Mux-locked
|
||||
dvb-frontends/m88ds3103 Parent-locked
|
||||
dvb-frontends/rtl2830 Parent-locked
|
||||
dvb-frontends/rtl2832 Mux-locked
|
||||
dvb-frontends/si2168 Mux-locked
|
||||
usb/cx231xx/ Parent-locked
|
||||
======================= =============================================
|
||||
mux-locked or parent-locked muxes.
|
||||
|
||||
|
||||
Mux-locked muxes
|
||||
@ -89,40 +52,8 @@ full transaction, unrelated I2C transfers may interleave the different
|
||||
stages of the transaction. This has the benefit that the mux driver
|
||||
may be easier and cleaner to implement, but it has some caveats.
|
||||
|
||||
==== =====================================================================
|
||||
ML1. If you build a topology with a mux-locked mux being the parent
|
||||
of a parent-locked mux, this might break the expectation from the
|
||||
parent-locked mux that the root adapter is locked during the
|
||||
transaction.
|
||||
|
||||
ML2. It is not safe to build arbitrary topologies with two (or more)
|
||||
mux-locked muxes that are not siblings, when there are address
|
||||
collisions between the devices on the child adapters of these
|
||||
non-sibling muxes.
|
||||
|
||||
I.e. the select-transfer-deselect transaction targeting e.g. device
|
||||
address 0x42 behind mux-one may be interleaved with a similar
|
||||
operation targeting device address 0x42 behind mux-two. The
|
||||
intension with such a topology would in this hypothetical example
|
||||
be that mux-one and mux-two should not be selected simultaneously,
|
||||
but mux-locked muxes do not guarantee that in all topologies.
|
||||
|
||||
ML3. A mux-locked mux cannot be used by a driver for auto-closing
|
||||
gates/muxes, i.e. something that closes automatically after a given
|
||||
number (one, in most cases) of I2C transfers. Unrelated I2C transfers
|
||||
may creep in and close prematurely.
|
||||
|
||||
ML4. If any non-I2C operation in the mux driver changes the I2C mux state,
|
||||
the driver has to lock the root adapter during that operation.
|
||||
Otherwise garbage may appear on the bus as seen from devices
|
||||
behind the mux, when an unrelated I2C transfer is in flight during
|
||||
the non-I2C mux-changing operation.
|
||||
==== =====================================================================
|
||||
|
||||
|
||||
Mux-locked Example
|
||||
------------------
|
||||
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
::
|
||||
|
||||
@ -153,6 +84,43 @@ This means that accesses to D2 are lockout out for the full duration
|
||||
of the entire operation. But accesses to D3 are possibly interleaved
|
||||
at any point.
|
||||
|
||||
Mux-locked caveats
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When using a mux-locked mux, be aware of the following restrictions:
|
||||
|
||||
[ML1]
|
||||
If you build a topology with a mux-locked mux being the parent
|
||||
of a parent-locked mux, this might break the expectation from the
|
||||
parent-locked mux that the root adapter is locked during the
|
||||
transaction.
|
||||
|
||||
[ML2]
|
||||
It is not safe to build arbitrary topologies with two (or more)
|
||||
mux-locked muxes that are not siblings, when there are address
|
||||
collisions between the devices on the child adapters of these
|
||||
non-sibling muxes.
|
||||
|
||||
I.e. the select-transfer-deselect transaction targeting e.g. device
|
||||
address 0x42 behind mux-one may be interleaved with a similar
|
||||
operation targeting device address 0x42 behind mux-two. The
|
||||
intent with such a topology would in this hypothetical example
|
||||
be that mux-one and mux-two should not be selected simultaneously,
|
||||
but mux-locked muxes do not guarantee that in all topologies.
|
||||
|
||||
[ML3]
|
||||
A mux-locked mux cannot be used by a driver for auto-closing
|
||||
gates/muxes, i.e. something that closes automatically after a given
|
||||
number (one, in most cases) of I2C transfers. Unrelated I2C transfers
|
||||
may creep in and close prematurely.
|
||||
|
||||
[ML4]
|
||||
If any non-I2C operation in the mux driver changes the I2C mux state,
|
||||
the driver has to lock the root adapter during that operation.
|
||||
Otherwise garbage may appear on the bus as seen from devices
|
||||
behind the mux, when an unrelated I2C transfer is in flight during
|
||||
the non-I2C mux-changing operation.
|
||||
|
||||
|
||||
Parent-locked muxes
|
||||
-------------------
|
||||
@ -161,28 +129,10 @@ Parent-locked muxes lock the parent adapter during the full select-
|
||||
transfer-deselect transaction. The implication is that the mux driver
|
||||
has to ensure that any and all I2C transfers through that parent
|
||||
adapter during the transaction are unlocked I2C transfers (using e.g.
|
||||
__i2c_transfer), or a deadlock will follow. There are a couple of
|
||||
caveats.
|
||||
|
||||
==== ====================================================================
|
||||
PL1. If you build a topology with a parent-locked mux being the child
|
||||
of another mux, this might break a possible assumption from the
|
||||
child mux that the root adapter is unused between its select op
|
||||
and the actual transfer (e.g. if the child mux is auto-closing
|
||||
and the parent mux issues I2C transfers as part of its select).
|
||||
This is especially the case if the parent mux is mux-locked, but
|
||||
it may also happen if the parent mux is parent-locked.
|
||||
|
||||
PL2. If select/deselect calls out to other subsystems such as gpio,
|
||||
pinctrl, regmap or iio, it is essential that any I2C transfers
|
||||
caused by these subsystems are unlocked. This can be convoluted to
|
||||
accomplish, maybe even impossible if an acceptably clean solution
|
||||
is sought.
|
||||
==== ====================================================================
|
||||
|
||||
__i2c_transfer), or a deadlock will follow.
|
||||
|
||||
Parent-locked Example
|
||||
---------------------
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
::
|
||||
|
||||
@ -212,10 +162,30 @@ When there is an access to D1, this happens:
|
||||
9. M1 unlocks its parent adapter.
|
||||
10. M1 unlocks muxes on its parent.
|
||||
|
||||
|
||||
This means that accesses to both D2 and D3 are locked out for the full
|
||||
duration of the entire operation.
|
||||
|
||||
Parent-locked Caveats
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When using a parent-locked mux, be aware of the following restrictions:
|
||||
|
||||
[PL1]
|
||||
If you build a topology with a parent-locked mux being the child
|
||||
of another mux, this might break a possible assumption from the
|
||||
child mux that the root adapter is unused between its select op
|
||||
and the actual transfer (e.g. if the child mux is auto-closing
|
||||
and the parent mux issues I2C transfers as part of its select).
|
||||
This is especially the case if the parent mux is mux-locked, but
|
||||
it may also happen if the parent mux is parent-locked.
|
||||
|
||||
[PL2]
|
||||
If select/deselect calls out to other subsystems such as gpio,
|
||||
pinctrl, regmap or iio, it is essential that any I2C transfers
|
||||
caused by these subsystems are unlocked. This can be convoluted to
|
||||
accomplish, maybe even impossible if an acceptably clean solution
|
||||
is sought.
|
||||
|
||||
|
||||
Complex Examples
|
||||
================
|
||||
@ -261,8 +231,10 @@ This is a good topology::
|
||||
When device D1 is accessed, accesses to D2 are locked out for the
|
||||
full duration of the operation (muxes on the top child adapter of M1
|
||||
are locked). But accesses to D3 and D4 are possibly interleaved at
|
||||
any point. Accesses to D3 locks out D1 and D2, but accesses to D4
|
||||
are still possibly interleaved.
|
||||
any point.
|
||||
|
||||
Accesses to D3 locks out D1 and D2, but accesses to D4 are still possibly
|
||||
interleaved.
|
||||
|
||||
|
||||
Mux-locked mux as parent of parent-locked mux
|
||||
@ -394,3 +366,47 @@ This is a good topology::
|
||||
When D1 or D2 are accessed, accesses to D3 and D4 are locked out while
|
||||
accesses to D5 may interleave. When D3 or D4 are accessed, accesses to
|
||||
all other devices are locked out.
|
||||
|
||||
|
||||
Mux type of existing device drivers
|
||||
===================================
|
||||
|
||||
Whether a device is mux-locked or parent-locked depends on its
|
||||
implementation. The following list was correct at the time of writing:
|
||||
|
||||
In drivers/i2c/muxes/:
|
||||
|
||||
====================== =============================================
|
||||
i2c-arb-gpio-challenge Parent-locked
|
||||
i2c-mux-gpio Normally parent-locked, mux-locked iff
|
||||
all involved gpio pins are controlled by the
|
||||
same I2C root adapter that they mux.
|
||||
i2c-mux-gpmux Normally parent-locked, mux-locked iff
|
||||
specified in device-tree.
|
||||
i2c-mux-ltc4306 Mux-locked
|
||||
i2c-mux-mlxcpld Parent-locked
|
||||
i2c-mux-pca9541 Parent-locked
|
||||
i2c-mux-pca954x Parent-locked
|
||||
i2c-mux-pinctrl Normally parent-locked, mux-locked iff
|
||||
all involved pinctrl devices are controlled
|
||||
by the same I2C root adapter that they mux.
|
||||
i2c-mux-reg Parent-locked
|
||||
====================== =============================================
|
||||
|
||||
In drivers/iio/:
|
||||
|
||||
====================== =============================================
|
||||
gyro/mpu3050 Mux-locked
|
||||
imu/inv_mpu6050/ Mux-locked
|
||||
====================== =============================================
|
||||
|
||||
In drivers/media/:
|
||||
|
||||
======================= =============================================
|
||||
dvb-frontends/lgdt3306a Mux-locked
|
||||
dvb-frontends/m88ds3103 Parent-locked
|
||||
dvb-frontends/rtl2830 Parent-locked
|
||||
dvb-frontends/rtl2832 Mux-locked
|
||||
dvb-frontends/si2168 Mux-locked
|
||||
usb/cx231xx/ Parent-locked
|
||||
======================= =============================================
|
||||
|
@ -32,9 +32,9 @@ User manual
|
||||
===========
|
||||
|
||||
I2C slave backends behave like standard I2C clients. So, you can instantiate
|
||||
them as described in the document 'instantiating-devices'. The only difference
|
||||
is that i2c slave backends have their own address space. So, you have to add
|
||||
0x1000 to the address you would originally request. An example for
|
||||
them as described in the document instantiating-devices.rst. The only
|
||||
difference is that i2c slave backends have their own address space. So, you
|
||||
have to add 0x1000 to the address you would originally request. An example for
|
||||
instantiating the slave-eeprom driver from userspace at the 7 bit address 0x64
|
||||
on bus 1::
|
||||
|
||||
|
@ -364,7 +364,7 @@ stop condition is issued between transaction. The i2c_msg structure
|
||||
contains for each message the client address, the number of bytes of the
|
||||
message and the message data itself.
|
||||
|
||||
You can read the file ``i2c-protocol`` for more information about the
|
||||
You can read the file i2c-protocol.rst for more information about the
|
||||
actual I2C protocol.
|
||||
|
||||
|
||||
@ -414,7 +414,7 @@ transactions return 0 on success; the 'read' transactions return the read
|
||||
value, except for block transactions, which return the number of values
|
||||
read. The block buffers need not be longer than 32 bytes.
|
||||
|
||||
You can read the file ``smbus-protocol`` for more information about the
|
||||
You can read the file smbus-protocol.rst for more information about the
|
||||
actual SMBus protocol.
|
||||
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
|
||||
.. The Linux Kernel documentation master file, created by
|
||||
sphinx-quickstart on Fri Feb 12 13:51:46 2016.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
.. _linux_doc:
|
||||
|
||||
The Linux Kernel documentation
|
||||
@ -18,26 +12,72 @@ documents into a coherent whole. Please note that improvements to the
|
||||
documentation are welcome; join the linux-doc list at vger.kernel.org if
|
||||
you want to help out.
|
||||
|
||||
Licensing documentation
|
||||
-----------------------
|
||||
Working with the development community
|
||||
--------------------------------------
|
||||
|
||||
The following describes the license of the Linux kernel source code
|
||||
(GPLv2), how to properly mark the license of individual files in the source
|
||||
tree, as well as links to the full license text.
|
||||
The essential guides for interacting with the kernel's development
|
||||
community and getting your work upstream.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
process/development-process
|
||||
process/submitting-patches
|
||||
Code of conduct <process/code-of-conduct>
|
||||
maintainer/index
|
||||
All development-process docs <process/index>
|
||||
|
||||
|
||||
Internal API manuals
|
||||
--------------------
|
||||
|
||||
Manuals for use by developers working to interface with the rest of the
|
||||
kernel.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
core-api/index
|
||||
driver-api/index
|
||||
subsystem-apis
|
||||
Locking in the kernel <locking/index>
|
||||
|
||||
Development tools and processes
|
||||
-------------------------------
|
||||
|
||||
Various other manuals with useful information for all kernel developers.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
process/license-rules
|
||||
doc-guide/index
|
||||
dev-tools/index
|
||||
dev-tools/testing-overview
|
||||
kernel-hacking/index
|
||||
trace/index
|
||||
fault-injection/index
|
||||
livepatch/index
|
||||
|
||||
* :ref:`kernel_licensing`
|
||||
|
||||
User-oriented documentation
|
||||
---------------------------
|
||||
|
||||
The following manuals are written for *users* of the kernel — those who are
|
||||
trying to get it to work optimally on a given system.
|
||||
trying to get it to work optimally on a given system and application
|
||||
developers seeking information on the kernel's user-space APIs.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:maxdepth: 1
|
||||
|
||||
admin-guide/index
|
||||
kbuild/index
|
||||
The kernel build system <kbuild/index>
|
||||
admin-guide/reporting-issues.rst
|
||||
User-space tools <tools/index>
|
||||
userspace-api/index
|
||||
|
||||
See also: the `Linux man pages <https://www.kernel.org/doc/man-pages/>`_,
|
||||
which are kept separately from the kernel's own documentation.
|
||||
|
||||
Firmware-related documentation
|
||||
------------------------------
|
||||
@ -45,106 +85,11 @@ The following holds information on the kernel's expectations regarding the
|
||||
platform firmwares.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:maxdepth: 1
|
||||
|
||||
firmware-guide/index
|
||||
devicetree/index
|
||||
|
||||
Application-developer documentation
|
||||
-----------------------------------
|
||||
|
||||
The user-space API manual gathers together documents describing aspects of
|
||||
the kernel interface as seen by application developers.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
userspace-api/index
|
||||
|
||||
|
||||
Introduction to kernel development
|
||||
----------------------------------
|
||||
|
||||
These manuals contain overall information about how to develop the kernel.
|
||||
The kernel community is quite large, with thousands of developers
|
||||
contributing over the course of a year. As with any large community,
|
||||
knowing how things are done will make the process of getting your changes
|
||||
merged much easier.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
process/index
|
||||
dev-tools/index
|
||||
doc-guide/index
|
||||
kernel-hacking/index
|
||||
trace/index
|
||||
maintainer/index
|
||||
fault-injection/index
|
||||
livepatch/index
|
||||
|
||||
|
||||
Kernel API documentation
|
||||
------------------------
|
||||
|
||||
These books get into the details of how specific kernel subsystems work
|
||||
from the point of view of a kernel developer. Much of the information here
|
||||
is taken directly from the kernel source, with supplemental material added
|
||||
as needed (or at least as we managed to add it — probably *not* all that is
|
||||
needed).
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
driver-api/index
|
||||
core-api/index
|
||||
locking/index
|
||||
accounting/index
|
||||
block/index
|
||||
cdrom/index
|
||||
cpu-freq/index
|
||||
fb/index
|
||||
fpga/index
|
||||
hid/index
|
||||
i2c/index
|
||||
iio/index
|
||||
isdn/index
|
||||
infiniband/index
|
||||
leds/index
|
||||
netlabel/index
|
||||
networking/index
|
||||
pcmcia/index
|
||||
power/index
|
||||
target/index
|
||||
timers/index
|
||||
spi/index
|
||||
w1/index
|
||||
watchdog/index
|
||||
virt/index
|
||||
input/index
|
||||
hwmon/index
|
||||
gpu/index
|
||||
security/index
|
||||
sound/index
|
||||
crypto/index
|
||||
filesystems/index
|
||||
mm/index
|
||||
bpf/index
|
||||
usb/index
|
||||
PCI/index
|
||||
scsi/index
|
||||
misc-devices/index
|
||||
scheduler/index
|
||||
mhi/index
|
||||
peci/index
|
||||
|
||||
Architecture-agnostic documentation
|
||||
-----------------------------------
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
asm-annotations
|
||||
|
||||
Architecture-specific documentation
|
||||
-----------------------------------
|
||||
@ -163,9 +108,8 @@ of the documentation body, or may require some adjustments and/or conversion
|
||||
to ReStructured Text format, or are simply too old.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:maxdepth: 1
|
||||
|
||||
tools/index
|
||||
staging/index
|
||||
|
||||
|
||||
|
@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes:
|
||||
* AVB Mag Turbo Force
|
||||
* AVB Top Shot Pegasus
|
||||
* AVB Top Shot Force Feedback Racing Wheel
|
||||
* Boeder Force Feedback Wheel
|
||||
* Logitech WingMan Force
|
||||
* Logitech WingMan Force Wheel
|
||||
* Guillemot Race Leader Force Feedback
|
||||
|
@ -90,7 +90,11 @@ e.g., on Ubuntu for gcc-10::
|
||||
|
||||
Or on Fedora::
|
||||
|
||||
dnf install gcc-plugin-devel
|
||||
dnf install gcc-plugin-devel libmpc-devel
|
||||
|
||||
Or on Fedora when using cross-compilers that include plugins::
|
||||
|
||||
dnf install libmpc-devel
|
||||
|
||||
Enable the GCC plugin infrastructure and some plugin(s) you want to use
|
||||
in the kernel config::
|
||||
@ -99,6 +103,19 @@ in the kernel config::
|
||||
CONFIG_GCC_PLUGIN_LATENT_ENTROPY=y
|
||||
...
|
||||
|
||||
Run gcc (native or cross-compiler) to ensure plugin headers are detected::
|
||||
|
||||
gcc -print-file-name=plugin
|
||||
CROSS_COMPILE=arm-linux-gnu- ${CROSS_COMPILE}gcc -print-file-name=plugin
|
||||
|
||||
The word "plugin" means they are not detected::
|
||||
|
||||
plugin
|
||||
|
||||
A full path means they are detected::
|
||||
|
||||
/usr/lib/gcc/x86_64-redhat-linux/12/plugin
|
||||
|
||||
To compile the minimum tool set including the plugin(s)::
|
||||
|
||||
make scripts
|
||||
|
@ -39,7 +39,7 @@ as the writer can invalidate a pointer that the reader is following.
|
||||
Sequence counters (``seqcount_t``)
|
||||
==================================
|
||||
|
||||
This is the the raw counting mechanism, which does not protect against
|
||||
This is the raw counting mechanism, which does not protect against
|
||||
multiple writers. Write side critical sections must thus be serialized
|
||||
by an external lock.
|
||||
|
||||
|
@ -52,7 +52,7 @@ CONTENTS
|
||||
|
||||
- Varieties of memory barrier.
|
||||
- What may not be assumed about memory barriers?
|
||||
- Data dependency barriers (historical).
|
||||
- Address-dependency barriers (historical).
|
||||
- Control dependencies.
|
||||
- SMP barrier pairing.
|
||||
- Examples of memory barrier sequences.
|
||||
@ -187,9 +187,9 @@ As a further example, consider this sequence of events:
|
||||
B = 4; Q = P;
|
||||
P = &B; D = *Q;
|
||||
|
||||
There is an obvious data dependency here, as the value loaded into D depends on
|
||||
the address retrieved from P by CPU 2. At the end of the sequence, any of the
|
||||
following results are possible:
|
||||
There is an obvious address dependency here, as the value loaded into D depends
|
||||
on the address retrieved from P by CPU 2. At the end of the sequence, any of
|
||||
the following results are possible:
|
||||
|
||||
(Q == &A) and (D == 1)
|
||||
(Q == &B) and (D == 2)
|
||||
@ -391,58 +391,62 @@ Memory barriers come in four basic varieties:
|
||||
memory system as time progresses. All stores _before_ a write barrier
|
||||
will occur _before_ all the stores after the write barrier.
|
||||
|
||||
[!] Note that write barriers should normally be paired with read or data
|
||||
dependency barriers; see the "SMP barrier pairing" subsection.
|
||||
[!] Note that write barriers should normally be paired with read or
|
||||
address-dependency barriers; see the "SMP barrier pairing" subsection.
|
||||
|
||||
|
||||
(2) Data dependency barriers.
|
||||
(2) Address-dependency barriers (historical).
|
||||
|
||||
A data dependency barrier is a weaker form of read barrier. In the case
|
||||
where two loads are performed such that the second depends on the result
|
||||
of the first (eg: the first load retrieves the address to which the second
|
||||
load will be directed), a data dependency barrier would be required to
|
||||
make sure that the target of the second load is updated after the address
|
||||
obtained by the first load is accessed.
|
||||
An address-dependency barrier is a weaker form of read barrier. In the
|
||||
case where two loads are performed such that the second depends on the
|
||||
result of the first (eg: the first load retrieves the address to which
|
||||
the second load will be directed), an address-dependency barrier would
|
||||
be required to make sure that the target of the second load is updated
|
||||
after the address obtained by the first load is accessed.
|
||||
|
||||
A data dependency barrier is a partial ordering on interdependent loads
|
||||
only; it is not required to have any effect on stores, independent loads
|
||||
or overlapping loads.
|
||||
An address-dependency barrier is a partial ordering on interdependent
|
||||
loads only; it is not required to have any effect on stores, independent
|
||||
loads or overlapping loads.
|
||||
|
||||
As mentioned in (1), the other CPUs in the system can be viewed as
|
||||
committing sequences of stores to the memory system that the CPU being
|
||||
considered can then perceive. A data dependency barrier issued by the CPU
|
||||
under consideration guarantees that for any load preceding it, if that
|
||||
load touches one of a sequence of stores from another CPU, then by the
|
||||
time the barrier completes, the effects of all the stores prior to that
|
||||
touched by the load will be perceptible to any loads issued after the data
|
||||
dependency barrier.
|
||||
considered can then perceive. An address-dependency barrier issued by
|
||||
the CPU under consideration guarantees that for any load preceding it,
|
||||
if that load touches one of a sequence of stores from another CPU, then
|
||||
by the time the barrier completes, the effects of all the stores prior to
|
||||
that touched by the load will be perceptible to any loads issued after
|
||||
the address-dependency barrier.
|
||||
|
||||
See the "Examples of memory barrier sequences" subsection for diagrams
|
||||
showing the ordering constraints.
|
||||
|
||||
[!] Note that the first load really has to have a _data_ dependency and
|
||||
[!] Note that the first load really has to have an _address_ dependency and
|
||||
not a control dependency. If the address for the second load is dependent
|
||||
on the first load, but the dependency is through a conditional rather than
|
||||
actually loading the address itself, then it's a _control_ dependency and
|
||||
a full read barrier or better is required. See the "Control dependencies"
|
||||
subsection for more information.
|
||||
|
||||
[!] Note that data dependency barriers should normally be paired with
|
||||
[!] Note that address-dependency barriers should normally be paired with
|
||||
write barriers; see the "SMP barrier pairing" subsection.
|
||||
|
||||
[!] Kernel release v5.9 removed kernel APIs for explicit address-
|
||||
dependency barriers. Nowadays, APIs for marking loads from shared
|
||||
variables such as READ_ONCE() and rcu_dereference() provide implicit
|
||||
address-dependency barriers.
|
||||
|
||||
(3) Read (or load) memory barriers.
|
||||
|
||||
A read barrier is a data dependency barrier plus a guarantee that all the
|
||||
LOAD operations specified before the barrier will appear to happen before
|
||||
all the LOAD operations specified after the barrier with respect to the
|
||||
other components of the system.
|
||||
A read barrier is an address-dependency barrier plus a guarantee that all
|
||||
the LOAD operations specified before the barrier will appear to happen
|
||||
before all the LOAD operations specified after the barrier with respect to
|
||||
the other components of the system.
|
||||
|
||||
A read barrier is a partial ordering on loads only; it is not required to
|
||||
have any effect on stores.
|
||||
|
||||
Read memory barriers imply data dependency barriers, and so can substitute
|
||||
for them.
|
||||
Read memory barriers imply address-dependency barriers, and so can
|
||||
substitute for them.
|
||||
|
||||
[!] Note that read barriers should normally be paired with write barriers;
|
||||
see the "SMP barrier pairing" subsection.
|
||||
@ -550,17 +554,21 @@ There are certain things that the Linux kernel memory barriers do not guarantee:
|
||||
Documentation/core-api/dma-api.rst
|
||||
|
||||
|
||||
DATA DEPENDENCY BARRIERS (HISTORICAL)
|
||||
-------------------------------------
|
||||
ADDRESS-DEPENDENCY BARRIERS (HISTORICAL)
|
||||
----------------------------------------
|
||||
|
||||
As of v4.15 of the Linux kernel, an smp_mb() was added to READ_ONCE() for
|
||||
DEC Alpha, which means that about the only people who need to pay attention
|
||||
to this section are those working on DEC Alpha architecture-specific code
|
||||
and those working on READ_ONCE() itself. For those who need it, and for
|
||||
those who are interested in the history, here is the story of
|
||||
data-dependency barriers.
|
||||
address-dependency barriers.
|
||||
|
||||
The usage requirements of data dependency barriers are a little subtle, and
|
||||
[!] While address dependencies are observed in both load-to-load and
|
||||
load-to-store relations, address-dependency barriers are not necessary
|
||||
for load-to-store situations.
|
||||
|
||||
The requirement of address-dependency barriers is a little subtle, and
|
||||
it's not always obvious that they're needed. To illustrate, consider the
|
||||
following sequence of events:
|
||||
|
||||
@ -570,11 +578,14 @@ following sequence of events:
|
||||
B = 4;
|
||||
<write barrier>
|
||||
WRITE_ONCE(P, &B);
|
||||
Q = READ_ONCE(P);
|
||||
Q = READ_ONCE_OLD(P);
|
||||
D = *Q;
|
||||
|
||||
There's a clear data dependency here, and it would seem that by the end of the
|
||||
sequence, Q must be either &A or &B, and that:
|
||||
[!] READ_ONCE_OLD() corresponds to READ_ONCE() of pre-4.15 kernel, which
|
||||
doesn't imply an address-dependency barrier.
|
||||
|
||||
There's a clear address dependency here, and it would seem that by the end of
|
||||
the sequence, Q must be either &A or &B, and that:
|
||||
|
||||
(Q == &A) implies (D == 1)
|
||||
(Q == &B) implies (D == 4)
|
||||
@ -588,8 +599,8 @@ While this may seem like a failure of coherency or causality maintenance, it
|
||||
isn't, and this behaviour can be observed on certain real CPUs (such as the DEC
|
||||
Alpha).
|
||||
|
||||
To deal with this, a data dependency barrier or better must be inserted
|
||||
between the address load and the data load:
|
||||
To deal with this, READ_ONCE() provides an implicit address-dependency barrier
|
||||
since kernel release v4.15:
|
||||
|
||||
CPU 1 CPU 2
|
||||
=============== ===============
|
||||
@ -598,7 +609,7 @@ between the address load and the data load:
|
||||
<write barrier>
|
||||
WRITE_ONCE(P, &B);
|
||||
Q = READ_ONCE(P);
|
||||
<data dependency barrier>
|
||||
<implicit address-dependency barrier>
|
||||
D = *Q;
|
||||
|
||||
This enforces the occurrence of one of the two implications, and prevents the
|
||||
@ -615,13 +626,13 @@ odd-numbered bank is idle, one can see the new value of the pointer P (&B),
|
||||
but the old value of the variable B (2).
|
||||
|
||||
|
||||
A data-dependency barrier is not required to order dependent writes
|
||||
because the CPUs that the Linux kernel supports don't do writes
|
||||
until they are certain (1) that the write will actually happen, (2)
|
||||
of the location of the write, and (3) of the value to be written.
|
||||
An address-dependency barrier is not required to order dependent writes
|
||||
because the CPUs that the Linux kernel supports don't do writes until they
|
||||
are certain (1) that the write will actually happen, (2) of the location of
|
||||
the write, and (3) of the value to be written.
|
||||
But please carefully read the "CONTROL DEPENDENCIES" section and the
|
||||
Documentation/RCU/rcu_dereference.rst file: The compiler can and does
|
||||
break dependencies in a great many highly creative ways.
|
||||
Documentation/RCU/rcu_dereference.rst file: The compiler can and does break
|
||||
dependencies in a great many highly creative ways.
|
||||
|
||||
CPU 1 CPU 2
|
||||
=============== ===============
|
||||
@ -629,12 +640,12 @@ break dependencies in a great many highly creative ways.
|
||||
B = 4;
|
||||
<write barrier>
|
||||
WRITE_ONCE(P, &B);
|
||||
Q = READ_ONCE(P);
|
||||
Q = READ_ONCE_OLD(P);
|
||||
WRITE_ONCE(*Q, 5);
|
||||
|
||||
Therefore, no data-dependency barrier is required to order the read into
|
||||
Therefore, no address-dependency barrier is required to order the read into
|
||||
Q with the store into *Q. In other words, this outcome is prohibited,
|
||||
even without a data-dependency barrier:
|
||||
even without an implicit address-dependency barrier of modern READ_ONCE():
|
||||
|
||||
(Q == &B) && (B == 4)
|
||||
|
||||
@ -645,12 +656,12 @@ can be used to record rare error conditions and the like, and the CPUs'
|
||||
naturally occurring ordering prevents such records from being lost.
|
||||
|
||||
|
||||
Note well that the ordering provided by a data dependency is local to
|
||||
Note well that the ordering provided by an address dependency is local to
|
||||
the CPU containing it. See the section on "Multicopy atomicity" for
|
||||
more information.
|
||||
|
||||
|
||||
The data dependency barrier is very important to the RCU system,
|
||||
The address-dependency barrier is very important to the RCU system,
|
||||
for example. See rcu_assign_pointer() and rcu_dereference() in
|
||||
include/linux/rcupdate.h. This permits the current target of an RCU'd
|
||||
pointer to be replaced with a new modified target, without the replacement
|
||||
@ -667,20 +678,21 @@ not understand them. The purpose of this section is to help you prevent
|
||||
the compiler's ignorance from breaking your code.
|
||||
|
||||
A load-load control dependency requires a full read memory barrier, not
|
||||
simply a data dependency barrier to make it work correctly. Consider the
|
||||
following bit of code:
|
||||
simply an (implicit) address-dependency barrier to make it work correctly.
|
||||
Consider the following bit of code:
|
||||
|
||||
q = READ_ONCE(a);
|
||||
<implicit address-dependency barrier>
|
||||
if (q) {
|
||||
<data dependency barrier> /* BUG: No data dependency!!! */
|
||||
/* BUG: No address dependency!!! */
|
||||
p = READ_ONCE(b);
|
||||
}
|
||||
|
||||
This will not have the desired effect because there is no actual data
|
||||
This will not have the desired effect because there is no actual address
|
||||
dependency, but rather a control dependency that the CPU may short-circuit
|
||||
by attempting to predict the outcome in advance, so that other CPUs see
|
||||
the load from b as having happened before the load from a. In such a
|
||||
case what's actually required is:
|
||||
the load from b as having happened before the load from a. In such a case
|
||||
what's actually required is:
|
||||
|
||||
q = READ_ONCE(a);
|
||||
if (q) {
|
||||
@ -927,9 +939,9 @@ General barriers pair with each other, though they also pair with most
|
||||
other types of barriers, albeit without multicopy atomicity. An acquire
|
||||
barrier pairs with a release barrier, but both may also pair with other
|
||||
barriers, including of course general barriers. A write barrier pairs
|
||||
with a data dependency barrier, a control dependency, an acquire barrier,
|
||||
with an address-dependency barrier, a control dependency, an acquire barrier,
|
||||
a release barrier, a read barrier, or a general barrier. Similarly a
|
||||
read barrier, control dependency, or a data dependency barrier pairs
|
||||
read barrier, control dependency, or an address-dependency barrier pairs
|
||||
with a write barrier, an acquire barrier, a release barrier, or a
|
||||
general barrier:
|
||||
|
||||
@ -948,7 +960,7 @@ Or:
|
||||
a = 1;
|
||||
<write barrier>
|
||||
WRITE_ONCE(b, &a); x = READ_ONCE(b);
|
||||
<data dependency barrier>
|
||||
<implicit address-dependency barrier>
|
||||
y = *x;
|
||||
|
||||
Or even:
|
||||
@ -968,8 +980,8 @@ Basically, the read barrier always has to be there, even though it can be of
|
||||
the "weaker" type.
|
||||
|
||||
[!] Note that the stores before the write barrier would normally be expected to
|
||||
match the loads after the read barrier or the data dependency barrier, and vice
|
||||
versa:
|
||||
match the loads after the read barrier or the address-dependency barrier, and
|
||||
vice versa:
|
||||
|
||||
CPU 1 CPU 2
|
||||
=================== ===================
|
||||
@ -1021,8 +1033,8 @@ STORE B, STORE C } all occurring before the unordered set of { STORE D, STORE E
|
||||
V
|
||||
|
||||
|
||||
Secondly, data dependency barriers act as partial orderings on data-dependent
|
||||
loads. Consider the following sequence of events:
|
||||
Secondly, address-dependency barriers act as partial orderings on address-
|
||||
dependent loads. Consider the following sequence of events:
|
||||
|
||||
CPU 1 CPU 2
|
||||
======================= =======================
|
||||
@ -1067,8 +1079,8 @@ effectively random order, despite the write barrier issued by CPU 1:
|
||||
In the above example, CPU 2 perceives that B is 7, despite the load of *C
|
||||
(which would be B) coming after the LOAD of C.
|
||||
|
||||
If, however, a data dependency barrier were to be placed between the load of C
|
||||
and the load of *C (ie: B) on CPU 2:
|
||||
If, however, an address-dependency barrier were to be placed between the load
|
||||
of C and the load of *C (ie: B) on CPU 2:
|
||||
|
||||
CPU 1 CPU 2
|
||||
======================= =======================
|
||||
@ -1078,7 +1090,7 @@ and the load of *C (ie: B) on CPU 2:
|
||||
<write barrier>
|
||||
STORE C = &B LOAD X
|
||||
STORE D = 4 LOAD C (gets &B)
|
||||
<data dependency barrier>
|
||||
<address-dependency barrier>
|
||||
LOAD *C (reads B)
|
||||
|
||||
then the following will occur:
|
||||
@ -1101,7 +1113,7 @@ then the following will occur:
|
||||
| +-------+ | |
|
||||
| | X->9 |------>| |
|
||||
| +-------+ | |
|
||||
Makes sure all effects ---> \ ddddddddddddddddd | |
|
||||
Makes sure all effects ---> \ aaaaaaaaaaaaaaaaa | |
|
||||
prior to the store of C \ +-------+ | |
|
||||
are perceptible to ----->| B->2 |------>| |
|
||||
subsequent loads +-------+ | |
|
||||
@ -1292,7 +1304,7 @@ Which might appear as this:
|
||||
LOAD with immediate effect : : +-------+
|
||||
|
||||
|
||||
Placing a read barrier or a data dependency barrier just before the second
|
||||
Placing a read barrier or an address-dependency barrier just before the second
|
||||
load:
|
||||
|
||||
CPU 1 CPU 2
|
||||
@ -1816,20 +1828,20 @@ which may then reorder things however it wishes.
|
||||
CPU MEMORY BARRIERS
|
||||
-------------------
|
||||
|
||||
The Linux kernel has eight basic CPU memory barriers:
|
||||
The Linux kernel has seven basic CPU memory barriers:
|
||||
|
||||
TYPE MANDATORY SMP CONDITIONAL
|
||||
=============== ======================= ===========================
|
||||
GENERAL mb() smp_mb()
|
||||
WRITE wmb() smp_wmb()
|
||||
READ rmb() smp_rmb()
|
||||
DATA DEPENDENCY READ_ONCE()
|
||||
TYPE MANDATORY SMP CONDITIONAL
|
||||
======================= =============== ===============
|
||||
GENERAL mb() smp_mb()
|
||||
WRITE wmb() smp_wmb()
|
||||
READ rmb() smp_rmb()
|
||||
ADDRESS DEPENDENCY READ_ONCE()
|
||||
|
||||
|
||||
All memory barriers except the data dependency barriers imply a compiler
|
||||
barrier. Data dependencies do not impose any additional compiler ordering.
|
||||
All memory barriers except the address-dependency barriers imply a compiler
|
||||
barrier. Address dependencies do not impose any additional compiler ordering.
|
||||
|
||||
Aside: In the case of data dependencies, the compiler would be expected
|
||||
Aside: In the case of address dependencies, the compiler would be expected
|
||||
to issue the loads in the correct order (eg. `a[b]` would have to load
|
||||
the value of b before loading a[b]), however there is no guarantee in
|
||||
the C specification that the compiler may not speculate the value of b
|
||||
@ -2749,7 +2761,8 @@ is discarded from the CPU's cache and reloaded. To deal with this, the
|
||||
appropriate part of the kernel must invalidate the overlapping bits of the
|
||||
cache on each CPU.
|
||||
|
||||
See Documentation/core-api/cachetlb.rst for more information on cache management.
|
||||
See Documentation/core-api/cachetlb.rst for more information on cache
|
||||
management.
|
||||
|
||||
|
||||
CACHE COHERENCY VS MMIO
|
||||
@ -2889,8 +2902,8 @@ AND THEN THERE'S THE ALPHA
|
||||
The DEC Alpha CPU is one of the most relaxed CPUs there is. Not only that,
|
||||
some versions of the Alpha CPU have a split data cache, permitting them to have
|
||||
two semantically-related cache lines updated at separate times. This is where
|
||||
the data dependency barrier really becomes necessary as this synchronises both
|
||||
caches with the memory coherence system, thus making it seem like pointer
|
||||
the address-dependency barrier really becomes necessary as this synchronises
|
||||
both caches with the memory coherence system, thus making it seem like pointer
|
||||
changes vs new data occur in the right order.
|
||||
|
||||
The Alpha defines the Linux kernel's memory model, although as of v4.15
|
||||
|
@ -197,7 +197,7 @@ unevictable list for the memory cgroup and node being scanned.
|
||||
There may be situations where a page is mapped into a VM_LOCKED VMA, but the
|
||||
page is not marked as PG_mlocked. Such pages will make it all the way to
|
||||
shrink_active_list() or shrink_page_list() where they will be detected when
|
||||
vmscan walks the reverse map in page_referenced() or try_to_unmap(). The page
|
||||
vmscan walks the reverse map in folio_referenced() or try_to_unmap(). The page
|
||||
is culled to the unevictable list when it is released by the shrinker.
|
||||
|
||||
To "cull" an unevictable page, vmscan simply puts the page back on the LRU list
|
||||
@ -267,7 +267,7 @@ the LRU. Such pages can be "noticed" by memory management in several places:
|
||||
(4) in the fault path and when a VM_LOCKED stack segment is expanded; or
|
||||
|
||||
(5) as mentioned above, in vmscan:shrink_page_list() when attempting to
|
||||
reclaim a page in a VM_LOCKED VMA by page_referenced() or try_to_unmap().
|
||||
reclaim a page in a VM_LOCKED VMA by folio_referenced() or try_to_unmap().
|
||||
|
||||
mlocked pages become unlocked and rescued from the unevictable list when:
|
||||
|
||||
@ -547,7 +547,7 @@ vmscan's shrink_inactive_list() and shrink_page_list() also divert obviously
|
||||
unevictable pages found on the inactive lists to the appropriate memory cgroup
|
||||
and node unevictable list.
|
||||
|
||||
rmap's page_referenced_one(), called via vmscan's shrink_active_list() or
|
||||
rmap's folio_referenced_one(), called via vmscan's shrink_active_list() or
|
||||
shrink_page_list(), and rmap's try_to_unmap_one() called via shrink_page_list(),
|
||||
check for (3) pages still mapped into VM_LOCKED VMAs, and call mlock_vma_page()
|
||||
to correct them. Such pages are culled to the unevictable list when released
|
||||
|
@ -67,7 +67,7 @@ The ``netdevsim`` driver supports rate objects management, which includes:
|
||||
- setting tx_share and tx_max rate values for any rate object type;
|
||||
- setting parent node for any rate object type.
|
||||
|
||||
Rate nodes and it's parameters are exposed in ``netdevsim`` debugfs in RO mode.
|
||||
Rate nodes and their parameters are exposed in ``netdevsim`` debugfs in RO mode.
|
||||
For example created rate node with name ``some_group``:
|
||||
|
||||
.. code:: shell
|
||||
|
@ -8,7 +8,7 @@ Transmit path guidelines:
|
||||
|
||||
1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under
|
||||
any normal circumstances. It is considered a hard error unless
|
||||
there is no way your device can tell ahead of time when it's
|
||||
there is no way your device can tell ahead of time when its
|
||||
transmit function will become busy.
|
||||
|
||||
Instead it must maintain the queue properly. For example,
|
||||
|
@ -1035,7 +1035,10 @@ tcp_limit_output_bytes - INTEGER
|
||||
tcp_challenge_ack_limit - INTEGER
|
||||
Limits number of Challenge ACK sent per second, as recommended
|
||||
in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
|
||||
Default: 1000
|
||||
Note that this per netns rate limit can allow some side channel
|
||||
attacks and probably should not be enabled.
|
||||
TCP stack implements per TCP socket limits anyway.
|
||||
Default: INT_MAX (unlimited)
|
||||
|
||||
UDP variables
|
||||
=============
|
||||
|
@ -11,7 +11,7 @@ Initial Release:
|
||||
================
|
||||
This is conceptually very similar to the macvlan driver with one major
|
||||
exception of using L3 for mux-ing /demux-ing among slaves. This property makes
|
||||
the master device share the L2 with it's slave devices. I have developed this
|
||||
the master device share the L2 with its slave devices. I have developed this
|
||||
driver in conjunction with network namespaces and not sure if there is use case
|
||||
outside of it.
|
||||
|
||||
|
@ -530,7 +530,7 @@ its tunnel close actions. For L2TPIP sockets, the socket's close
|
||||
handler initiates the same tunnel close actions. All sessions are
|
||||
first closed. Each session drops its tunnel ref. When the tunnel ref
|
||||
reaches zero, the tunnel puts its socket ref. When the socket is
|
||||
eventually destroyed, it's sk_destruct finally frees the L2TP tunnel
|
||||
eventually destroyed, its sk_destruct finally frees the L2TP tunnel
|
||||
context.
|
||||
|
||||
Sessions
|
||||
|
@ -47,7 +47,6 @@ allow_join_initial_addr_port - BOOLEAN
|
||||
Default: 1
|
||||
|
||||
pm_type - INTEGER
|
||||
|
||||
Set the default path manager type to use for each new MPTCP
|
||||
socket. In-kernel path management will control subflow
|
||||
connections and address advertisements according to
|
||||
|
@ -70,15 +70,6 @@ nf_conntrack_generic_timeout - INTEGER (seconds)
|
||||
Default for generic timeout. This refers to layer 4 unknown/unsupported
|
||||
protocols.
|
||||
|
||||
nf_conntrack_helper - BOOLEAN
|
||||
- 0 - disabled (default)
|
||||
- not 0 - enabled
|
||||
|
||||
Enable automatic conntrack helper assignment.
|
||||
If disabled it is required to set up iptables rules to assign
|
||||
helpers to connections. See the CT target description in the
|
||||
iptables-extensions(8) man page for further information.
|
||||
|
||||
nf_conntrack_icmp_timeout - INTEGER (seconds)
|
||||
default 30
|
||||
|
||||
|
@ -1055,17 +1055,6 @@ The kernel interface functions are as follows:
|
||||
first function to change. Note that this must be called in TASK_RUNNING
|
||||
state.
|
||||
|
||||
(#) Get reply timestamp::
|
||||
|
||||
bool rxrpc_kernel_get_reply_time(struct socket *sock,
|
||||
struct rxrpc_call *call,
|
||||
ktime_t *_ts)
|
||||
|
||||
This allows the timestamp on the first DATA packet of the reply of a
|
||||
client call to be queried, provided that it is still in the Rx ring. If
|
||||
successful, the timestamp will be stored into ``*_ts`` and true will be
|
||||
returned; false will be returned otherwise.
|
||||
|
||||
(#) Get remote client epoch::
|
||||
|
||||
u32 rxrpc_kernel_get_epoch(struct socket *sock,
|
||||
|
@ -159,7 +159,7 @@ tools such as iproute2.
|
||||
|
||||
The switchdev driver can know a particular port's position in the topology by
|
||||
monitoring NETDEV_CHANGEUPPER notifications. For example, a port moved into a
|
||||
bond will see it's upper master change. If that bond is moved into a bridge,
|
||||
bond will see its upper master change. If that bond is moved into a bridge,
|
||||
the bond's upper master will change. And so on. The driver will track such
|
||||
movements to know what position a port is in in the overall topology by
|
||||
registering for netdevice events and acting on NETDEV_CHANGEUPPER.
|
||||
|
@ -256,8 +256,10 @@ The tags in common use are:
|
||||
- Cc: the named person received a copy of the patch and had the
|
||||
opportunity to comment on it.
|
||||
|
||||
Be careful in the addition of tags to your patches: only Cc: is appropriate
|
||||
for addition without the explicit permission of the person named.
|
||||
Be careful in the addition of tags to your patches, as only Cc: is appropriate
|
||||
for addition without the explicit permission of the person named; using
|
||||
Reported-by: is fine most of the time as well, but ask for permission if
|
||||
the bug was reported in private.
|
||||
|
||||
|
||||
Sending the patch
|
||||
|
@ -51,7 +51,7 @@ the Technical Advisory Board (TAB) or other maintainers if you're
|
||||
uncertain how to handle situations that come up. It will not be
|
||||
considered a violation report unless you want it to be. If you are
|
||||
uncertain about approaching the TAB or any other maintainers, please
|
||||
reach out to our conflict mediator, Mishi Choudhary <mishi@linux.com>.
|
||||
reach out to our conflict mediator, Joanna Lee <joanna.lee@gesmer.com>.
|
||||
|
||||
In the end, "be kind to each other" is really what the end goal is for
|
||||
everybody. We know everyone is human and we all fail at times, but the
|
||||
@ -127,10 +127,12 @@ are listed at https://kernel.org/code-of-conduct.html. Members can not
|
||||
access reports made before they joined or after they have left the
|
||||
committee.
|
||||
|
||||
The initial Code of Conduct Committee consists of volunteer members of
|
||||
the TAB, as well as a professional mediator acting as a neutral third
|
||||
party. The first task of the committee is to establish documented
|
||||
processes, which will be made public.
|
||||
The Code of Conduct Committee consists of volunteer community members
|
||||
appointed by the TAB, as well as a professional mediator acting as a
|
||||
neutral third party. The processes the Code of Conduct committee will
|
||||
use to address reports is varied and will depend on the individual
|
||||
circumstance, however, this file serves as documentation for the
|
||||
general process used.
|
||||
|
||||
Any member of the committee, including the mediator, can be contacted
|
||||
directly if a reporter does not wish to include the full committee in a
|
||||
@ -141,16 +143,16 @@ processes (see above) and consults with the TAB as needed and
|
||||
appropriate, for instance to request and receive information about the
|
||||
kernel community.
|
||||
|
||||
Any decisions by the committee will be brought to the TAB, for
|
||||
implementation of enforcement with the relevant maintainers if needed.
|
||||
A decision by the Code of Conduct Committee can be overturned by the TAB
|
||||
by a two-thirds vote.
|
||||
Any decisions regarding enforcement recommendations will be brought to
|
||||
the TAB for implementation of enforcement with the relevant maintainers
|
||||
if needed. A decision by the Code of Conduct Committee can be overturned
|
||||
by the TAB by a two-thirds vote.
|
||||
|
||||
At quarterly intervals, the Code of Conduct Committee and TAB will
|
||||
provide a report summarizing the anonymised reports that the Code of
|
||||
Conduct committee has received and their status, as well details of any
|
||||
overridden decisions including complete and identifiable voting details.
|
||||
|
||||
We expect to establish a different process for Code of Conduct Committee
|
||||
staffing beyond the bootstrap period. This document will be updated
|
||||
with that information when this occurs.
|
||||
Because how we interpret and enforce the Code of Conduct will evolve over
|
||||
time, this document will be updated when necessary to reflect any
|
||||
changes.
|
||||
|
@ -1186,6 +1186,68 @@ expression used. For instance:
|
||||
#endif /* CONFIG_SOMETHING */
|
||||
|
||||
|
||||
22) Do not crash the kernel
|
||||
---------------------------
|
||||
|
||||
In general, the decision to crash the kernel belongs to the user, rather
|
||||
than to the kernel developer.
|
||||
|
||||
Avoid panic()
|
||||
*************
|
||||
|
||||
panic() should be used with care and primarily only during system boot.
|
||||
panic() is, for example, acceptable when running out of memory during boot and
|
||||
not being able to continue.
|
||||
|
||||
Use WARN() rather than BUG()
|
||||
****************************
|
||||
|
||||
Do not add new code that uses any of the BUG() variants, such as BUG(),
|
||||
BUG_ON(), or VM_BUG_ON(). Instead, use a WARN*() variant, preferably
|
||||
WARN_ON_ONCE(), and possibly with recovery code. Recovery code is not
|
||||
required if there is no reasonable way to at least partially recover.
|
||||
|
||||
"I'm too lazy to do error handling" is not an excuse for using BUG(). Major
|
||||
internal corruptions with no way of continuing may still use BUG(), but need
|
||||
good justification.
|
||||
|
||||
Use WARN_ON_ONCE() rather than WARN() or WARN_ON()
|
||||
**************************************************
|
||||
|
||||
WARN_ON_ONCE() is generally preferred over WARN() or WARN_ON(), because it
|
||||
is common for a given warning condition, if it occurs at all, to occur
|
||||
multiple times. This can fill up and wrap the kernel log, and can even slow
|
||||
the system enough that the excessive logging turns into its own, additional
|
||||
problem.
|
||||
|
||||
Do not WARN lightly
|
||||
*******************
|
||||
|
||||
WARN*() is intended for unexpected, this-should-never-happen situations.
|
||||
WARN*() macros are not to be used for anything that is expected to happen
|
||||
during normal operation. These are not pre- or post-condition asserts, for
|
||||
example. Again: WARN*() must not be used for a condition that is expected
|
||||
to trigger easily, for example, by user space actions. pr_warn_once() is a
|
||||
possible alternative, if you need to notify the user of a problem.
|
||||
|
||||
Do not worry about panic_on_warn users
|
||||
**************************************
|
||||
|
||||
A few more words about panic_on_warn: Remember that ``panic_on_warn`` is an
|
||||
available kernel option, and that many users set this option. This is why
|
||||
there is a "Do not WARN lightly" writeup, above. However, the existence of
|
||||
panic_on_warn users is not a valid reason to avoid the judicious use
|
||||
WARN*(). That is because, whoever enables panic_on_warn has explicitly
|
||||
asked the kernel to crash if a WARN*() fires, and such users must be
|
||||
prepared to deal with the consequences of a system that is somewhat more
|
||||
likely to crash.
|
||||
|
||||
Use BUILD_BUG_ON() for compile-time assertions
|
||||
**********************************************
|
||||
|
||||
The use of BUILD_BUG_ON() is acceptable and encouraged, because it is a
|
||||
compile-time assertion that has no effect at runtime.
|
||||
|
||||
Appendix I) References
|
||||
----------------------
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
.. _process_index:
|
||||
|
||||
=============================================
|
||||
Working with the kernel development community
|
||||
=============================================
|
||||
|
||||
|
@ -121,57 +121,56 @@ edit your ``~/.gnupg/gpg-agent.conf`` file to set your own values::
|
||||
to remove anything you had in place for older versions of GnuPG, as
|
||||
it may not be doing the right thing any more.
|
||||
|
||||
Set up a refresh cronjob
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.. _protect_your_key:
|
||||
|
||||
You will need to regularly refresh your keyring in order to get the
|
||||
latest changes on other people's public keys, which is best done with a
|
||||
daily cronjob::
|
||||
|
||||
@daily /usr/bin/gpg2 --refresh >/dev/null 2>&1
|
||||
|
||||
Check the full path to your ``gpg`` or ``gpg2`` command and use the
|
||||
``gpg2`` command if regular ``gpg`` for you is the legacy GnuPG v.1.
|
||||
|
||||
.. _master_key:
|
||||
|
||||
Protect your master PGP key
|
||||
===========================
|
||||
Protect your PGP key
|
||||
====================
|
||||
|
||||
This guide assumes that you already have a PGP key that you use for Linux
|
||||
kernel development purposes. If you do not yet have one, please see the
|
||||
"`Protecting Code Integrity`_" document mentioned earlier for guidance
|
||||
on how to create a new one.
|
||||
|
||||
You should also make a new key if your current one is weaker than 2048 bits
|
||||
(RSA).
|
||||
You should also make a new key if your current one is weaker than 2048
|
||||
bits (RSA).
|
||||
|
||||
Master key vs. Subkeys
|
||||
----------------------
|
||||
Understanding PGP Subkeys
|
||||
-------------------------
|
||||
|
||||
Subkeys are fully independent PGP keypairs that are tied to the "master"
|
||||
key using certifying key signatures (certificates). It is important to
|
||||
understand the following:
|
||||
A PGP key rarely consists of a single keypair -- usually it is a
|
||||
collection of independent subkeys that can be used for different
|
||||
purposes based on their capabilities, assigned at their creation time.
|
||||
PGP defines four capabilities that a key can have:
|
||||
|
||||
1. There are no technical differences between the "master key" and "subkeys."
|
||||
2. At creation time, we assign functional limitations to each key by
|
||||
giving it specific capabilities.
|
||||
3. A PGP key can have 4 capabilities:
|
||||
- **[S]** keys can be used for signing
|
||||
- **[E]** keys can be used for encryption
|
||||
- **[A]** keys can be used for authentication
|
||||
- **[C]** keys can be used for certifying other keys
|
||||
|
||||
- **[S]** key can be used for signing
|
||||
- **[E]** key can be used for encryption
|
||||
- **[A]** key can be used for authentication
|
||||
- **[C]** key can be used for certifying other keys
|
||||
The key with the **[C]** capability is often called the "master" key,
|
||||
but this terminology is misleading because it implies that the Certify
|
||||
key can be used in place of any of other subkey on the same chain (like
|
||||
a physical "master key" can be used to open the locks made for other
|
||||
keys). Since this is not the case, this guide will refer to it as "the
|
||||
Certify key" to avoid any ambiguity.
|
||||
|
||||
4. A single key may have multiple capabilities.
|
||||
5. A subkey is fully independent from the master key. A message
|
||||
encrypted to a subkey cannot be decrypted with the master key. If you
|
||||
lose your private subkey, it cannot be recreated from the master key
|
||||
in any way.
|
||||
It is critical to fully understand the following:
|
||||
|
||||
The key carrying the **[C]** (certify) capability is considered the
|
||||
"master" key because it is the only key that can be used to indicate
|
||||
relationship with other keys. Only the **[C]** key can be used to:
|
||||
1. All subkeys are fully independent from each other. If you lose a
|
||||
private subkey, it cannot be restored or recreated from any other
|
||||
private key on your chain.
|
||||
2. With the exception of the Certify key, there can be multiple subkeys
|
||||
with identical capabilities (e.g. you can have 2 valid encryption
|
||||
subkeys, 3 valid signing subkeys, but only one valid certification
|
||||
subkey). All subkeys are fully independent -- a message encrypted to
|
||||
one **[E]** subkey cannot be decrypted with any other **[E]** subkey
|
||||
you may also have.
|
||||
3. A single subkey may have multiple capabilities (e.g. your **[C]** key
|
||||
can also be your **[S]** key).
|
||||
|
||||
The key carrying the **[C]** (certify) capability is the only key that
|
||||
can be used to indicate relationship with other keys. Only the **[C]**
|
||||
key can be used to:
|
||||
|
||||
- add or revoke other keys (subkeys) with S/E/A capabilities
|
||||
- add, change or revoke identities (uids) associated with the key
|
||||
@ -180,7 +179,7 @@ relationship with other keys. Only the **[C]** key can be used to:
|
||||
|
||||
By default, GnuPG creates the following when generating new keys:
|
||||
|
||||
- A master key carrying both Certify and Sign capabilities (**[SC]**)
|
||||
- One subkey carrying both Certify and Sign capabilities (**[SC]**)
|
||||
- A separate subkey with the Encryption capability (**[E]**)
|
||||
|
||||
If you used the default parameters when generating your key, then that
|
||||
@ -192,9 +191,6 @@ for example::
|
||||
uid [ultimate] Alice Dev <adev@kernel.org>
|
||||
ssb rsa2048 2018-01-23 [E] [expires: 2020-01-23]
|
||||
|
||||
Any key carrying the **[C]** capability is your master key, regardless
|
||||
of any other capabilities it may have assigned to it.
|
||||
|
||||
The long line under the ``sec`` entry is your key fingerprint --
|
||||
whenever you see ``[fpr]`` in the examples below, that 40-character
|
||||
string is what it refers to.
|
||||
@ -215,37 +211,30 @@ strong passphrase. To set it or change it, use::
|
||||
Create a separate Signing subkey
|
||||
--------------------------------
|
||||
|
||||
Our goal is to protect your master key by moving it to offline media, so
|
||||
if you only have a combined **[SC]** key, then you should create a separate
|
||||
signing subkey::
|
||||
Our goal is to protect your Certify key by moving it to offline media,
|
||||
so if you only have a combined **[SC]** key, then you should create a
|
||||
separate signing subkey::
|
||||
|
||||
$ gpg --quick-addkey [fpr] ed25519 sign
|
||||
|
||||
Remember to tell the keyservers about this change, so others can pull down
|
||||
your new subkey::
|
||||
|
||||
$ gpg --send-key [fpr]
|
||||
|
||||
.. note:: ECC support in GnuPG
|
||||
|
||||
GnuPG 2.1 and later has full support for Elliptic Curve
|
||||
Cryptography, with ability to combine ECC subkeys with traditional
|
||||
RSA master keys. The main upside of ECC cryptography is that it is
|
||||
much faster computationally and creates much smaller signatures when
|
||||
RSA keys. The main upside of ECC cryptography is that it is much
|
||||
faster computationally and creates much smaller signatures when
|
||||
compared byte for byte with 2048+ bit RSA keys. Unless you plan on
|
||||
using a smartcard device that does not support ECC operations, we
|
||||
recommend that you create an ECC signing subkey for your kernel
|
||||
work.
|
||||
|
||||
If for some reason you prefer to stay with RSA subkeys, just replace
|
||||
"ed25519" with "rsa2048" in the above command. Additionally, if you
|
||||
plan to use a hardware device that does not support ED25519 ECC
|
||||
keys, like Nitrokey Pro or a Yubikey, then you should use
|
||||
"nistp256" instead or "ed25519."
|
||||
Note, that if you plan to use a hardware device that does not
|
||||
support ED25519 ECC keys, you should choose "nistp256" instead or
|
||||
"ed25519."
|
||||
|
||||
|
||||
Back up your master key for disaster recovery
|
||||
---------------------------------------------
|
||||
Back up your Certify key for disaster recovery
|
||||
----------------------------------------------
|
||||
|
||||
The more signatures you have on your PGP key from other developers, the
|
||||
more reasons you have to create a backup version that lives on something
|
||||
@ -277,9 +266,7 @@ home, such as your bank vault.
|
||||
Your printer is probably no longer a simple dumb device connected to
|
||||
your parallel port, but since the output is still encrypted with
|
||||
your passphrase, printing out even to "cloud-integrated" modern
|
||||
printers should remain a relatively safe operation. One option is to
|
||||
change the passphrase on your master key immediately after you are
|
||||
done with paperkey.
|
||||
printers should remain a relatively safe operation.
|
||||
|
||||
Back up your whole GnuPG directory
|
||||
----------------------------------
|
||||
@ -300,7 +287,7 @@ will use for backup purposes. You will need to encrypt them using LUKS
|
||||
-- refer to your distro's documentation on how to accomplish this.
|
||||
|
||||
For the encryption passphrase, you can use the same one as on your
|
||||
master key.
|
||||
PGP key.
|
||||
|
||||
Once the encryption process is over, re-insert the USB drive and make
|
||||
sure it gets properly mounted. Copy your entire ``.gnupg`` directory
|
||||
@ -319,7 +306,7 @@ far away, because you'll need to use it every now and again for things
|
||||
like editing identities, adding or revoking subkeys, or signing other
|
||||
people's keys.
|
||||
|
||||
Remove the master key from your homedir
|
||||
Remove the Certify key from your homedir
|
||||
----------------------------------------
|
||||
|
||||
The files in our home directory are not as well protected as we like to
|
||||
@ -334,7 +321,7 @@ think. They can be leaked or stolen via many different means:
|
||||
Protecting your key with a good passphrase greatly helps reduce the risk
|
||||
of any of the above, but passphrases can be discovered via keyloggers,
|
||||
shoulder-surfing, or any number of other means. For this reason, the
|
||||
recommended setup is to remove your master key from your home directory
|
||||
recommended setup is to remove your Certify key from your home directory
|
||||
and store it on offline storage.
|
||||
|
||||
.. warning::
|
||||
@ -343,7 +330,7 @@ and store it on offline storage.
|
||||
your GnuPG directory in its entirety. What we are about to do will
|
||||
render your key useless if you do not have a usable backup!
|
||||
|
||||
First, identify the keygrip of your master key::
|
||||
First, identify the keygrip of your Certify key::
|
||||
|
||||
$ gpg --with-keygrip --list-key [fpr]
|
||||
|
||||
@ -359,7 +346,7 @@ The output will be something like this::
|
||||
Keygrip = 3333000000000000000000000000000000000000
|
||||
|
||||
Find the keygrip entry that is beneath the ``pub`` line (right under the
|
||||
master key fingerprint). This will correspond directly to a file in your
|
||||
Certify key fingerprint). This will correspond directly to a file in your
|
||||
``~/.gnupg`` directory::
|
||||
|
||||
$ cd ~/.gnupg/private-keys-v1.d
|
||||
@ -369,13 +356,13 @@ master key fingerprint). This will correspond directly to a file in your
|
||||
3333000000000000000000000000000000000000.key
|
||||
|
||||
All you have to do is simply remove the .key file that corresponds to
|
||||
the master keygrip::
|
||||
the Certify key keygrip::
|
||||
|
||||
$ cd ~/.gnupg/private-keys-v1.d
|
||||
$ rm 1111000000000000000000000000000000000000.key
|
||||
|
||||
Now, if you issue the ``--list-secret-keys`` command, it will show that
|
||||
the master key is missing (the ``#`` indicates it is not available)::
|
||||
the Certify key is missing (the ``#`` indicates it is not available)::
|
||||
|
||||
$ gpg --list-secret-keys
|
||||
sec# rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
|
||||
@ -404,7 +391,7 @@ file, which still contains your private keys.
|
||||
Move the subkeys to a dedicated crypto device
|
||||
=============================================
|
||||
|
||||
Even though the master key is now safe from being leaked or stolen, the
|
||||
Even though the Certify key is now safe from being leaked or stolen, the
|
||||
subkeys are still in your home directory. Anyone who manages to get
|
||||
their hands on those will be able to decrypt your communication or fake
|
||||
your signatures (if they know the passphrase). Furthermore, each time a
|
||||
@ -447,7 +434,8 @@ functionality. There are several options available:
|
||||
- `Yubikey 5`_: proprietary hardware and software, but cheaper than
|
||||
Nitrokey Pro and comes available in the USB-C form that is more useful
|
||||
with newer laptops. Offers additional security features such as FIDO
|
||||
U2F, among others, and now finally supports ECC keys (NISTP).
|
||||
U2F, among others, and now finally supports NISTP and ED25519 ECC
|
||||
keys.
|
||||
|
||||
`LWN has a good review`_ of some of the above models, as well as several
|
||||
others. Your choice will depend on cost, shipping availability in your
|
||||
@ -460,7 +448,7 @@ geographical region, and open/proprietary hardware considerations.
|
||||
Foundation.
|
||||
|
||||
.. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
|
||||
.. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nitrokey-pro-2-3
|
||||
.. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nkpr2-nitrokey-pro-2-3
|
||||
.. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/
|
||||
.. _Gnuk: https://www.fsij.org/doc-gnuk/
|
||||
.. _`LWN has a good review`: https://lwn.net/Articles/736231/
|
||||
@ -627,10 +615,10 @@ Other common GnuPG operations
|
||||
Here is a quick reference for some common operations you'll need to do
|
||||
with your PGP key.
|
||||
|
||||
Mounting your master key offline storage
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Mounting your safe offline storage
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You will need your master key for any of the operations below, so you
|
||||
You will need your Certify key for any of the operations below, so you
|
||||
will first need to mount your backup offline storage and tell GnuPG to
|
||||
use it::
|
||||
|
||||
@ -644,7 +632,7 @@ your regular home directory location).
|
||||
Extending key expiration date
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The master key has the default expiration date of 2 years from the date
|
||||
The Certify key has the default expiration date of 2 years from the date
|
||||
of creation. This is done both for security reasons and to make obsolete
|
||||
keys eventually disappear from keyservers.
|
||||
|
||||
@ -685,6 +673,7 @@ remote end.
|
||||
|
||||
.. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding
|
||||
|
||||
.. _pgp_with_git:
|
||||
|
||||
Using PGP with Git
|
||||
==================
|
||||
@ -828,6 +817,63 @@ You can tell git to always sign commits::
|
||||
|
||||
.. _verify_identities:
|
||||
|
||||
|
||||
How to work with signed patches
|
||||
-------------------------------
|
||||
|
||||
It is possible to use your PGP key to sign patches sent to kernel
|
||||
developer mailing lists. Since existing email signature mechanisms
|
||||
(PGP-Mime or PGP-inline) tend to cause problems with regular code
|
||||
review tasks, you should use the tool kernel.org created for this
|
||||
purpose that puts cryptographic attestation signatures into message
|
||||
headers (a-la DKIM):
|
||||
|
||||
- `Patatt Patch Attestation`_
|
||||
|
||||
.. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/
|
||||
|
||||
Installing and configuring patatt
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Patatt is packaged for many distributions already, so please check there
|
||||
first. You can also install it from pypi using "``pip install patatt``".
|
||||
|
||||
If you already have your PGP key configured with git (via the
|
||||
``user.signingKey`` configuration parameter), then patatt requires no
|
||||
further configuration. You can start signing your patches by installing
|
||||
the git-send-email hook in the repository you want::
|
||||
|
||||
patatt install-hook
|
||||
|
||||
Now any patches you send with ``git send-email`` will be automatically
|
||||
signed with your cryptographic signature.
|
||||
|
||||
Checking patatt signatures
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you are using ``b4`` to retrieve and apply patches, then it will
|
||||
automatically attempt to verify all DKIM and patatt signatures it
|
||||
encounters, for example::
|
||||
|
||||
$ b4 am 20220720205013.890942-1-broonie@kernel.org
|
||||
[...]
|
||||
Checking attestation on all messages, may take a moment...
|
||||
---
|
||||
✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers
|
||||
✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall
|
||||
✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls
|
||||
---
|
||||
✓ Signed: openpgp/broonie@kernel.org
|
||||
✓ Signed: DKIM/kernel.org
|
||||
|
||||
.. note::
|
||||
|
||||
Patatt and b4 are still in active development and you should check
|
||||
the latest documentation for these projects for any new or updated
|
||||
features.
|
||||
|
||||
.. _kernel_identities:
|
||||
|
||||
How to verify kernel developer identities
|
||||
=========================================
|
||||
|
||||
@ -899,65 +945,17 @@ the new default in GnuPG v2). To set it, add (or modify) the
|
||||
|
||||
trust-model tofu+pgp
|
||||
|
||||
How to use keyservers (more) safely
|
||||
-----------------------------------
|
||||
Using the kernel.org web of trust repository
|
||||
--------------------------------------------
|
||||
|
||||
If you get a "No public key" error when trying to validate someone's
|
||||
tag, then you should attempt to lookup that key using a keyserver. It is
|
||||
important to keep in mind that there is absolutely no guarantee that the
|
||||
key you retrieve from PGP keyservers belongs to the actual person --
|
||||
that much is by design. You are supposed to use the Web of Trust to
|
||||
establish key validity.
|
||||
Kernel.org maintains a git repository with developers' public keys as a
|
||||
replacement for replicating keyserver networks that have gone mostly
|
||||
dark in the past few years. The full documentation for how to set up
|
||||
that repository as your source of public keys can be found here:
|
||||
|
||||
How to properly maintain the Web of Trust is beyond the scope of this
|
||||
document, simply because doing it properly requires both effort and
|
||||
dedication that tends to be beyond the caring threshold of most human
|
||||
beings. Here are some shortcuts that will help you reduce the risk of
|
||||
importing a malicious key.
|
||||
- `Kernel developer PGP Keyring`_
|
||||
|
||||
First, let's say you've tried to run ``git verify-tag`` but it returned
|
||||
an error saying the key is not found::
|
||||
If you are a kernel developer, please consider submitting your key for
|
||||
inclusion into that keyring.
|
||||
|
||||
$ git verify-tag sunxi-fixes-for-4.15-2
|
||||
gpg: Signature made Sun 07 Jan 2018 10:51:55 PM EST
|
||||
gpg: using RSA key DA73759BF8619E484E5A3B47389A54219C0F2430
|
||||
gpg: issuer "wens@...org"
|
||||
gpg: Can't check signature: No public key
|
||||
|
||||
Let's query the keyserver for more info about that key fingerprint (the
|
||||
fingerprint probably belongs to a subkey, so we can't use it directly
|
||||
without finding out the ID of the master key it is associated with)::
|
||||
|
||||
$ gpg --search DA73759BF8619E484E5A3B47389A54219C0F2430
|
||||
gpg: data source: hkp://keys.gnupg.net
|
||||
(1) Chen-Yu Tsai <wens@...org>
|
||||
4096 bit RSA key C94035C21B4F2AEB, created: 2017-03-14, expires: 2019-03-15
|
||||
Keys 1-1 of 1 for "DA73759BF8619E484E5A3B47389A54219C0F2430". Enter number(s), N)ext, or Q)uit > q
|
||||
|
||||
Locate the ID of the master key in the output, in our example
|
||||
``C94035C21B4F2AEB``. Now display the key of Linus Torvalds that you
|
||||
have on your keyring::
|
||||
|
||||
$ gpg --list-key torvalds@kernel.org
|
||||
pub rsa2048 2011-09-20 [SC]
|
||||
ABAF11C65A2970B130ABE3C479BE3E4300411886
|
||||
uid [ unknown] Linus Torvalds <torvalds@kernel.org>
|
||||
sub rsa2048 2011-09-20 [E]
|
||||
|
||||
Next, find a trust path from Linus Torvalds to the key-id you found via ``gpg
|
||||
--search`` of the unknown key. For this, you can use several tools including
|
||||
https://github.com/mricon/wotmate,
|
||||
https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/tree/graphs, and
|
||||
https://the.earth.li/~noodles/pathfind.html.
|
||||
|
||||
If you get a few decent trust paths, then it's a pretty good indication
|
||||
that it is a valid key. You can add it to your keyring from the
|
||||
keyserver now::
|
||||
|
||||
$ gpg --recv-key C94035C21B4F2AEB
|
||||
|
||||
This process is not perfect, and you are obviously trusting the
|
||||
administrators of the PGP Pathfinder service to not be malicious (in
|
||||
fact, this goes against :ref:`devs_not_infra`). However, if you
|
||||
do not carefully maintain your own web of trust, then it is a marked
|
||||
improvement over blindly trusting keyservers.
|
||||
.. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html
|
||||
|
@ -97,6 +97,12 @@ text, like this:
|
||||
|
||||
commit <sha1> upstream.
|
||||
|
||||
or alternatively:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
[ Upstream commit <sha1> ]
|
||||
|
||||
Additionally, some patches submitted via :ref:`option_1` may have additional
|
||||
patch prerequisites which can be cherry-picked. This can be specified in the
|
||||
following format in the sign-off area:
|
||||
|
@ -715,8 +715,8 @@ references.
|
||||
|
||||
.. _backtraces:
|
||||
|
||||
Backtraces in commit mesages
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Backtraces in commit messages
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Backtraces help document the call chain leading to a problem. However,
|
||||
not all backtraces are helpful. For example, early boot call chains are
|
||||
|
@ -94,7 +94,7 @@ other HZ detail. Thus the CFS scheduler has no notion of "timeslices" in the
|
||||
way the previous scheduler had, and has no heuristics whatsoever. There is
|
||||
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
||||
|
||||
/proc/sys/kernel/sched_min_granularity_ns
|
||||
/sys/kernel/debug/sched/min_granularity_ns
|
||||
|
||||
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
||||
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
||||
|
@ -70,8 +70,16 @@
|
||||
|
||||
% Translations have Asian (CJK) characters which are only displayed if
|
||||
% xeCJK is used
|
||||
\usepackage{ifthen}
|
||||
\newboolean{enablecjk}
|
||||
\setboolean{enablecjk}{false}
|
||||
\IfFontExistsTF{Noto Sans CJK SC}{
|
||||
% Load xeCJK when CJK font is available
|
||||
\IfFileExists{xeCJK.sty}{
|
||||
\setboolean{enablecjk}{true}
|
||||
}{}
|
||||
}{}
|
||||
\ifthenelse{\boolean{enablecjk}}{
|
||||
% Load xeCJK when both the Noto Sans CJK font and xeCJK.sty are available.
|
||||
\usepackage{xeCJK}
|
||||
% Noto CJK fonts don't provide slant shape. [AutoFakeSlant] permits
|
||||
% its emulation.
|
||||
@ -196,7 +204,7 @@
|
||||
% Inactivate CJK after tableofcontents
|
||||
\apptocmd{\sphinxtableofcontents}{\kerneldocCJKoff}{}{}
|
||||
\xeCJKsetup{CJKspace = true}% For inter-phrase space of Korean TOC
|
||||
}{ % No CJK font found
|
||||
}{ % Don't enable CJK
|
||||
% Custom macros to on/off CJK and switch CJK fonts (Dummy)
|
||||
\newcommand{\kerneldocCJKon}{}
|
||||
\newcommand{\kerneldocCJKoff}{}
|
||||
@ -204,14 +212,16 @@
|
||||
%% and ignore the argument (#1) in their definitions, whole contents of
|
||||
%% CJK chapters can be ignored.
|
||||
\newcommand{\kerneldocBeginSC}[1]{%
|
||||
%% Put a note on missing CJK fonts in place of zh_CN translation.
|
||||
\begin{sphinxadmonition}{note}{Note on missing fonts:}
|
||||
%% Put a note on missing CJK fonts or the xecjk package in place of
|
||||
%% zh_CN translation.
|
||||
\begin{sphinxadmonition}{note}{Note on missing fonts and a package:}
|
||||
Translations of Simplified Chinese (zh\_CN), Traditional Chinese
|
||||
(zh\_TW), Korean (ko\_KR), and Japanese (ja\_JP) were skipped
|
||||
due to the lack of suitable font families.
|
||||
due to the lack of suitable font families and/or the texlive-xecjk
|
||||
package.
|
||||
|
||||
If you want them, please install ``Noto Sans CJK'' font families
|
||||
by following instructions from
|
||||
along with the texlive-xecjk package by following instructions from
|
||||
\sphinxcode{./scripts/sphinx-pre-install}.
|
||||
Having optional ``Noto Serif CJK'' font families will improve
|
||||
the looks of those translations.
|
||||
|
@ -14,45 +14,3 @@ Unsorted Documentation
|
||||
static-keys
|
||||
tee
|
||||
xz
|
||||
|
||||
Atomic Types
|
||||
============
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../atomic_t.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
||||
Atomic bitops
|
||||
=============
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../atomic_bitops.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
||||
Memory Barriers
|
||||
===============
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\footnotesize
|
||||
|
||||
.. include:: ../memory-barriers.txt
|
||||
:literal:
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\normalsize
|
||||
|
58
Documentation/subsystem-apis.rst
Normal file
58
Documentation/subsystem-apis.rst
Normal file
@ -0,0 +1,58 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
==============================
|
||||
Kernel subsystem documentation
|
||||
==============================
|
||||
|
||||
These books get into the details of how specific kernel subsystems work
|
||||
from the point of view of a kernel developer. Much of the information here
|
||||
is taken directly from the kernel source, with supplemental material added
|
||||
as needed (or at least as we managed to add it — probably *not* all that is
|
||||
needed).
|
||||
|
||||
**Fixme**: much more organizational work is needed here.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
driver-api/index
|
||||
core-api/index
|
||||
locking/index
|
||||
accounting/index
|
||||
block/index
|
||||
cdrom/index
|
||||
cpu-freq/index
|
||||
fb/index
|
||||
fpga/index
|
||||
hid/index
|
||||
i2c/index
|
||||
iio/index
|
||||
isdn/index
|
||||
infiniband/index
|
||||
leds/index
|
||||
netlabel/index
|
||||
networking/index
|
||||
pcmcia/index
|
||||
power/index
|
||||
target/index
|
||||
timers/index
|
||||
spi/index
|
||||
w1/index
|
||||
watchdog/index
|
||||
virt/index
|
||||
input/index
|
||||
hwmon/index
|
||||
gpu/index
|
||||
security/index
|
||||
sound/index
|
||||
crypto/index
|
||||
filesystems/index
|
||||
mm/index
|
||||
bpf/index
|
||||
usb/index
|
||||
PCI/index
|
||||
scsi/index
|
||||
misc-devices/index
|
||||
scheduler/index
|
||||
mhi/index
|
||||
peci/index
|
@ -412,7 +412,7 @@ Extended error information
|
||||
Because the default sort key above is 'hitcount', the above shows a
|
||||
the list of call_sites by increasing hitcount, so that at the bottom
|
||||
we see the functions that made the most kmalloc calls during the
|
||||
run. If instead we we wanted to see the top kmalloc callers in
|
||||
run. If instead we wanted to see the top kmalloc callers in
|
||||
terms of the number of bytes requested rather than the number of
|
||||
calls, and we wanted the top caller to appear at the top, we can use
|
||||
the 'sort' parameter, along with the 'descending' modifier::
|
||||
|
@ -328,8 +328,8 @@ Configuring Kprobes
|
||||
===================
|
||||
|
||||
When configuring the kernel using make menuconfig/xconfig/oldconfig,
|
||||
ensure that CONFIG_KPROBES is set to "y". Under "General setup", look
|
||||
for "Kprobes".
|
||||
ensure that CONFIG_KPROBES is set to "y", look for "Kprobes" under
|
||||
"General architecture-dependent options".
|
||||
|
||||
So that you can load and unload Kprobes-based instrumentation modules,
|
||||
make sure "Loadable module support" (CONFIG_MODULES) and "Module
|
||||
|
@ -20,7 +20,7 @@ For example::
|
||||
[root@f32 ~]# cd /sys/kernel/tracing/
|
||||
[root@f32 tracing]# echo timerlat > current_tracer
|
||||
|
||||
It is possible to follow the trace by reading the trace trace file::
|
||||
It is possible to follow the trace by reading the trace file::
|
||||
|
||||
[root@f32 tracing]# cat trace
|
||||
# tracer: timerlat
|
||||
|
@ -35,8 +35,7 @@ Linux カーネルに変更を加えたいと思っている個人又は会社
|
||||
てもらえやすくする提案を集めたものです。
|
||||
|
||||
コードを投稿する前に、Documentation/process/submit-checklist.rst の項目リストに目
|
||||
を通してチェックしてください。もしあなたがドライバーを投稿しようとし
|
||||
ているなら、Documentation/process/submitting-drivers.rst にも目を通してください。
|
||||
を通してチェックしてください。
|
||||
|
||||
--------------------------------------------
|
||||
セクション1 パッチの作り方と送り方
|
||||
|
@ -1,39 +0,0 @@
|
||||
Chinese translated version of Documentation/core-api/irq/index.rst
|
||||
|
||||
If you have any comment or update to the content, please contact the
|
||||
original document maintainer directly. However, if you have a problem
|
||||
communicating in English you can also ask the Chinese maintainer for
|
||||
help. Contact the Chinese maintainer if this translation is outdated
|
||||
or if there is a problem with the translation.
|
||||
|
||||
Maintainer: Eric W. Biederman <ebiederman@xmission.com>
|
||||
Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
|
||||
---------------------------------------------------------------------
|
||||
Documentation/core-api/irq/index.rst 的中文翻译
|
||||
|
||||
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
||||
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
||||
译存在问题,请联系中文版维护者。
|
||||
英文版维护者: Eric W. Biederman <ebiederman@xmission.com>
|
||||
中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
|
||||
|
||||
以下为正文
|
||||
---------------------------------------------------------------------
|
||||
何为 IRQ?
|
||||
|
||||
一个 IRQ 是来自某个设备的一个中断请求。目前,它们可以来自一个硬件引脚,
|
||||
或来自一个数据包。多个设备可能连接到同个硬件引脚,从而共享一个 IRQ。
|
||||
|
||||
一个 IRQ 编号是用于告知硬件中断源的内核标识。通常情况下,这是一个
|
||||
全局 irq_desc 数组的索引,但是除了在 linux/interrupt.h 中的实现,
|
||||
具体的细节是体系结构特定的。
|
||||
|
||||
一个 IRQ 编号是设备上某个可能的中断源的枚举。通常情况下,枚举的编号是
|
||||
该引脚在系统内中断控制器的所有输入引脚中的编号。对于 ISA 总线中的情况,
|
||||
枚举的是在两个 i8259 中断控制器中 16 个输入引脚。
|
||||
|
||||
架构可以对 IRQ 编号指定额外的含义,在硬件涉及任何手工配置的情况下,
|
||||
是被提倡的。ISA 的 IRQ 是一个分配这类额外含义的典型例子。
|
139
Documentation/translations/zh_CN/PCI/acpi-info.rst
Normal file
139
Documentation/translations/zh_CN/PCI/acpi-info.rst
Normal file
@ -0,0 +1,139 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/PCI/acpi-info.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
|
||||
=====================
|
||||
PCI主桥的ACPI注意事项
|
||||
=====================
|
||||
|
||||
一般的规则是,ACPI命名空间应该描述操作系统可能使用的所有东西,除非有其他方法让操作系
|
||||
统找到它[1, 2]。
|
||||
|
||||
例如,没有标准的硬件机制来枚举PCI主桥,所以ACPI命名空间必须描述每个主桥、访问它
|
||||
下面的PCI配置空间的方法、主桥转发到PCI的地址空间窗口(使用_CRS)以及传统的INTx
|
||||
中断的路由(使用_PRT)。
|
||||
|
||||
在主桥下面的PCI设备,通常不需要通过ACPI描述。操作系统可以通过标准的PCI枚举机制来
|
||||
发现它们,使用配置访问来发现和识别设备,并读取和测量它们的BAR。然而,如果ACPI为它们
|
||||
提供电源管理或热插拔功能,或者如果设备有由平台中断控制器连接的INTx中断,需要一个_PRT
|
||||
来描述这些连接,这种情况下ACPI可以描述PCI设备。
|
||||
|
||||
ACPI资源描述是通过ACPI命名空间中设备的_CRS对象完成的[2]。_CRS就像一个通用的PCI BAR:
|
||||
操作系统可以读取_CRS并找出正在消耗的资源,即使它没有该设备的驱动程序[3]。这一点很重要,
|
||||
因为它意味着一个旧的操作系统可以正确地工作,即使是在操作系统不知道的新设备的系统上。新设
|
||||
备可能什么都不做,但操作系统至少可以确保没有资源与它们冲突。
|
||||
|
||||
像MCFG、HPET、ECDT等静态表,不是保留地址空间的机制。静态表是在操作系统在启动初期且在它
|
||||
能够解析ACPI命名空间之前需要知道的东西。如果定义了一个新的表,即使旧的操作系统忽略了这
|
||||
个表,它也需要正常运行。_CRS允许这样做,因为它是通用的,可以被旧的操作系统解析;而静态表
|
||||
则不允许。
|
||||
|
||||
如果操作系统要管理一个通过ACPI描述的不可发现的设备,该设备将有一个特定的_HID/_CID,以
|
||||
告诉操作系统与之绑定的驱动程序,并且_CRS告诉操作系统和驱动程序该设备的寄存器在哪里。
|
||||
|
||||
PCI主桥是PNP0A03或PNP0A08设备。它们的_CRS应该描述它们所消耗的所有地址空间。这包括它
|
||||
们转发到PCI总线上的所有窗口,以及不转发到PCI的主桥本身的寄存器。主桥的寄存器包括次要/下
|
||||
级总线寄存器,决定了桥下面的总线范围,窗口寄存器描述了桥洞,等等。这些都是设备相关的,非
|
||||
架构相关的东西,所以PNP0A03/PNP0A08驱动可以管理它们的唯一方法是通过_PRS/_CRS/_SRS,
|
||||
它包含了特定于设备的细节。主桥寄存器也包括ECAM空间,因为它是由主桥消耗的。
|
||||
|
||||
ACPI定义了一个Consumer/Producer位来区分桥寄存器(“Consumer”下文译作消费者)和
|
||||
桥洞(“Producer”下文译作生产者)[4, 5],但是早期的BIOS没有正确使用这个位。其结果
|
||||
是,目前的ACPI规范只为扩展地址空间描述符定义了消费者/生产者;在旧的QWord/Word/Word地
|
||||
址空间描述符中,该位应该被忽略。因此,操作系统必须假定所有的QWord/Word/Word描述符都是
|
||||
窗口。
|
||||
|
||||
在增加扩展地址空间描述符之前,消费者/生产者的失败意味着没有办法描述PNP0A03/PNP0A08设
|
||||
备本身的桥寄存器。解决办法是在PNP0C02捕捉器中描述桥寄存器(包括ECAM空间)[6]。
|
||||
除了ECAM之外,桥寄存器空间反正是特定于设备的,所以通用的PNP0A03/PNP0A08驱动程
|
||||
序(pci_root.c)没有必要了解它。
|
||||
|
||||
新的架构应该能够在PNP0A03设备中使用“消费者”扩展地址空间描述符,用于桥寄存器,包括
|
||||
ECAM,尽管对[6]的严格解释可能禁止这样做。旧的x86和ia64内核假定所有的地址空间描述
|
||||
符,包括“消费者”扩展地址空间的描述符,都是窗口,所以在这些架构上以这种方式描述桥寄
|
||||
存器是不安全的。
|
||||
|
||||
PNP0C02“主板”设备基本上是万能的。除了“不要将这些资源用于其他用途”之外,没有其他的编
|
||||
程模型。因此,PNP0C02 _CRS应该声明ACPI命名空间中(1)没有被_CRS声明的任何其他设备对
|
||||
象的地址空间,(2)不应该被OS分配给其他东西。
|
||||
|
||||
除非有一个标准的固件接口用于配置访问,例如ia64 SAL接口[7],否则PCIe规范要求使用增强
|
||||
型配置访问方法(ECAM)。主桥消耗ECAM内存地址空间并将内存访问转换为PCI配置访问。该规范
|
||||
定义了ECAM地址空间的布局和功能;只有地址空间的基础是特定于设备的。ACPI操作系统从静态
|
||||
MCFG表或PNP0A03设备中的_CBA方法中了解基础地址。
|
||||
|
||||
MCFG表必须描述非热插拔主桥的ECAM空间[8]。由于MCFG是一个静态表,不能通过热插拔更新,
|
||||
PNP0A03设备中的_CBA方法描述了可热插拔主桥的ECAM空间[9]。请注意,对于MCFG和_CBA,
|
||||
基址总是对应于总线0,即使桥器下面的总线范围(通过_CRS报告)不从0开始。
|
||||
|
||||
|
||||
[1] ACPI 6.2, sec 6.1:
|
||||
对于任何在非枚举类型的总线上的设备(例如,ISA总线),OSPM会枚举设备的标识符,ACPI
|
||||
系统固件必须为每个设备提供一个_HID对象...以使OSPM能够做到这一点。
|
||||
|
||||
[2] ACPI 6.2, sec 3.7:
|
||||
操作系统枚举主板设备时,只需通过读取ACPI命名空间来寻找具有硬件ID的设备。
|
||||
|
||||
ACPI枚举的每个设备都包括ACPI命名空间中ACPI定义的对象,该对象报告设备可能占用的硬
|
||||
件资源[_PRS],报告设备当前使用的资源[_CRS]的对象,以及配置这些资源的对象[_SRS]。
|
||||
这些信息被即插即用操作系统(OSPM)用来配置设备。
|
||||
|
||||
[3] ACPI 6.2, sec 6.2:
|
||||
OSPM使用设备配置对象来配置通过ACPI列举的设备的硬件资源。设备配置对象提供了关于当前
|
||||
和可能的资源需求的信息,共享资源之间的关系,以及配置硬件资源的方法。
|
||||
|
||||
当OSPM枚举一个设备时,它调用_PRS来确定该设备的资源需求。它也可以调用_CRS来找到该设
|
||||
备的当前资源设置。利用这些信息,即插即用系统决定设备应该消耗什么资源,并通过调用设备
|
||||
的_SRS控制方法来设置这些资源。
|
||||
|
||||
在ACPI中,设备可以消耗资源(例如,传统的键盘),提供资源(例如,一个专有的PCI桥),
|
||||
或者两者都做。除非另有规定,设备的资源被假定为来自设备层次结构中设备上方最近的匹配资
|
||||
源。
|
||||
|
||||
[4] ACPI 6.2, sec 6.4.3.5.1, 2, 3, 4:
|
||||
QWord/DWord/Word 地址空间描述符 (.1, .2, .3)
|
||||
常规标志: Bit [0] 被忽略。
|
||||
|
||||
扩展地址空间描述符 (.4)
|
||||
常规标志: Bit [0] 消费者/生产者:
|
||||
|
||||
* 1 – 这个设备消费这个资源
|
||||
* 0 – 该设备生产和消费该资源
|
||||
|
||||
[5] ACPI 6.2, sec 19.6.43:
|
||||
ResourceUsage指定内存范围是由这个设备(ResourceConsumer)消费还是传递给子设备
|
||||
(ResourceProducer)。如果没有指定,那么就假定是ResourceConsumer。
|
||||
|
||||
[6] PCI Firmware 3.2, sec 4.1.2:
|
||||
如果操作系统不能原生的懂得保留MMCFG区域,MMCFG区域必须由固件保留。在MCFG表中或通
|
||||
过_CBA方法(见第4.1.3节)报告的地址范围必须通过声明主板资源来保留。对于大多数系统,
|
||||
主板资源将出现在ACPI命名空间的根部(在_SB下),在一个节点的_HID为EISAID(PNP0C0
|
||||
2),在这种情况下的资源不应该要求在根PCI总线的_CRS。这些资源可以选择在Int15 E820
|
||||
或EFIGetMemoryMap中作为保留内存返回,但必须始终通过ACPI作为主板资源报告。
|
||||
|
||||
[7] PCI Express 4.0, sec 7.2.2:
|
||||
对于PC兼容的系统,或者没有实现允许访问配置空间的处理器架构特定固件接口标准的系统,需
|
||||
要使用本节中定义的ECAM。
|
||||
|
||||
[8] PCI Firmware 3.2, sec 4.1.2:
|
||||
MCFG表是一个ACPI表,用于沟通的基础地址对应的非热的可移动的PCI段组范围内的PCI段组在
|
||||
启动时提供给操作系统。这对PC兼容系统来说是必需的。
|
||||
|
||||
MCFG表仅用于沟通在启动时系统可用的PCI段组对应的基址。
|
||||
|
||||
[9] PCI Firmware 3.2, sec 4.1.3:
|
||||
_CBA (Memory mapped Configuration Base Address) 控制方法是一个可选的ACPI对
|
||||
象,用于返回热插拔主桥的64位内存映射的配置基址。_CBA 返回的基址是与处理器相关的地址。
|
||||
_CBA 控制方法被评估为一个整数。
|
||||
|
||||
这个控制方法出现在主桥对象下。当_CBA方法出现在一个活动的主桥对象下时,操作系统会评
|
||||
估这个结构,以确定内存映射的配置基址,对应于_CRS方法中指定的总线编号范围的PCI段组。
|
||||
一个包含_CBA方法的ACPI命名空间对象也必须包含一个相应的_SEG方法。
|
@ -10,9 +10,6 @@
|
||||
:校译:
|
||||
|
||||
|
||||
|
||||
.. _cn_PCI_index.rst:
|
||||
|
||||
===================
|
||||
Linux PCI总线子系统
|
||||
===================
|
||||
@ -26,12 +23,12 @@ Linux PCI总线子系统
|
||||
pci-iov-howto
|
||||
msi-howto
|
||||
sysfs-pci
|
||||
acpi-info
|
||||
|
||||
|
||||
Todolist:
|
||||
|
||||
acpi-info
|
||||
pci-error-recovery
|
||||
pcieaer-howto
|
||||
endpoint/index
|
||||
boot-interrupts
|
||||
* pci-error-recovery
|
||||
* pcieaer-howto
|
||||
* endpoint/index
|
||||
* boot-interrupts
|
||||
|
@ -6,10 +6,10 @@
|
||||
|
||||
吴想成 Wu XiangCheng <bobwxc@email.cn>
|
||||
|
||||
Linux内核5.x版本 <http://kernel.org/>
|
||||
Linux内核6.x版本 <http://kernel.org/>
|
||||
=========================================
|
||||
|
||||
以下是Linux版本5的发行注记。仔细阅读它们,
|
||||
以下是Linux版本6的发行注记。仔细阅读它们,
|
||||
它们会告诉你这些都是什么,解释如何安装内核,以及遇到问题时该如何做。
|
||||
|
||||
什么是Linux?
|
||||
@ -61,27 +61,27 @@ Linux内核5.x版本 <http://kernel.org/>
|
||||
- 如果您要安装完整的源代码,请把内核tar档案包放在您有权限的目录中(例如您
|
||||
的主目录)并将其解包::
|
||||
|
||||
xz -cd linux-5.x.tar.xz | tar xvf -
|
||||
xz -cd linux-6.x.tar.xz | tar xvf -
|
||||
|
||||
将“X”替换成最新内核的版本号。
|
||||
|
||||
【不要】使用 /usr/src/linux 目录!这里有一组库头文件使用的内核头文件
|
||||
(通常是不完整的)。它们应该与库匹配,而不是被内核的变化搞得一团糟。
|
||||
|
||||
- 您还可以通过打补丁在5.x版本之间升级。补丁以xz格式分发。要通过打补丁进行
|
||||
安装,请获取所有较新的补丁文件,进入内核源代码(linux-5.x)的目录并
|
||||
- 您还可以通过打补丁在6.x版本之间升级。补丁以xz格式分发。要通过打补丁进行
|
||||
安装,请获取所有较新的补丁文件,进入内核源代码(linux-6.x)的目录并
|
||||
执行::
|
||||
|
||||
xz -cd ../patch-5.x.xz | patch -p1
|
||||
xz -cd ../patch-6.x.xz | patch -p1
|
||||
|
||||
请【按顺序】替换所有大于当前源代码树版本的“x”,这样就可以了。您可能想要
|
||||
删除备份文件(文件名类似xxx~ 或 xxx.orig),并确保没有失败的补丁(文件名
|
||||
类似xxx# 或 xxx.rej)。如果有,不是你就是我犯了错误。
|
||||
|
||||
与5.x内核的补丁不同,5.x.y内核(也称为稳定版内核)的补丁不是增量的,而是
|
||||
直接应用于基本的5.x内核。例如,如果您的基本内核是5.0,并且希望应用5.0.3
|
||||
补丁,则不应先应用5.0.1和5.0.2的补丁。类似地,如果您运行的是5.0.2内核,
|
||||
并且希望跳转到5.0.3,那么在应用5.0.3补丁之前,必须首先撤销5.0.2补丁
|
||||
与6.x内核的补丁不同,6.x.y内核(也称为稳定版内核)的补丁不是增量的,而是
|
||||
直接应用于基本的6.x内核。例如,如果您的基本内核是6.0,并且希望应用6.0.3
|
||||
补丁,则不应先应用6.0.1和6.0.2的补丁。类似地,如果您运行的是6.0.2内核,
|
||||
并且希望跳转到6.0.3,那么在应用6.0.3补丁之前,必须首先撤销6.0.2补丁
|
||||
(即patch -R)。更多关于这方面的内容,请阅读
|
||||
:ref:`Documentation/process/applying-patches.rst <applying_patches>` 。
|
||||
|
||||
@ -103,7 +103,7 @@ Linux内核5.x版本 <http://kernel.org/>
|
||||
软件要求
|
||||
---------
|
||||
|
||||
编译和运行5.x内核需要各种软件包的最新版本。请参考
|
||||
编译和运行6.x内核需要各种软件包的最新版本。请参考
|
||||
:ref:`Documentation/process/changes.rst <changes>`
|
||||
来了解最低版本要求以及如何升级软件包。请注意,使用过旧版本的这些包可能会
|
||||
导致很难追踪的间接错误,因此不要以为在生成或操作过程中出现明显问题时可以
|
||||
@ -116,12 +116,12 @@ Linux内核5.x版本 <http://kernel.org/>
|
||||
``make O=output/dir`` 选项可以为输出文件(包括 .config)指定备用位置。
|
||||
例如::
|
||||
|
||||
kernel source code: /usr/src/linux-5.x
|
||||
kernel source code: /usr/src/linux-6.x
|
||||
build directory: /home/name/build/kernel
|
||||
|
||||
要配置和构建内核,请使用::
|
||||
|
||||
cd /usr/src/linux-5.x
|
||||
cd /usr/src/linux-6.x
|
||||
make O=/home/name/build/kernel menuconfig
|
||||
make O=/home/name/build/kernel
|
||||
sudo make O=/home/name/build/kernel modules_install install
|
||||
@ -227,8 +227,6 @@ Linux内核5.x版本 <http://kernel.org/>
|
||||
- 确保您至少有gcc 5.1可用。
|
||||
有关更多信息,请参阅 :ref:`Documentation/process/changes.rst <changes>` 。
|
||||
|
||||
请注意,您仍然可以使用此内核运行a.out用户程序。
|
||||
|
||||
- 执行 ``make`` 来创建压缩内核映像。如果您安装了lilo以适配内核makefile,
|
||||
那么也可以进行 ``make install`` ,但是您可能需要先检查特定的lilo设置。
|
||||
|
||||
@ -282,67 +280,12 @@ Linux内核5.x版本 <http://kernel.org/>
|
||||
若遇到问题
|
||||
-----------
|
||||
|
||||
- 如果您发现了一些可能由于内核缺陷所导致的问题,请检查MAINTAINERS(维护者)
|
||||
文件看看是否有人与令您遇到麻烦的内核部分相关。如果无人在此列出,那么第二
|
||||
个最好的方案就是把它们发给我(torvalds@linux-foundation.org),也可能发送
|
||||
到任何其他相关的邮件列表或新闻组。
|
||||
如果您发现了一些可能由于内核缺陷所导致的问题,请参阅:
|
||||
Documentation/translations/zh_CN/admin-guide/reporting-issues.rst 。
|
||||
|
||||
- 在所有的缺陷报告中,【请】告诉我们您在说什么内核,如何复现问题,以及您的
|
||||
设置是什么的(使用您的常识)。如果问题是新的,请告诉我;如果问题是旧的,
|
||||
请尝试告诉我您什么时候首次注意到它。
|
||||
想要理解内核错误报告,请参阅:
|
||||
Documentation/translations/zh_CN/admin-guide/bug-hunting.rst 。
|
||||
|
||||
- 如果缺陷导致如下消息::
|
||||
|
||||
unable to handle kernel paging request at address C0000010
|
||||
Oops: 0002
|
||||
EIP: 0010:XXXXXXXX
|
||||
eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx
|
||||
esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx
|
||||
ds: xxxx es: xxxx fs: xxxx gs: xxxx
|
||||
Pid: xx, process nr: xx
|
||||
xx xx xx xx xx xx xx xx xx xx
|
||||
|
||||
或者类似的内核调试信息显示在屏幕上或在系统日志里,请【如实】复制它。
|
||||
可能对你来说转储(dump)看起来不可理解,但它确实包含可能有助于调试问题的
|
||||
信息。转储上方的文本也很重要:它说明了内核转储代码的原因(在上面的示例中,
|
||||
是由于内核指针错误)。更多关于如何理解转储的信息,请参见
|
||||
Documentation/admin-guide/bug-hunting.rst。
|
||||
|
||||
- 如果使用 CONFIG_KALLSYMS 编译内核,则可以按原样发送转储,否则必须使用
|
||||
``ksymoops`` 程序来理解转储(但通常首选使用CONFIG_KALLSYMS编译)。
|
||||
此实用程序可从
|
||||
https://www.kernel.org/pub/linux/utils/kernel/ksymoops/ 下载。
|
||||
或者,您可以手动执行转储查找:
|
||||
|
||||
- 在调试像上面这样的转储时,如果您可以查找EIP值的含义,这将非常有帮助。
|
||||
十六进制值本身对我或其他任何人都没有太大帮助:它会取决于特定的内核设置。
|
||||
您应该做的是从EIP行获取十六进制值(忽略 ``0010:`` ),然后在内核名字列表
|
||||
中查找它,以查看哪个内核函数包含有问题的地址。
|
||||
|
||||
要找到内核函数名,您需要找到与显示症状的内核相关联的系统二进制文件。就是
|
||||
文件“linux/vmlinux”。要提取名字列表并将其与内核崩溃中的EIP进行匹配,
|
||||
请执行::
|
||||
|
||||
nm vmlinux | sort | less
|
||||
|
||||
这将为您提供一个按升序排序的内核地址列表,从中很容易找到包含有问题的地址
|
||||
的函数。请注意,内核调试消息提供的地址不一定与函数地址完全匹配(事实上,
|
||||
这是不可能的),因此您不能只“grep”列表:不过列表将为您提供每个内核函数
|
||||
的起点,因此通过查找起始地址低于你正在搜索的地址,但后一个函数的高于的
|
||||
函数,你会找到您想要的。实际上,在您的问题报告中加入一些“上下文”可能是
|
||||
一个好主意,给出相关的上下几行。
|
||||
|
||||
如果您由于某些原因无法完成上述操作(如您使用预编译的内核映像或类似的映像),
|
||||
请尽可能多地告诉我您的相关设置信息,这会有所帮助。有关详细信息请阅读
|
||||
‘Documentation/admin-guide/reporting-issues.rst’。
|
||||
|
||||
- 或者,您可以在正在运行的内核上使用gdb(只读的;即不能更改值或设置断点)。
|
||||
为此,请首先使用-g编译内核;适当地编辑arch/x86/Makefile,然后执行 ``make
|
||||
clean`` 。您还需要启用CONFIG_PROC_FS(通过 ``make config`` )。
|
||||
|
||||
使用新内核重新启动后,执行 ``gdb vmlinux /proc/kcore`` 。现在可以使用所有
|
||||
普通的gdb命令。查找系统崩溃点的命令是 ``l *0xXXXXXXXX`` (将xxx替换为EIP
|
||||
值)。
|
||||
|
||||
用gdb无法调试一个当前未运行的内核是由于gdb(错误地)忽略了编译内核的起始
|
||||
偏移量。
|
||||
更多用GDB调试内核的信息,请参阅:
|
||||
Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst
|
||||
和 Documentation/dev-tools/kgdb.rst 。
|
||||
|
293
Documentation/translations/zh_CN/admin-guide/bootconfig.rst
Normal file
293
Documentation/translations/zh_CN/admin-guide/bootconfig.rst
Normal file
@ -0,0 +1,293 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/admin-guide/bootconfig.rst
|
||||
|
||||
:译者: 吴想成 Wu XiangCheng <bobwxc@email.cn>
|
||||
|
||||
========
|
||||
引导配置
|
||||
========
|
||||
|
||||
:作者: Masami Hiramatsu <mhiramat@kernel.org>
|
||||
|
||||
概述
|
||||
====
|
||||
|
||||
引导配置扩展了现有的内核命令行,以一种更有效率的方式在引导内核时进一步支持
|
||||
键值数据。这允许管理员传递一份结构化关键字的配置文件。
|
||||
|
||||
配置文件语法
|
||||
============
|
||||
|
||||
引导配置文件的语法采用非常简单的键值结构。每个关键字由点连接的单词组成,键
|
||||
和值由 ``=`` 连接。值以分号( ``;`` )或换行符( ``\n`` )结尾。数组值中每
|
||||
个元素由逗号( ``,`` )分隔。::
|
||||
|
||||
KEY[.WORD[...]] = VALUE[, VALUE2[...]][;]
|
||||
|
||||
与内核命令行语法不同,逗号和 ``=`` 周围允许有空格。
|
||||
|
||||
关键字只允许包含字母、数字、连字符( ``-`` )和下划线( ``_`` )。值可包含
|
||||
可打印字符和空格,但分号( ``;`` )、换行符( ``\n`` )、逗号( ``,`` )、
|
||||
井号( ``#`` )和右大括号( ``}`` )等分隔符除外。
|
||||
|
||||
如果你需要在值中使用这些分隔符,可以用双引号( ``"VALUE"`` )或单引号
|
||||
( ``'VALUE'`` )括起来。注意,引号无法转义。
|
||||
|
||||
键的值可以为空或不存在。这些键用于检查该键是否存在(类似布尔值)。
|
||||
|
||||
键值语法
|
||||
--------
|
||||
|
||||
引导配置文件语法允许用户通过大括号合并键名部分相同的关键字。例如::
|
||||
|
||||
foo.bar.baz = value1
|
||||
foo.bar.qux.quux = value2
|
||||
|
||||
也可以写成::
|
||||
|
||||
foo.bar {
|
||||
baz = value1
|
||||
qux.quux = value2
|
||||
}
|
||||
|
||||
或者更紧凑一些,写成::
|
||||
|
||||
foo.bar { baz = value1; qux.quux = value2 }
|
||||
|
||||
在这两种样式中,引导解析时相同的关键字都会自动合并。因此可以追加类似的树或
|
||||
键值。
|
||||
|
||||
相同关键字的值
|
||||
--------------
|
||||
|
||||
禁止两个或多个值或数组共享同一个关键字。例如::
|
||||
|
||||
foo = bar, baz
|
||||
foo = qux # !错误! 我们不可以重定义相同的关键字
|
||||
|
||||
如果你想要更新值,必须显式使用覆盖操作符 ``:=`` 。例如::
|
||||
|
||||
foo = bar, baz
|
||||
foo := qux
|
||||
|
||||
这样 ``foo`` 关键字的值就变成了 ``qux`` 。这对于通过添加(部分)自定义引导
|
||||
配置来覆盖默认值非常有用,免于解析默认引导配置。
|
||||
|
||||
如果你想对现有关键字追加值作为数组成员,可以使用 ``+=`` 操作符。例如::
|
||||
|
||||
foo = bar, baz
|
||||
foo += qux
|
||||
|
||||
这样, ``foo`` 关键字就同时拥有了 ``bar`` , ``baz`` 和 ``qux`` 。
|
||||
|
||||
此外,父关键字下可同时存在值和子关键字。
|
||||
例如,下列配置是可行的。::
|
||||
|
||||
foo = value1
|
||||
foo.bar = value2
|
||||
foo := value3 # 这会更新foo的值。
|
||||
|
||||
注意,裸值不能直接放进结构化关键字中,必须在大括号外定义它。例如::
|
||||
|
||||
foo {
|
||||
bar = value1
|
||||
bar {
|
||||
baz = value2
|
||||
qux = value3
|
||||
}
|
||||
}
|
||||
|
||||
同时,关键字下值节点的顺序是固定的。如果值和子关键字同时存在,值永远是该关
|
||||
键字的第一个子节点。因此如果用户先指定子关键字,如::
|
||||
|
||||
foo.bar = value1
|
||||
foo = value2
|
||||
|
||||
则在程序(和/proc/bootconfig)中,它会按如下显示::
|
||||
|
||||
foo = value2
|
||||
foo.bar = value1
|
||||
|
||||
注释
|
||||
----
|
||||
|
||||
配置语法接受shell脚本风格的注释。注释以井号( ``#`` )开始,到换行符
|
||||
( ``\n`` )结束。
|
||||
|
||||
::
|
||||
|
||||
# comment line
|
||||
foo = value # value is set to foo.
|
||||
bar = 1, # 1st element
|
||||
2, # 2nd element
|
||||
3 # 3rd element
|
||||
|
||||
会被解析为::
|
||||
|
||||
foo = value
|
||||
bar = 1, 2, 3
|
||||
|
||||
注意你不能把注释放在值和分隔符( ``,`` 或 ``;`` )之间。如下配置语法是错误的::
|
||||
|
||||
key = 1 # comment
|
||||
,2
|
||||
|
||||
|
||||
/proc/bootconfig
|
||||
================
|
||||
|
||||
/proc/bootconfig是引导配置的用户空间接口。与/proc/cmdline不同,此文件内容以
|
||||
键值列表样式显示。
|
||||
每个键值对一行,样式如下::
|
||||
|
||||
KEY[.WORDS...] = "[VALUE]"[,"VALUE2"...]
|
||||
|
||||
|
||||
用引导配置引导内核
|
||||
==================
|
||||
|
||||
用引导配置引导内核有两种方法:将引导配置附加到initrd镜像或直接嵌入内核中。
|
||||
|
||||
*initrd: initial RAM disk,初始内存磁盘*
|
||||
|
||||
将引导配置附加到initrd
|
||||
----------------------
|
||||
|
||||
由于默认情况下引导配置文件是用initrd加载的,因此它将被添加到initrd(initramfs)
|
||||
镜像文件的末尾,其中包含填充、大小、校验值和12字节幻数,如下所示::
|
||||
|
||||
[initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n]
|
||||
|
||||
大小和校验值为小端序存放的32位无符号值。
|
||||
|
||||
当引导配置被加到initrd镜像时,整个文件大小会对齐到4字节。空字符( ``\0`` )
|
||||
会填补对齐空隙。因此 ``size`` 就是引导配置文件的长度+填充的字节。
|
||||
|
||||
Linux内核在内存中解码initrd镜像的最后部分以获取引导配置数据。由于这种“背负式”
|
||||
的方法,只要引导加载器传递了正确的initrd文件大小,就无需更改或更新引导加载器
|
||||
和内核镜像本身。如果引导加载器意外传递了更长的大小,内核将无法找到引导配置数
|
||||
据。
|
||||
|
||||
Linux内核在tools/bootconfig下提供了 ``bootconfig`` 命令来完成此操作,管理员
|
||||
可以用它从initrd镜像中删除或追加配置文件。你可以用以下命令来构建它::
|
||||
|
||||
# make -C tools/bootconfig
|
||||
|
||||
要向initrd镜像添加你的引导配置文件,请按如下命令操作(旧数据会自动移除)::
|
||||
|
||||
# tools/bootconfig/bootconfig -a your-config /boot/initrd.img-X.Y.Z
|
||||
|
||||
要从镜像中移除配置,可以使用-d选项::
|
||||
|
||||
# tools/bootconfig/bootconfig -d /boot/initrd.img-X.Y.Z
|
||||
|
||||
然后在内核命令行上添加 ``bootconfig`` 告诉内核去initrd文件末尾寻找内核配置。
|
||||
|
||||
将引导配置嵌入内核
|
||||
------------------
|
||||
|
||||
如果你不能使用initrd,也可以通过Kconfig选项将引导配置文件嵌入内核中。在此情
|
||||
况下,你需要用以下选项重新编译内核::
|
||||
|
||||
CONFIG_BOOT_CONFIG_EMBED=y
|
||||
CONFIG_BOOT_CONFIG_EMBED_FILE="/引导配置/文件/的/路径"
|
||||
|
||||
``CONFIG_BOOT_CONFIG_EMBED_FILE`` 需要从源码树或对象树开始的引导配置文件的
|
||||
绝对/相对路径。内核会将其嵌入作为默认引导配置。
|
||||
|
||||
与将引导配置附加到initrd一样,你也需要在内核命令行上添加 ``bootconfig`` 告诉
|
||||
内核去启用内嵌的引导配置。
|
||||
|
||||
注意,即使你已经设置了此选项,仍可用附加到initrd的其他引导配置覆盖内嵌的引导
|
||||
配置。
|
||||
|
||||
通过引导配置传递内核参数
|
||||
========================
|
||||
|
||||
除了内核命令行,引导配置也可以用于传递内核参数。所有 ``kernel`` 关键字下的键
|
||||
值对都将直接传递给内核命令行。此外, ``init`` 下的键值对将通过命令行传递给
|
||||
init进程。参数按以下顺序与用户给定的内核命令行字符串相连,因此命令行参数可以
|
||||
覆盖引导配置参数(这取决于子系统如何处理参数,但通常前面的参数将被后面的参数
|
||||
覆盖)::
|
||||
|
||||
[bootconfig params][cmdline params] -- [bootconfig init params][cmdline init params]
|
||||
|
||||
如果引导配置文件给出的kernel/init参数是::
|
||||
|
||||
kernel {
|
||||
root = 01234567-89ab-cdef-0123-456789abcd
|
||||
}
|
||||
init {
|
||||
splash
|
||||
}
|
||||
|
||||
这将被复制到内核命令行字符串中,如下所示::
|
||||
|
||||
root="01234567-89ab-cdef-0123-456789abcd" -- splash
|
||||
|
||||
如果用户给出的其他命令行是::
|
||||
|
||||
ro bootconfig -- quiet
|
||||
|
||||
则最后的内核命令行如下::
|
||||
|
||||
root="01234567-89ab-cdef-0123-456789abcd" ro bootconfig -- splash quiet
|
||||
|
||||
|
||||
配置文件的限制
|
||||
==============
|
||||
|
||||
当前最大的配置大小是32KB,关键字总数(不是键值条目)必须少于1024个节点。
|
||||
注意:这不是条目数而是节点数,条目必须消耗超过2个节点(一个关键字和一个值)。
|
||||
所以从理论上讲最多512个键值对。如果关键字平均包含3个单词,则可有256个键值对。
|
||||
在大多数情况下,配置项的数量将少于100个条目,小于8KB,因此这应该足够了。如果
|
||||
节点数超过1024,解析器将返回错误,即使文件大小小于32KB。(请注意,此最大尺寸
|
||||
不包括填充的空字符。)
|
||||
无论如何,因为 ``bootconfig`` 命令在附加启动配置到initrd映像时会验证它,用户
|
||||
可以在引导之前注意到它。
|
||||
|
||||
|
||||
引导配置API
|
||||
===========
|
||||
|
||||
用户可以查询或遍历键值对,也可以查找(前缀)根关键字节点,并在查找该节点下的
|
||||
键值。
|
||||
|
||||
如果您有一个关键字字符串,则可以直接使用 xbc_find_value() 查询该键的值。如果
|
||||
你想知道引导配置里有哪些关键字,可以使用 xbc_for_each_key_value() 迭代键值对。
|
||||
请注意,您需要使用 xbc_array_for_each_value() 访问数组的值,例如::
|
||||
|
||||
vnode = NULL;
|
||||
xbc_find_value("key.word", &vnode);
|
||||
if (vnode && xbc_node_is_array(vnode))
|
||||
xbc_array_for_each_value(vnode, value) {
|
||||
printk("%s ", value);
|
||||
}
|
||||
|
||||
如果您想查找具有前缀字符串的键,可以使用 xbc_find_node() 通过前缀字符串查找
|
||||
节点,然后用 xbc_node_for_each_key_value() 迭代前缀节点下的键。
|
||||
|
||||
但最典型的用法是获取前缀下的命名值或前缀下的命名数组,例如::
|
||||
|
||||
root = xbc_find_node("key.prefix");
|
||||
value = xbc_node_find_value(root, "option", &vnode);
|
||||
...
|
||||
xbc_node_for_each_array_value(root, "array-option", value, anode) {
|
||||
...
|
||||
}
|
||||
|
||||
这将访问值“key.prefix.option”的值和“key.prefix.array-option”的数组。
|
||||
|
||||
锁是不需要的,因为在初始化之后配置只读。如果需要修改,必须复制所有数据和关键字。
|
||||
|
||||
|
||||
函数与结构体
|
||||
============
|
||||
|
||||
相关定义的kernel-doc参见:
|
||||
|
||||
- include/linux/bootconfig.h
|
||||
- lib/bootconfig.c
|
@ -63,6 +63,7 @@ Todolist:
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
bootconfig
|
||||
clearing-warn-once
|
||||
cpu-load
|
||||
cputopology
|
||||
@ -80,7 +81,6 @@ Todolist:
|
||||
* binderfs
|
||||
* binfmt-misc
|
||||
* blockdev/index
|
||||
* bootconfig
|
||||
* braille-console
|
||||
* btmrvl
|
||||
* cgroup-v1/index
|
||||
|
210
Documentation/translations/zh_CN/core-api/circular-buffers.rst
Normal file
210
Documentation/translations/zh_CN/core-api/circular-buffers.rst
Normal file
@ -0,0 +1,210 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/core-api/circular-buffers.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
周彬彬 Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
吴想成 Wu Xiangcheng <bobwxc@email.cn>
|
||||
时奎亮 Alex Shi <alexs@kernel.org>
|
||||
|
||||
==========
|
||||
环形缓冲区
|
||||
==========
|
||||
|
||||
:作者: David Howells <dhowells@redhat.com>
|
||||
:作者: Paul E. McKenney <paulmck@linux.ibm.com>
|
||||
|
||||
|
||||
Linux 提供了许多可用于实现循环缓冲的特性。有两组这样的特性:
|
||||
|
||||
(1) 用于确定2次方大小的缓冲区信息的便利函数。
|
||||
|
||||
(2) 可以代替缓冲区中对象的生产者和消费者共享锁的内存屏障。
|
||||
|
||||
如下所述,要使用这些设施,只需要一个生产者和一个消费者。可以通过序列化来处理多个
|
||||
生产者,并通过序列化来处理多个消费者。
|
||||
|
||||
.. Contents:
|
||||
|
||||
(*) 什么是环形缓冲区?
|
||||
|
||||
(*) 测量2次幂缓冲区
|
||||
|
||||
(*) 内存屏障与环形缓冲区的结合使用
|
||||
- 生产者
|
||||
- 消费者
|
||||
|
||||
(*) 延伸阅读
|
||||
|
||||
|
||||
|
||||
什么是环形缓冲区?
|
||||
==================
|
||||
|
||||
首先,什么是环形缓冲区?环形缓冲区是具有固定的有限大小的缓冲区,它有两个索引:
|
||||
|
||||
(1) 'head'索引 - 生产者将元素插入缓冲区的位置。
|
||||
|
||||
(2) 'tail'索引 - 消费者在缓冲区中找到下一个元素的位置。
|
||||
|
||||
通常,当tail指针等于head指针时,表明缓冲区是空的;而当head指针比tail指针少一个时,
|
||||
表明缓冲区是满的。
|
||||
|
||||
添加元素时,递增head索引;删除元素时,递增tail索引。tail索引不应该跳过head索引,
|
||||
两个索引在到达缓冲区末端时都应该被赋值为0,从而允许海量的数据流过缓冲区。
|
||||
|
||||
通常情况下,元素都有相同的单元大小,但这并不是使用以下技术的严格要求。如果要在缓
|
||||
冲区中包含多个元素或可变大小的元素,则索引可以增加超过1,前提是两个索引都没有超过
|
||||
另一个。然而,实现者必须小心,因为超过一个单位大小的区域可能会覆盖缓冲区的末端并
|
||||
且缓冲区会被分成两段。
|
||||
|
||||
测量2次幂缓冲区
|
||||
===============
|
||||
|
||||
计算任意大小的环形缓冲区的占用或剩余容量通常是一个费时的操作,需要使用模(除法)
|
||||
指令。但是如果缓冲区的大小为2次幂,则可以使用更快的按位与指令代替。
|
||||
|
||||
Linux提供了一组用于处理2次幂环形缓冲区的宏。可以通过以下方式使用::
|
||||
|
||||
#include <linux/circ_buf.h>
|
||||
|
||||
这些宏包括:
|
||||
|
||||
(#) 测量缓冲区的剩余容量::
|
||||
|
||||
CIRC_SPACE(head_index, tail_index, buffer_size);
|
||||
|
||||
返回缓冲区[1]中可插入元素的剩余空间大小。
|
||||
|
||||
|
||||
(#) 测量缓冲区中的最大连续立即可用空间::
|
||||
|
||||
CIRC_SPACE_TO_END(head_index, tail_index, buffer_size);
|
||||
|
||||
返回缓冲区[1]中剩余的连续空间的大小,元素可以立即插入其中,而不必绕回到缓冲
|
||||
区的开头。
|
||||
|
||||
|
||||
(#) 测量缓冲区的使用数::
|
||||
|
||||
CIRC_CNT(head_index, tail_index, buffer_size);
|
||||
|
||||
返回当前占用缓冲区[2]的元素数量。
|
||||
|
||||
|
||||
(#) 测量缓冲区的连续使用数::
|
||||
|
||||
CIRC_CNT_TO_END(head_index, tail_index, buffer_size);
|
||||
|
||||
返回可以从缓冲区中提取的连续元素[2]的数量,而不必绕回到缓冲区的开头。
|
||||
|
||||
这里的每一个宏名义上都会返回一个介于0和buffer_size-1之间的值,但是:
|
||||
|
||||
(1) CIRC_SPACE*()是为了在生产者中使用。对生产者来说,它们将返回一个下限,因为生
|
||||
产者控制着head索引,但消费者可能仍然在另一个CPU上耗尽缓冲区并移动tail索引。
|
||||
|
||||
对消费者来说,它将显示一个上限,因为生产者可能正忙于耗尽空间。
|
||||
|
||||
(2) CIRC_CNT*()是为了在消费者中使用。对消费者来说,它们将返回一个下限,因为消费
|
||||
者控制着tail索引,但生产者可能仍然在另一个CPU上填充缓冲区并移动head索引。
|
||||
|
||||
对于生产者,它将显示一个上限,因为消费者可能正忙于清空缓冲区。
|
||||
|
||||
(3) 对于第三方来说,生产者和消费者对索引的写入顺序是无法保证的,因为它们是独立的,
|
||||
而且可能是在不同的CPU上进行的,所以在这种情况下的结果只是一种猜测,甚至可能
|
||||
是错误的。
|
||||
|
||||
内存屏障与环形缓冲区的结合使用
|
||||
==============================
|
||||
|
||||
通过将内存屏障与环形缓冲区结合使用,可以避免以下需求:
|
||||
|
||||
(1) 使用单个锁来控制对缓冲区两端的访问,从而允许同时填充和清空缓冲区;以及
|
||||
|
||||
(2) 使用原子计数器操作。
|
||||
|
||||
这有两个方面:填充缓冲区的生产者和清空缓冲区的消费者。在任何时候,只应有一个生产
|
||||
者在填充缓冲区,同样的也只应有一个消费者在清空缓冲区,但双方可以同时操作。
|
||||
|
||||
|
||||
生产者
|
||||
------
|
||||
|
||||
生产者看起来像这样::
|
||||
|
||||
spin_lock(&producer_lock);
|
||||
|
||||
unsigned long head = buffer->head;
|
||||
/* spin_unlock()和下一个spin_lock()提供必要的排序。 */
|
||||
unsigned long tail = READ_ONCE(buffer->tail);
|
||||
|
||||
if (CIRC_SPACE(head, tail, buffer->size) >= 1) {
|
||||
/* 添加一个元素到缓冲区 */
|
||||
struct item *item = buffer[head];
|
||||
|
||||
produce_item(item);
|
||||
|
||||
smp_store_release(buffer->head,
|
||||
(head + 1) & (buffer->size - 1));
|
||||
|
||||
/* wake_up()将确保在唤醒任何人之前提交head */
|
||||
wake_up(consumer);
|
||||
}
|
||||
|
||||
spin_unlock(&producer_lock);
|
||||
|
||||
这将表明CPU必须在head索引使其对消费者可用之前写入新项目的内容,同时CPU必须在唤醒
|
||||
消费者之前写入修改后的head索引。
|
||||
|
||||
请注意,wake_up()并不保证任何形式的屏障,除非确实唤醒了某些东西。因此我们不能依靠
|
||||
它来进行排序。但是数组中始终有一个元素留空,因此生产者必须产生两个元素,然后才可
|
||||
能破坏消费者当前正在读取的元素。同时,消费者连续调用之间成对的解锁-加锁提供了索引
|
||||
读取(指示消费者已清空给定元素)和生产者对该相同元素的写入之间的必要顺序。
|
||||
|
||||
|
||||
消费者
|
||||
------
|
||||
|
||||
消费者看起来像这样::
|
||||
|
||||
spin_lock(&consumer_lock);
|
||||
|
||||
/* 读取该索引处的内容之前,先读取索引 */
|
||||
unsigned long head = smp_load_acquire(buffer->head);
|
||||
unsigned long tail = buffer->tail;
|
||||
|
||||
if (CIRC_CNT(head, tail, buffer->size) >= 1) {
|
||||
|
||||
/* 从缓冲区中提取一个元素 */
|
||||
struct item *item = buffer[tail];
|
||||
|
||||
consume_item(item);
|
||||
|
||||
/* 在递增tail之前完成对描述符的读取。 */
|
||||
smp_store_release(buffer->tail,
|
||||
(tail + 1) & (buffer->size - 1));
|
||||
}
|
||||
|
||||
spin_unlock(&consumer_lock);
|
||||
|
||||
这表明CPU在读取新元素之前确保索引是最新的,然后在写入新的尾指针之前应确保CPU已完
|
||||
成读取该元素,这将擦除该元素。
|
||||
|
||||
请注意,使用READ_ONCE()和smp_load_acquire()来读取反向(head)索引。这可以防止编译
|
||||
器丢弃并重新加载其缓存值。如果您能确定反向(head)索引将仅使用一次,则这不是必须
|
||||
的。smp_load_acquire()还可以强制CPU对后续的内存引用进行排序。类似地,两种算法都使
|
||||
用smp_store_release()来写入线程的索引。这记录了我们正在写入可以并发读取的内容的事
|
||||
实,以防止编译器破坏存储,并强制对以前的访问进行排序。
|
||||
|
||||
|
||||
延伸阅读
|
||||
========
|
||||
|
||||
关于Linux的内存屏障设施的描述,请查看Documentation/memory-barriers.txt。
|
@ -0,0 +1,23 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/core-api/generic-radix-tree.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
周彬彬 Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
|
||||
===================
|
||||
通用基数树/稀疏数组
|
||||
===================
|
||||
|
||||
通用基数树/稀疏数组的相关内容请见include/linux/generic-radix-tree.h文件中的
|
||||
“DOC: Generic radix trees/sparse arrays”。
|
||||
|
||||
通用基数树函数
|
||||
--------------
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
include/linux/generic-radix-tree.h
|
80
Documentation/translations/zh_CN/core-api/idr.rst
Normal file
80
Documentation/translations/zh_CN/core-api/idr.rst
Normal file
@ -0,0 +1,80 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/core-api/idr.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
周彬彬 Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
吴想成 Wu Xiangcheng <bobwxc@email.cn>
|
||||
时奎亮 Alex Shi <alexs@kernel.org>
|
||||
|
||||
======
|
||||
ID分配
|
||||
======
|
||||
|
||||
:作者: Matthew Wilcox
|
||||
|
||||
概述
|
||||
====
|
||||
|
||||
要解决的一个常见问题是分配标识符(IDs);它通常是标识事物的数字。比如包括文件描述
|
||||
符、进程ID、网络协议中的数据包标识符、SCSI标记和设备实例编号。IDR和IDA为这个问题
|
||||
提供了一个合理的解决方案,以避免每个人都自创。IDR提供将ID映射到指针的能力,而IDA
|
||||
仅提供ID分配,因此内存效率更高。
|
||||
|
||||
IDR接口已经被废弃,请使用 ``XArray`` 。
|
||||
|
||||
IDR的用法
|
||||
=========
|
||||
|
||||
首先初始化一个IDR,对于静态分配的IDR使用DEFINE_IDR(),或者对于动态分配的IDR使用
|
||||
idr_init()。
|
||||
|
||||
您可以调用idr_alloc()来分配一个未使用的ID。通过调用idr_find()查询与该ID相关的指针,
|
||||
并通过调用idr_remove()释放该ID。
|
||||
|
||||
如果需要更改与一个ID相关联的指针,可以调用idr_replace()。这样做的一个常见原因是通
|
||||
过将 ``NULL`` 指针传递给分配函数来保留ID;用保留的ID初始化对象,最后将初始化的对
|
||||
象插入IDR。
|
||||
|
||||
一些用户需要分配大于 ``INT_MAX`` 的ID。到目前为止,所有这些用户都满足 ``UINT_MAX``
|
||||
的限制,他们使用idr_alloc_u32()。如果您需要超出u32的ID,我们将与您合作以满足您的
|
||||
需求。
|
||||
|
||||
如果需要按顺序分配ID,可以使用idr_alloc_cyclic()。处理较大数量的ID时,IDR的效率会
|
||||
降低,所以使用这个函数会有一点代价。
|
||||
|
||||
要对IDR使用的所有指针进行操作,您可以使用基于回调的idr_for_each()或迭代器样式的
|
||||
idr_for_each_entry()。您可能需要使用idr_for_each_entry_continue()来继续迭代。如果
|
||||
迭代器不符合您的需求,您也可以使用idr_get_next()。
|
||||
|
||||
当使用完IDR后,您可以调用idr_destroy()来释放IDR占用的内存。这并不会释放IDR指向的
|
||||
对象;如果您想这样做,请使用其中一个迭代器来执行此操作。
|
||||
|
||||
您可以使用idr_is_empty()来查看当前是否分配了任何ID。
|
||||
|
||||
如果在从IDR分配一个新ID时需要带锁,您可能需要传递一组限制性的GFP标志,但这可能导
|
||||
致IDR无法分配内存。为了解决该问题,您可以在获取锁之前调用idr_preload(),然后在分
|
||||
配之后调用idr_preload_end()。
|
||||
|
||||
IDR同步的相关内容请见include/linux/idr.h文件中的“DOC: idr sync”。
|
||||
|
||||
IDA的用法
|
||||
=========
|
||||
|
||||
IDA的用法的相关内容请见lib/idr.c文件中的“DOC: IDA description”。
|
||||
|
||||
函数和数据结构
|
||||
==============
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
include/linux/idr.h
|
||||
|
||||
lib/idr.c
|
@ -44,15 +44,15 @@
|
||||
assoc_array
|
||||
xarray
|
||||
rbtree
|
||||
idr
|
||||
circular-buffers
|
||||
generic-radix-tree
|
||||
packing
|
||||
|
||||
Todolist:
|
||||
|
||||
|
||||
|
||||
idr
|
||||
circular-buffers
|
||||
generic-radix-tree
|
||||
packing
|
||||
this_cpu_ops
|
||||
timekeeping
|
||||
errseq
|
||||
|
160
Documentation/translations/zh_CN/core-api/packing.rst
Normal file
160
Documentation/translations/zh_CN/core-api/packing.rst
Normal file
@ -0,0 +1,160 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/core-api/packing.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
周彬彬 Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
吴想成 Wu Xiangcheng <bobwxc@email.cn>
|
||||
时奎亮 Alex Shi <alexs@kernel.org>
|
||||
|
||||
========================
|
||||
通用的位域打包和解包函数
|
||||
========================
|
||||
|
||||
问题陈述
|
||||
--------
|
||||
|
||||
使用硬件时,必须在几种与其交互的方法之间进行选择。
|
||||
|
||||
可以将指针映射到在硬件设备的内存区上精心设计的结构体,并将其字段作为结构成员(可
|
||||
能声明为位域)访问。但是由于CPU和硬件设备之间潜在的字节顺序不匹配,以这种方式编写
|
||||
代码会降低其可移植性。
|
||||
|
||||
此外,必须密切注意将硬件文档中的寄存器定义转换为结构的位域索引。此外,一些硬件
|
||||
(通常是网络设备)倾向于以违反任何合理字边界(有时甚至是64位)的方式对其寄存器字
|
||||
段进行分组。这就造成了不得不在结构中定义寄存器字段的“高”和“低”部分的不便。
|
||||
|
||||
结构域定义的更可靠的替代方法是通过移动适当数量的位来提取所需的字段。但这仍然不能
|
||||
防止字节顺序不匹配,除非所有内存访问都是逐字节执行的。此外,代码很容易变得杂乱无
|
||||
章,同时可能会在所需的许多位移操作中丢失一些高层次的想法。
|
||||
|
||||
许多驱动程序采用了位移的方法,然后试图用定制的宏来减少杂乱无章的东西,但更多的时
|
||||
候,这些宏所采用的捷径依旧妨碍了代码真正的可移植性。
|
||||
|
||||
解决方案
|
||||
--------
|
||||
|
||||
该API涉及2个基本操作:
|
||||
|
||||
- 将一个CPU可使用的数字打包到内存缓冲区中(具有硬件约束/特殊性)。
|
||||
- 将内存缓冲区(具有硬件约束/特殊性)解压缩为一个CPU可使用的数字。
|
||||
|
||||
该API提供了对所述硬件约束和特殊性以及CPU字节序的抽象,因此这两者之间可能不匹配。
|
||||
|
||||
这些API函数的基本单元是u64。从CPU的角度来看,位63总是意味着字节7的位偏移量7,尽管
|
||||
只是逻辑上的。问题是:我们将这个比特放在内存的什么位置?
|
||||
|
||||
以下示例介绍了打包u64字段的内存布局。打包缓冲区中的字节偏移量始终默认为0,1...7。
|
||||
示例显示的是逻辑字节和位所在的位置。
|
||||
|
||||
1. 通常情况下(无特殊性),我们会这样做:
|
||||
|
||||
::
|
||||
|
||||
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
|
||||
7 6 5 4
|
||||
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
3 2 1 0
|
||||
|
||||
也就是说,CPU可使用的u64的MSByte(7)位于内存偏移量0处,而u64的LSByte(0)位于内存偏移量7处。
|
||||
|
||||
这对应于大多数人认为的“大端”,其中位i对应于数字2^i。这在代码注释中也称为“逻辑”符号。
|
||||
|
||||
|
||||
2. 如果设置了QUIRK_MSB_ON_THE_RIGHT,我们按如下方式操作:
|
||||
|
||||
::
|
||||
|
||||
56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39
|
||||
7 6 5 4
|
||||
24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7
|
||||
3 2 1 0
|
||||
|
||||
也就是说,QUIRK_MSB_ON_THE_RIGHT不会影响字节定位,但会反转字节内的位偏移量。
|
||||
|
||||
|
||||
3. 如果设置了QUIRK_LITTLE_ENDIAN,我们按如下方式操作:
|
||||
|
||||
::
|
||||
|
||||
39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56
|
||||
4 5 6 7
|
||||
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
|
||||
0 1 2 3
|
||||
|
||||
因此,QUIRK_LITTLE_ENDIAN意味着在内存区域内,每个4字节的字的每个字节都被放置在与
|
||||
该字的边界相比的镜像位置。
|
||||
|
||||
|
||||
4. 如果设置了QUIRK_MSB_ON_THE_RIGHT和QUIRK_LITTLE_ENDIAN,我们这样做:
|
||||
|
||||
::
|
||||
|
||||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
||||
4 5 6 7
|
||||
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
||||
0 1 2 3
|
||||
|
||||
|
||||
5. 如果只设置了QUIRK_LSW32_IS_FIRST,我们这样做:
|
||||
|
||||
::
|
||||
|
||||
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
3 2 1 0
|
||||
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
|
||||
7 6 5 4
|
||||
|
||||
在这种情况下,8字节内存区域解释如下:前4字节对应最不重要的4字节的字,后4字节对应
|
||||
更重要的4字节的字。
|
||||
|
||||
6. 如果设置了QUIRK_LSW32_IS_FIRST和QUIRK_MSB_ON_THE_RIGHT,我们这样做:
|
||||
|
||||
::
|
||||
|
||||
24 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7
|
||||
3 2 1 0
|
||||
56 57 58 59 60 61 62 63 48 49 50 51 52 53 54 55 40 41 42 43 44 45 46 47 32 33 34 35 36 37 38 39
|
||||
7 6 5 4
|
||||
|
||||
|
||||
7. 如果设置了QUIRK_LSW32_IS_FIRST和QUIRK_LITTLE_ENDIAN,则如下所示:
|
||||
|
||||
::
|
||||
|
||||
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
|
||||
0 1 2 3
|
||||
39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56
|
||||
4 5 6 7
|
||||
|
||||
|
||||
8. 如果设置了QUIRK_LSW32_IS_FIRST,QUIRK_LITTLE_ENDIAN和QUIRK_MSB_ON_THE_RIGHT,
|
||||
则如下所示:
|
||||
|
||||
::
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
||||
0 1 2 3
|
||||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
||||
4 5 6 7
|
||||
|
||||
|
||||
我们总是认为我们的偏移量好像没有特殊性,然后在访问内存区域之前翻译它们。
|
||||
|
||||
预期用途
|
||||
--------
|
||||
|
||||
选择使用该API的驱动程序首先需要确定上述3种quirk组合(共8种)中的哪一种与硬件文档
|
||||
中描述的相匹配。然后,他们应该封装packing()函数,创建一个新的xxx_packing(),使用
|
||||
适当的QUIRK_* one-hot 位集合来调用它。
|
||||
|
||||
packing()函数返回一个int类型的错误码,以防止程序员使用不正确的API。这些错误预计不
|
||||
会在运行时发生,因此xxx_packing()返回void并简单地接受这些错误是合理的。它可以选择
|
||||
转储栈或打印错误描述。
|
37
Documentation/translations/zh_CN/devicetree/changesets.rst
Normal file
37
Documentation/translations/zh_CN/devicetree/changesets.rst
Normal file
@ -0,0 +1,37 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/Devicetree/changesets.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
|
||||
============
|
||||
设备树变更集
|
||||
============
|
||||
|
||||
设备树变更集是一种方法,它允许人们以这样一种方式在实时树中使用变化,即要么使用全部的
|
||||
变化,要么不使用。如果在使用变更集的过程中发生错误,那么树将被回滚到之前的状态。一个
|
||||
变更集也可以在使用后被删除。
|
||||
|
||||
当一个变更集被使用时,所有的改变在发出OF_RECONFIG通知器之前被一次性使用到树上。这是
|
||||
为了让接收者在收到通知时看到一个完整的、一致的树的状态。
|
||||
|
||||
一个变化集的顺序如下。
|
||||
|
||||
1. of_changeset_init() - 初始化一个变更集。
|
||||
|
||||
2. 一些DT树变化的调用,of_changeset_attach_node(), of_changeset_detach_node(),
|
||||
of_changeset_add_property(), of_changeset_remove_property,
|
||||
of_changeset_update_property()来准备一组变更。此时不会对活动树做任何变更。所有
|
||||
的变更操作都记录在of_changeset的 `entries` 列表中。
|
||||
|
||||
3. of_changeset_apply() - 将变更使用到树上。要么整个变更集被使用,要么如果有错误,
|
||||
树会被恢复到之前的状态。核心通过锁确保正确的顺序。如果需要的话,可以使用一个解锁的
|
||||
__of_changeset_apply版本。
|
||||
|
||||
如果一个成功使用的变更集需要被删除,可以用of_changeset_revert()来完成。
|
@ -0,0 +1,31 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/Devicetree/dynamic-resolution-notes.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
========================
|
||||
Devicetree动态解析器说明
|
||||
========================
|
||||
|
||||
本文描述了内核内DeviceTree解析器的实现,它位于drivers/of/resolver.c中。
|
||||
|
||||
解析器如何工作?
|
||||
----------------
|
||||
|
||||
解析器被赋予一个任意的树作为输入,该树用适当的dtc选项编译,并有一个/plugin/标签。这就产
|
||||
生了适当的__fixups__和__local_fixups__节点。
|
||||
|
||||
解析器依次通过以下步骤工作:
|
||||
|
||||
1. 从实时树中获取最大的设备树phandle值 + 1.
|
||||
2. 调整树的所有本地 phandles,以解决这个量。
|
||||
3. 使用 __local__fixups__ 节点信息以相同的量调整所有本地引用。
|
||||
4. 对于__fixups__节点中的每个属性,找到它在实时树中引用的节点。这是用来标记该节点的标签。
|
||||
5. 检索fixup的目标的phandle。
|
||||
6. 对于属性中的每个fixup,找到节点:属性:偏移的位置,并用phandle值替换它。
|
@ -24,21 +24,16 @@ Open Firmware 和 Devicetree
|
||||
|
||||
usage-model
|
||||
of_unittest
|
||||
|
||||
Todolist:
|
||||
|
||||
* kernel-api
|
||||
kernel-api
|
||||
|
||||
Devicetree Overlays
|
||||
===================
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
Todolist:
|
||||
|
||||
* changesets
|
||||
* dynamic-resolution-notes
|
||||
* overlay-notes
|
||||
changesets
|
||||
dynamic-resolution-notes
|
||||
overlay-notes
|
||||
|
||||
Devicetree Bindings
|
||||
===================
|
||||
|
58
Documentation/translations/zh_CN/devicetree/kernel-api.rst
Normal file
58
Documentation/translations/zh_CN/devicetree/kernel-api.rst
Normal file
@ -0,0 +1,58 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/Devicetree/kernel-api.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
|
||||
=================
|
||||
内核中的设备树API
|
||||
=================
|
||||
|
||||
核心函数
|
||||
--------
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/of/base.c
|
||||
|
||||
include/linux/of.h
|
||||
|
||||
drivers/of/property.c
|
||||
|
||||
include/linux/of_graph.h
|
||||
|
||||
drivers/of/address.c
|
||||
|
||||
drivers/of/irq.c
|
||||
|
||||
drivers/of/fdt.c
|
||||
|
||||
驱动模型函数
|
||||
------------
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
include/linux/of_device.h
|
||||
|
||||
drivers/of/device.c
|
||||
|
||||
include/linux/of_platform.h
|
||||
|
||||
drivers/of/platform.c
|
||||
|
||||
覆盖和动态DT函数
|
||||
----------------
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/of/resolver.c
|
||||
|
||||
drivers/of/dynamic.c
|
||||
|
||||
drivers/of/overlay.c
|
140
Documentation/translations/zh_CN/devicetree/overlay-notes.rst
Normal file
140
Documentation/translations/zh_CN/devicetree/overlay-notes.rst
Normal file
@ -0,0 +1,140 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/Devicetree/overlay-notes.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
==============
|
||||
设备树覆盖说明
|
||||
==============
|
||||
|
||||
本文档描述了drivers/of/overlay.c中的内核内设备树覆盖功能的实现,是
|
||||
Documentation/devicetree/dynamic-resolution-notes.rst[1]的配套文档。
|
||||
|
||||
覆盖如何工作
|
||||
------------
|
||||
|
||||
设备树覆盖的目的是修改内核的实时树,并使修改以反映变化的方式影响内核的状态。
|
||||
由于内核主要处理的是设备,任何新的设备节点如果导致一个活动的设备,就应该创建它,
|
||||
而如果设备节点被禁用或被全部删除,受影响的设备应该被取消注册。
|
||||
|
||||
让我们举个例子,我们有一个foo板,它的基本树形图如下::
|
||||
|
||||
---- foo.dts ---------------------------------------------------------------
|
||||
/* FOO平台 */
|
||||
/dts-v1/;
|
||||
/ {
|
||||
compatible = "corp,foo";
|
||||
|
||||
/* 共享的资源 */
|
||||
res: res {
|
||||
};
|
||||
|
||||
/* 芯片上的外围设备 */
|
||||
ocp: ocp {
|
||||
/* 总是被实例化的外围设备 */
|
||||
peripheral1 { ... };
|
||||
};
|
||||
};
|
||||
---- foo.dts ---------------------------------------------------------------
|
||||
|
||||
覆盖bar.dts,
|
||||
::
|
||||
|
||||
---- bar.dts - 按标签覆盖目标位置 ----------------------------
|
||||
/dts-v1/;
|
||||
/插件/;
|
||||
&ocp {
|
||||
/* bar外围 */
|
||||
bar {
|
||||
compatible = "corp,bar";
|
||||
... /* 各种属性和子节点 */
|
||||
};
|
||||
};
|
||||
---- bar.dts ---------------------------------------------------------------
|
||||
|
||||
当加载(并按照[1]中描述的方式解决)时,应该产生foo+bar.dts::
|
||||
|
||||
---- foo+bar.dts -----------------------------------------------------------
|
||||
/* FOO平台 + bar外围 */
|
||||
/ {
|
||||
compatible = "corp,foo";
|
||||
|
||||
/* 共享资源 */
|
||||
res: res {
|
||||
};
|
||||
|
||||
/* 芯片上的外围设备 */
|
||||
ocp: ocp {
|
||||
/* 总是被实例化的外围设备 */
|
||||
peripheral1 { ... };
|
||||
|
||||
/* bar外围 */
|
||||
bar {
|
||||
compatible = "corp,bar";
|
||||
... /* 各种属性和子节点 */
|
||||
};
|
||||
};
|
||||
};
|
||||
---- foo+bar.dts -----------------------------------------------------------
|
||||
|
||||
作为覆盖的结果,已经创建了一个新的设备节点(bar),因此将注册一个bar平台设备,
|
||||
如果加载了匹配的设备驱动程序,将按预期创建设备。
|
||||
|
||||
如果基础DT不是用-@选项编译的,那么“&ocp”标签将不能用于将覆盖节点解析到基础
|
||||
DT中的适当位置。在这种情况下,可以提供目标路径。通过标签的目标位置的语法是比
|
||||
较好的,因为不管标签在DT中出现在哪里,覆盖都可以被应用到任何包含标签的基础DT上。
|
||||
|
||||
上面的bar.dts例子被修改为使用目标路径语法,即为::
|
||||
|
||||
---- bar.dts - 通过明确的路径覆盖目标位置 --------------------
|
||||
/dts-v1/;
|
||||
/插件/;
|
||||
&{/ocp} {
|
||||
/* bar外围 */
|
||||
bar {
|
||||
compatible = "corp,bar";
|
||||
... /* 各种外围设备和子节点 */
|
||||
}
|
||||
};
|
||||
---- bar.dts ---------------------------------------------------------------
|
||||
|
||||
|
||||
内核中关于覆盖的API
|
||||
-------------------
|
||||
|
||||
该API相当容易使用。
|
||||
|
||||
1) 调用of_overlay_fdt_apply()来创建和应用一个覆盖的变更集。返回值是一个
|
||||
错误或一个识别这个覆盖的cookie。
|
||||
|
||||
2) 调用of_overlay_remove()来删除和清理先前通过调用of_overlay_fdt_apply()
|
||||
而创建的覆盖变更集。不允许删除一个被另一个覆盖的覆盖变化集。
|
||||
|
||||
最后,如果你需要一次性删除所有的覆盖,只需调用of_overlay_remove_all(),
|
||||
它将以正确的顺序删除每一个覆盖。
|
||||
|
||||
你可以选择注册在覆盖操作中被调用的通知器。详见
|
||||
of_overlay_notifier_register/unregister和enum of_overlay_notify_action。
|
||||
|
||||
OF_OVERLAY_PRE_APPLY、OF_OVERLAY_POST_APPLY或OF_OVERLAY_PRE_REMOVE
|
||||
的通知器回调可以存储指向覆盖层中的设备树节点或其内容的指针,但这些指针不能持
|
||||
续到OF_OVERLAY_POST_REMOVE的通知器回调。在OF_OVERLAY_POST_REMOVE通
|
||||
知器被调用后,包含覆盖层的内存将被kfree()ed。请注意,即使OF_OVERLAY_POST_REMOVE
|
||||
的通知器返回错误,内存也会被kfree()ed。
|
||||
|
||||
drivers/of/dynamic.c中的变更集通知器是第二种类型的通知器,可以通过应用或移除
|
||||
覆盖层来触发。这些通知器不允许在覆盖层或其内容中存储指向设备树节点的指针。当包含
|
||||
覆盖层的内存因移除覆盖层而被释放时,覆盖层代码并不能防止这类指针仍然有效。
|
||||
|
||||
任何其他保留指向覆盖层节点或数据的指针的代码都被认为是一个错误,因为在移除覆盖层
|
||||
后,该指针将指向已释放的内存。
|
||||
|
||||
覆盖层的用户必须特别注意系统上发生的整体操作,以确保其他内核代码不保留任何指向覆
|
||||
盖层节点或数据的指针。任何无意中使用这种指针的例子是,如果一个驱动或子系统模块在
|
||||
应用了覆盖后被加载,并且该驱动或子系统扫描了整个设备树或其大部分,包括覆盖节点。
|
69
Documentation/translations/zh_CN/driver-api/gpio/index.rst
Normal file
69
Documentation/translations/zh_CN/driver-api/gpio/index.rst
Normal file
@ -0,0 +1,69 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. include:: ../../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/driver-api/gpio/index.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
=======================
|
||||
通用型输入/输出(GPIO)
|
||||
=======================
|
||||
|
||||
目录:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
legacy
|
||||
|
||||
Todolist:
|
||||
|
||||
* intro
|
||||
* using-gpio
|
||||
* driver
|
||||
* consumer
|
||||
* board
|
||||
* drivers-on-gpio
|
||||
* bt8xxgpio
|
||||
|
||||
核心
|
||||
====
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
include/linux/gpio/driver.h
|
||||
|
||||
drivers/gpio/gpiolib.c
|
||||
|
||||
ACPI支持
|
||||
========
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/gpio/gpiolib-acpi.c
|
||||
|
||||
设备树支持
|
||||
==========
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/gpio/gpiolib-of.c
|
||||
|
||||
设备管理支持
|
||||
============
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/gpio/gpiolib-devres.c
|
||||
|
||||
sysfs帮助(函数)
|
||||
=================
|
||||
|
||||
该API在以下内核代码中:
|
||||
|
||||
drivers/gpio/gpiolib-sysfs.c
|
@ -1,39 +1,28 @@
|
||||
Chinese translated version of Documentation/admin-guide/gpio
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
If you have any comment or update to the content, please contact the
|
||||
original document maintainer directly. However, if you have a problem
|
||||
communicating in English you can also ask the Chinese maintainer for
|
||||
help. Contact the Chinese maintainer if this translation is outdated
|
||||
or if there is a problem with the translation.
|
||||
.. include:: ../../disclaimer-zh_CN.rst
|
||||
|
||||
Maintainer: Grant Likely <grant.likely@secretlab.ca>
|
||||
Linus Walleij <linus.walleij@linaro.org>
|
||||
Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
|
||||
---------------------------------------------------------------------
|
||||
Documentation/admin-guide/gpio 的中文翻译
|
||||
:Original: Documentation/driver-api/gpio/legacy.rst
|
||||
|
||||
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
||||
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
||||
译存在问题,请联系中文版维护者。
|
||||
英文版维护者: Grant Likely <grant.likely@secretlab.ca>
|
||||
Linus Walleij <linus.walleij@linaro.org>
|
||||
中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
:翻译:
|
||||
|
||||
傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
|
||||
以下为正文
|
||||
---------------------------------------------------------------------
|
||||
GPIO 接口
|
||||
传统GPIO接口
|
||||
============
|
||||
|
||||
本文档提供了一个在Linux下访问GPIO的公约概述。
|
||||
本文档概述了Linux下的GPIO访问公约。
|
||||
|
||||
这些函数以 gpio_* 作为前缀。其他的函数不允许使用这样的前缀或相关的
|
||||
__gpio_* 前缀。
|
||||
|
||||
|
||||
什么是GPIO?
|
||||
==========
|
||||
什么是GPIO?
|
||||
============
|
||||
"通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可
|
||||
由多种芯片提供,且对于从事嵌入式和定制硬件的 Linux 开发者来说是
|
||||
比较熟悉。每个GPIO 都代表一个连接到特定引脚或球栅阵列(BGA)封装中
|
||||
@ -99,6 +88,7 @@ GPIO 公约
|
||||
|
||||
标识 GPIO
|
||||
---------
|
||||
|
||||
GPIO 是通过无符号整型来标识的,范围是 0 到 MAX_INT。保留“负”数
|
||||
用于其他目的,例如标识信号“在这个板子上不可用”或指示错误。未接触底层
|
||||
硬件的代码会忽略这些整数。
|
||||
@ -115,7 +105,7 @@ FPGA 的特定板子上使用 80-95。编号不一定要连续,那些平台中
|
||||
|
||||
如果你要初始化一个带有无效 GPIO 编号的结构体,可以使用一些负编码
|
||||
(如"-EINVAL"),那将使其永远不会是有效。来测试这样一个结构体中的编号
|
||||
是否关联一个 GPIO,你可使用以下断言:
|
||||
是否关联一个 GPIO,你可使用以下断言::
|
||||
|
||||
int gpio_is_valid(int number);
|
||||
|
||||
@ -128,11 +118,12 @@ FPGA 的特定板子上使用 80-95。编号不一定要连续,那些平台中
|
||||
|
||||
使用 GPIO
|
||||
---------
|
||||
|
||||
对于一个 GPIO,系统应该做的第一件事情就是通过 gpio_request()
|
||||
函数分配它,见下文。
|
||||
|
||||
接下来是设置I/O方向,这通常是在板级启动代码中为所使用的 GPIO 设置
|
||||
platform_device 时完成。
|
||||
platform_device 时完成::
|
||||
|
||||
/* 设置为输入或输出, 返回 0 或负的错误代码 */
|
||||
int gpio_direction_input(unsigned gpio);
|
||||
@ -157,12 +148,13 @@ get/set(获取/设置)函数调用没法返回错误,且有可能是配置错误
|
||||
|
||||
|
||||
访问自旋锁安全的 GPIO
|
||||
-------------------
|
||||
---------------------
|
||||
|
||||
大多数 GPIO 控制器可以通过内存读/写指令来访问。这些指令不会休眠,可以
|
||||
安全地在硬(非线程)中断例程和类似的上下文中完成。
|
||||
|
||||
对于那些用 gpio_cansleep()测试总是返回失败的 GPIO(见下文),使用
|
||||
以下的函数访问:
|
||||
以下的函数访问::
|
||||
|
||||
/* GPIO 输入:返回零或非零 */
|
||||
int gpio_get_value(unsigned gpio);
|
||||
@ -188,17 +180,18 @@ GPIO值是布尔值,零表示低电平,非零表示高电平。当读取一
|
||||
|
||||
|
||||
访问可能休眠的 GPIO
|
||||
-----------------
|
||||
-------------------
|
||||
|
||||
某些 GPIO 控制器必须通过基于总线(如 I2C 或 SPI)的消息访问。读或写这些
|
||||
GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其反馈。期间需要
|
||||
休眠,这不能在 IRQ 例程(中断上下文)中执行。
|
||||
|
||||
支持此类 GPIO 的平台通过以下函数返回非零值来区分出这种 GPIO。(此函数需要
|
||||
一个之前通过 gpio_request 分配到的有效 GPIO 编号):
|
||||
一个之前通过 gpio_request 分配到的有效 GPIO 编号)::
|
||||
|
||||
int gpio_cansleep(unsigned gpio);
|
||||
|
||||
为了访问这种 GPIO,内核定义了一套不同的函数:
|
||||
为了访问这种 GPIO,内核定义了一套不同的函数::
|
||||
|
||||
/* GPIO 输入:返回零或非零 ,可能会休眠 */
|
||||
int gpio_get_value_cansleep(unsigned gpio);
|
||||
@ -214,25 +207,26 @@ GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其
|
||||
事实,这些处理例程实际上和自旋锁安全的函数是一样的。
|
||||
|
||||
** 除此之外 ** 调用设置和配置此类 GPIO 的函数也必须在允许休眠的上下文中,
|
||||
因为它们可能也需要访问 GPIO 控制器芯片: (这些设置函数通常在板级启动代码或者
|
||||
驱动探测/断开代码中,所以这是一个容易满足的约束条件。)
|
||||
因为它们可能也需要访问 GPIO 控制器芯片 (这些设置函数通常在板级启动代码或者
|
||||
驱动探测/断开代码中,所以这是一个容易满足的约束条件。) ::
|
||||
|
||||
gpio_direction_input()
|
||||
gpio_direction_output()
|
||||
gpio_request()
|
||||
gpio_direction_input()
|
||||
gpio_direction_output()
|
||||
gpio_request()
|
||||
|
||||
## gpio_request_one()
|
||||
## gpio_request_array()
|
||||
## gpio_free_array()
|
||||
## gpio_request_one()
|
||||
## gpio_request_array()
|
||||
## gpio_free_array()
|
||||
|
||||
gpio_free()
|
||||
gpio_set_debounce()
|
||||
gpio_free()
|
||||
gpio_set_debounce()
|
||||
|
||||
|
||||
|
||||
声明和释放 GPIO
|
||||
----------------------------
|
||||
为了有助于捕获系统配置错误,定义了两个函数。
|
||||
----------------
|
||||
|
||||
为了有助于捕获系统配置错误,定义了两个函数::
|
||||
|
||||
/* 申请 GPIO, 返回 0 或负的错误代码.
|
||||
* 非空标签可能有助于诊断.
|
||||
@ -256,9 +250,9 @@ GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其
|
||||
某些平台可能也使用 GPIO 作为电源管理激活信号(例如通过关闭未使用芯片区和
|
||||
简单地关闭未使用时钟)。
|
||||
|
||||
对于 GPIO 使用 pinctrl 子系统已知的引脚,子系统应该被告知其使用情况;
|
||||
对于 GPIO 使用引脚控制子系统已知的引脚,子系统应该被告知其使用情况;
|
||||
一个 gpiolib 驱动的 .request()操作应调用 pinctrl_gpio_request(),
|
||||
而 gpiolib 驱动的 .free()操作应调用 pinctrl_gpio_free()。pinctrl
|
||||
而 gpiolib 驱动的 .free()操作应调用 pinctrl_gpio_free()。引脚控制
|
||||
子系统允许 pinctrl_gpio_request()在某个引脚或引脚组以复用形式“属于”
|
||||
一个设备时都成功返回。
|
||||
|
||||
@ -270,7 +264,7 @@ GPIO 值的命令需要等待其信息排到队首才发送命令,再获得其
|
||||
|
||||
某些平台允许部分或所有 GPIO 信号使用不同的引脚。类似的,GPIO 或引脚的
|
||||
其他方面也需要配置,如上拉/下拉。平台软件应该在对这些 GPIO 调用
|
||||
gpio_request()前将这类细节配置好,例如使用 pinctrl 子系统的映射表,
|
||||
gpio_request()前将这类细节配置好,例如使用引脚控制子系统的映射表,
|
||||
使得 GPIO 的用户无须关注这些细节。
|
||||
|
||||
还有一个值得注意的是在释放 GPIO 前,你必须停止使用它。
|
||||
@ -278,7 +272,7 @@ gpio_request()前将这类细节配置好,例如使用 pinctrl 子系统的映
|
||||
|
||||
注意:申请一个 GPIO 并没有以任何方式配置它,只不过标识那个 GPIO 处于使用
|
||||
状态。必须有另外的代码来处理引脚配置(如控制 GPIO 使用的引脚、上拉/下拉)。
|
||||
考虑到大多数情况下声明 GPIO 之后就会立即配置它们,所以定义了以下三个辅助函数:
|
||||
考虑到大多数情况下声明 GPIO 之后就会立即配置它们,所以定义了以下三个辅助函数::
|
||||
|
||||
/* 申请一个 GPIO 信号, 同时通过特定的'flags'初始化配置,
|
||||
* 其他和 gpio_request()的参数和返回值相同
|
||||
@ -326,7 +320,7 @@ gpio_request()前将这类细节配置好,例如使用 pinctrl 子系统的映
|
||||
将来这些标志可能扩展到支持更多的属性。
|
||||
|
||||
更进一步,为了更简单地声明/释放多个 GPIO,'struct gpio'被引进来封装所有
|
||||
这三个领域:
|
||||
这三个领域::
|
||||
|
||||
struct gpio {
|
||||
unsigned gpio;
|
||||
@ -334,7 +328,7 @@ gpio_request()前将这类细节配置好,例如使用 pinctrl 子系统的映
|
||||
const char *label;
|
||||
};
|
||||
|
||||
一个典型的用例:
|
||||
一个典型的用例::
|
||||
|
||||
static struct gpio leds_gpios[] = {
|
||||
{ 32, GPIOF_OUT_INIT_HIGH, "Power LED" }, /* 默认开启 */
|
||||
@ -356,9 +350,10 @@ gpio_request()前将这类细节配置好,例如使用 pinctrl 子系统的映
|
||||
|
||||
|
||||
GPIO 映射到 IRQ
|
||||
--------------------
|
||||
----------------
|
||||
|
||||
GPIO 编号是无符号整数;IRQ 编号也是。这些构成了两个逻辑上不同的命名空间
|
||||
(GPIO 0 不一定使用 IRQ 0)。你可以通过以下函数在它们之间实现映射:
|
||||
(GPIO 0 不一定使用 IRQ 0)。你可以通过以下函数在它们之间实现映射::
|
||||
|
||||
/* 映射 GPIO 编号到 IRQ 编号 */
|
||||
int gpio_to_irq(unsigned gpio);
|
||||
@ -384,7 +379,8 @@ irq_to_gpio()返回的非错误值大多数通常可以被 gpio_get_value()所
|
||||
|
||||
|
||||
模拟开漏信号
|
||||
----------------------------
|
||||
------------
|
||||
|
||||
有时在只有低电平信号作为实际驱动结果(译者注:多个输出连接于一点,逻辑电平
|
||||
结果为所有输出的逻辑与)的时候,共享的信号线需要使用“开漏”信号。(该术语
|
||||
适用于 CMOS 管;而 TTL 用“集电极开路”。)一个上拉电阻使信号为高电平。这
|
||||
@ -408,9 +404,44 @@ irq_to_gpio()返回的非错误值大多数通常可以被 gpio_get_value()所
|
||||
这不一定是错误的。一个常见的例子就是 I2C 时钟的延长:一个需要较慢时钟的
|
||||
从设备延迟 SCK 的上升沿,而 I2C 主设备相应地调整其信号传输速率。
|
||||
|
||||
GPIO控制器和引脚控制子系统
|
||||
--------------------------
|
||||
|
||||
SOC上的GPIO控制器可能与引脚控制子系统紧密结合,即引脚可以与可选的gpio功
|
||||
能一起被其他功能使用。我们已经涵盖了这样的情况,例如一个GPIO控制器需要保
|
||||
留一个引脚或通过调用以下任何一个引脚来设置其方向::
|
||||
|
||||
pinctrl_gpio_request()
|
||||
pinctrl_gpio_free()
|
||||
pinctrl_gpio_direction_input()
|
||||
pinctrl_gpio_direction_output()
|
||||
|
||||
但是,引脚控制子系统是如何将GPIO号码(这是一个全局事项)与某个引脚控制器
|
||||
上的某个引脚交叉关联的?
|
||||
|
||||
这是通过注册引脚的“范围”来实现的,这基本上是交叉参考表。这些描述是在
|
||||
Documentation/driver-api/pin-control.rst
|
||||
|
||||
虽然引脚分配完全由引脚控制子系统管理,但gpio(在gpiolib下)仍由gpio驱动
|
||||
维护。可能发生的情况是,SoC中的不同引脚范围由不同的gpio驱动器管理。
|
||||
|
||||
这使得在调用 "pinctrl_gpio_request" 之前,让gpio驱动向pin ctrl子系
|
||||
统宣布它们的引脚范围是合理的,以便在使用任何gpio之前要求引脚控制子系统准
|
||||
备相应的引脚。
|
||||
|
||||
为此,gpio控制器可以用引脚控制子系统注册其引脚范围。目前有两种方法:有或
|
||||
无DT。
|
||||
|
||||
关于对DT的支持,请参考 Documentation/devicetree/bindings/gpio/gpio.txt.
|
||||
|
||||
对于非DT支持,用户可以用适当的参数调用gpiochip_add_pin_range(),将一
|
||||
系列的gpio引脚注册到引脚控制驱动上。为此,必须将引脚控制设备的名称字符串
|
||||
作为参数之一传给这个程序。
|
||||
|
||||
|
||||
这些公约忽略了什么?
|
||||
====================
|
||||
|
||||
这些公约忽略了什么?
|
||||
================
|
||||
这些公约忽略的最大一件事就是引脚复用,因为这属于高度芯片特定的属性且
|
||||
没有可移植性。某个平台可能不需要明确的复用信息;有的对于任意给定的引脚
|
||||
可能只有两个功能选项;有的可能每个引脚有八个功能选项;有的可能可以将
|
||||
@ -433,8 +464,9 @@ Linux 的系统。)
|
||||
当前,动态定义 GPIO 并不是标准的,例如作为配置一个带有某些 GPIO 扩展器的
|
||||
附加电路板的副作用。
|
||||
|
||||
GPIO 实现者的框架 (可选)
|
||||
=====================
|
||||
GPIO 实现者的框架(可选)
|
||||
=========================
|
||||
|
||||
前面提到了,有一个可选的实现框架,让平台使用相同的编程接口,更加简单地支持
|
||||
不同种类的 GPIO 控制器。这个框架称为"gpiolib"。
|
||||
|
||||
@ -444,15 +476,16 @@ GPIO 实现者的框架 (可选)
|
||||
|
||||
|
||||
控制器驱动: gpio_chip
|
||||
-------------------
|
||||
---------------------
|
||||
|
||||
在框架中每个 GPIO 控制器都包装为一个 "struct gpio_chip",他包含了
|
||||
该类型的每个控制器的常用信息:
|
||||
|
||||
- 设置 GPIO 方向的方法
|
||||
- 用于访问 GPIO 值的方法
|
||||
- 告知调用其方法是否可能休眠的标志
|
||||
- 可选的 debugfs 信息导出方法 (显示类似上拉配置一样的额外状态)
|
||||
- 诊断标签
|
||||
- 设置 GPIO 方向的方法
|
||||
- 用于访问 GPIO 值的方法
|
||||
- 告知调用其方法是否可能休眠的标志
|
||||
- 可选的 debugfs 信息导出方法 (显示类似上拉配置一样的额外状态)
|
||||
- 诊断标签
|
||||
|
||||
也包含了来自 device.platform_data 的每个实例的数据:它第一个 GPIO 的
|
||||
编号和它可用的 GPIO 的数量。
|
||||
@ -471,7 +504,8 @@ GPIO 实现者的框架 (可选)
|
||||
|
||||
|
||||
平台支持
|
||||
-------
|
||||
--------
|
||||
|
||||
为了支持这个框架,一个平台的 Kconfig 文件将会 "select"(选择)
|
||||
ARCH_REQUIRE_GPIOLIB 或 ARCH_WANT_OPTIONAL_GPIOLIB,并让它的
|
||||
<asm/gpio.h> 包含 <asm-generic/gpio.h>,同时定义三个方法:
|
||||
@ -489,7 +523,7 @@ ARCH_WANT_OPTIONAL_GPIOLIB 意味着 gpiolib 核心默认关闭,且用户可以
|
||||
如果这些选项都没被选择,该平台就不通过 GPIO-lib 支持 GPIO,且代码不可以
|
||||
被用户使能。
|
||||
|
||||
以下这些方法的实现可以直接使用框架代码,并总是通过 gpio_chip 调度:
|
||||
以下这些方法的实现可以直接使用框架代码,并总是通过 gpio_chip 调度::
|
||||
|
||||
#define gpio_get_value __gpio_get_value
|
||||
#define gpio_set_value __gpio_set_value
|
||||
@ -508,7 +542,8 @@ arch_initcall()或者更早的地方集成进平台初始化代码,使这些 G
|
||||
且他们通常可以作为 IRQ 使用。
|
||||
|
||||
板级支持
|
||||
-------
|
||||
--------
|
||||
|
||||
对于外部 GPIO 控制器(例如 I2C 或 SPI 扩展器、专用芯片、多功能器件、FPGA
|
||||
或 CPLD),大多数常用板级特定代码都可以注册控制器设备,并保证他们的驱动知道
|
||||
gpiochip_add()所使用的 GPIO 编号。他们的起始编号通常跟在平台特定的 GPIO
|
||||
@ -526,8 +561,9 @@ GPIO 可以工作之后才可被注册。解决这类依赖的的一种方法是
|
||||
设备变成无效时移除它们。
|
||||
|
||||
|
||||
用户空间的 Sysfs 接口(可选)
|
||||
========================
|
||||
用户空间的 Sysfs 接口(可选)
|
||||
=============================
|
||||
|
||||
使用“gpiolib”实现框架的平台可以选择配置一个 GPIO 的 sysfs 用户接口。
|
||||
这不同于 debugfs 接口,因为它提供的是对 GPIO方向和值的控制,而不只显示
|
||||
一个GPIO 的状态摘要。此外,它可以出现在没有调试支持的产品级系统中。
|
||||
@ -548,6 +584,7 @@ GPIO 可以工作之后才可被注册。解决这类依赖的的一种方法是
|
||||
|
||||
Sysfs 中的路径
|
||||
--------------
|
||||
|
||||
在/sys/class/gpio 中有 3 类入口:
|
||||
|
||||
- 用于在用户空间控制 GPIO 的控制接口;
|
||||
@ -625,8 +662,9 @@ GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
|
||||
|
||||
|
||||
从内核代码中导出
|
||||
-------------
|
||||
内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出:
|
||||
----------------
|
||||
|
||||
内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出::
|
||||
|
||||
/* 导出 GPIO 到用户空间 */
|
||||
int gpio_export(unsigned gpio, bool direction_may_change);
|
||||
@ -648,3 +686,9 @@ GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
|
||||
在 GPIO 被导出之后,gpio_export_link()允许在 sysfs 文件系统的任何地方
|
||||
创建一个到这个 GPIO sysfs 节点的符号链接。这样驱动就可以通过一个描述性的
|
||||
名字,在 sysfs 中他们所拥有的设备下提供一个(到这个 GPIO sysfs 节点的)接口。
|
||||
|
||||
|
||||
API参考
|
||||
=======
|
||||
|
||||
本节中列出的函数已被废弃。在新的代码中应该使用基于GPIO描述符的API。
|
132
Documentation/translations/zh_CN/driver-api/index.rst
Normal file
132
Documentation/translations/zh_CN/driver-api/index.rst
Normal file
@ -0,0 +1,132 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/driver-api/index.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
========================
|
||||
Linux驱动实现者的API指南
|
||||
========================
|
||||
|
||||
内核提供了各种各样的接口来支持设备驱动的开发。这份文档只是对其中一些接口进行了
|
||||
一定程度的整理——希望随着时间的推移,它能变得更好!可用的小节可以在下面看到。
|
||||
|
||||
.. class:: toc-title
|
||||
|
||||
目录列表:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
gpio/index
|
||||
io_ordering
|
||||
|
||||
Todolist:
|
||||
|
||||
* driver-model/index
|
||||
* basics
|
||||
* infrastructure
|
||||
* ioctl
|
||||
* early-userspace/index
|
||||
* pm/index
|
||||
* clk
|
||||
* device-io
|
||||
* dma-buf
|
||||
* device_link
|
||||
* component
|
||||
* message-based
|
||||
* infiniband
|
||||
* aperture
|
||||
* frame-buffer
|
||||
* regulator
|
||||
* reset
|
||||
* iio/index
|
||||
* input
|
||||
* usb/index
|
||||
* firewire
|
||||
* pci/index
|
||||
* cxl/index
|
||||
* spi
|
||||
* i2c
|
||||
* ipmb
|
||||
* ipmi
|
||||
* i3c/index
|
||||
* interconnect
|
||||
* devfreq
|
||||
* hsi
|
||||
* edac
|
||||
* scsi
|
||||
* libata
|
||||
* target
|
||||
* mailbox
|
||||
* mtdnand
|
||||
* miscellaneous
|
||||
* mei/index
|
||||
* mtd/index
|
||||
* mmc/index
|
||||
* nvdimm/index
|
||||
* w1
|
||||
* rapidio/index
|
||||
* s390-drivers
|
||||
* vme
|
||||
* 80211/index
|
||||
* uio-howto
|
||||
* firmware/index
|
||||
* pin-control
|
||||
* md/index
|
||||
* media/index
|
||||
* misc_devices
|
||||
* nfc/index
|
||||
* dmaengine/index
|
||||
* slimbus
|
||||
* soundwire/index
|
||||
* thermal/index
|
||||
* fpga/index
|
||||
* acpi/index
|
||||
* auxiliary_bus
|
||||
* backlight/lp855x-driver.rst
|
||||
* connector
|
||||
* console
|
||||
* dcdbas
|
||||
* eisa
|
||||
* isa
|
||||
* isapnp
|
||||
* io-mapping
|
||||
* generic-counter
|
||||
* memory-devices/index
|
||||
* men-chameleon-bus
|
||||
* ntb
|
||||
* nvmem
|
||||
* parport-lowlevel
|
||||
* pps
|
||||
* ptp
|
||||
* phy/index
|
||||
* pwm
|
||||
* pldmfw/index
|
||||
* rfkill
|
||||
* serial/index
|
||||
* sm501
|
||||
* surface_aggregator/index
|
||||
* switchtec
|
||||
* sync_file
|
||||
* tty/index
|
||||
* vfio-mediated-device
|
||||
* vfio
|
||||
* vfio-pci-device-specific-driver-acceptance
|
||||
* xilinx/index
|
||||
* xillybus
|
||||
* zorro
|
||||
* hte/index
|
||||
|
||||
.. only:: subproject and html
|
||||
|
||||
Indices
|
||||
=======
|
||||
|
||||
* :ref:`genindex`
|
60
Documentation/translations/zh_CN/driver-api/io_ordering.rst
Normal file
60
Documentation/translations/zh_CN/driver-api/io_ordering.rst
Normal file
@ -0,0 +1,60 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/driver-api/io_ordering.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
林永听 Lin Yongting <linyongting@gmail.com>
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
===========================
|
||||
对内存映射地址的I/O写入排序
|
||||
===========================
|
||||
|
||||
在某些平台上,所谓的内存映射I/O是弱顺序。在这些平台上,驱动开发者有责任
|
||||
保证I/O内存映射地址的写操作按程序图意的顺序达到设备。通常读取一个“安全”
|
||||
设备寄存器或桥寄存器,触发IO芯片清刷未处理的写操作到达设备后才处理读操作,
|
||||
而达到保证目的。驱动程序通常在spinlock保护的临界区退出之前使用这种技术。
|
||||
这也可以保证后面的写操作只在前面的写操作之后到达设备(这非常类似于内存
|
||||
屏障操作,mb(),不过仅适用于I/O)。
|
||||
|
||||
假设一个设备驱动程的具体例子::
|
||||
|
||||
...
|
||||
CPU A: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU A: val = readl(my_status);
|
||||
CPU A: ...
|
||||
CPU A: writel(newval, ring_ptr);
|
||||
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
CPU B: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU B: val = readl(my_status);
|
||||
CPU B: ...
|
||||
CPU B: writel(newval2, ring_ptr);
|
||||
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
|
||||
上述例子中,设备可能会先接收到newval2的值,然后接收到newval的值,问题就
|
||||
发生了。不过很容易通过下面方法来修复::
|
||||
|
||||
...
|
||||
CPU A: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU A: val = readl(my_status);
|
||||
CPU A: ...
|
||||
CPU A: writel(newval, ring_ptr);
|
||||
CPU A: (void)readl(safe_register); /* 配置寄存器?*/
|
||||
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
CPU B: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU B: val = readl(my_status);
|
||||
CPU B: ...
|
||||
CPU B: writel(newval2, ring_ptr);
|
||||
CPU B: (void)readl(safe_register); /* 配置寄存器?*/
|
||||
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
|
||||
在解决方案中,读取safe_register寄存器,触发IO芯片清刷未处理的写操作,
|
||||
再处理后面的读操作,防止引发数据不一致问题。
|
@ -108,6 +108,7 @@ TODOList:
|
||||
:maxdepth: 2
|
||||
|
||||
core-api/index
|
||||
driver-api/index
|
||||
locking/index
|
||||
accounting/index
|
||||
cpu-freq/index
|
||||
@ -120,10 +121,10 @@ TODOList:
|
||||
scheduler/index
|
||||
mm/index
|
||||
peci/index
|
||||
PCI/index
|
||||
|
||||
TODOList:
|
||||
|
||||
* driver-api/index
|
||||
* block/index
|
||||
* cdrom/index
|
||||
* ide/index
|
||||
@ -148,7 +149,6 @@ TODOList:
|
||||
* crypto/index
|
||||
* bpf/index
|
||||
* usb/index
|
||||
* PCI/index
|
||||
* scsi/index
|
||||
* misc-devices/index
|
||||
* mhi/index
|
||||
|
@ -1,67 +0,0 @@
|
||||
Chinese translated version of Documentation/driver-api/io_ordering.rst
|
||||
|
||||
If you have any comment or update to the content, please contact the
|
||||
original document maintainer directly. However, if you have a problem
|
||||
communicating in English you can also ask the Chinese maintainer for
|
||||
help. Contact the Chinese maintainer if this translation is outdated
|
||||
or if there is a problem with the translation.
|
||||
|
||||
Chinese maintainer: Lin Yongting <linyongting@gmail.com>
|
||||
---------------------------------------------------------------------
|
||||
Documentation/driver-api/io_ordering.rst 的中文翻译
|
||||
|
||||
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
||||
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
||||
译存在问题,请联系中文版维护者。
|
||||
|
||||
中文版维护者: 林永听 Lin Yongting <linyongting@gmail.com>
|
||||
中文版翻译者: 林永听 Lin Yongting <linyongting@gmail.com>
|
||||
中文版校译者: 林永听 Lin Yongting <linyongting@gmail.com>
|
||||
|
||||
|
||||
以下为正文
|
||||
---------------------------------------------------------------------
|
||||
|
||||
在某些平台上,所谓的内存映射I/O是弱顺序。在这些平台上,驱动开发者有责任
|
||||
保证I/O内存映射地址的写操作按程序图意的顺序达到设备。通常读取一个“安全”
|
||||
设备寄存器或桥寄存器,触发IO芯片清刷未处理的写操作到达设备后才处理读操作,
|
||||
而达到保证目的。驱动程序通常在spinlock保护的临界区退出之前使用这种技术。
|
||||
这也可以保证后面的写操作只在前面的写操作之后到达设备(这非常类似于内存
|
||||
屏障操作,mb(),不过仅适用于I/O)。
|
||||
|
||||
假设一个设备驱动程的具体例子:
|
||||
|
||||
...
|
||||
CPU A: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU A: val = readl(my_status);
|
||||
CPU A: ...
|
||||
CPU A: writel(newval, ring_ptr);
|
||||
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
CPU B: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU B: val = readl(my_status);
|
||||
CPU B: ...
|
||||
CPU B: writel(newval2, ring_ptr);
|
||||
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
|
||||
上述例子中,设备可能会先接收到newval2的值,然后接收到newval的值,问题就
|
||||
发生了。不过很容易通过下面方法来修复:
|
||||
|
||||
...
|
||||
CPU A: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU A: val = readl(my_status);
|
||||
CPU A: ...
|
||||
CPU A: writel(newval, ring_ptr);
|
||||
CPU A: (void)readl(safe_register); /* 配置寄存器?*/
|
||||
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
...
|
||||
CPU B: spin_lock_irqsave(&dev_lock, flags)
|
||||
CPU B: val = readl(my_status);
|
||||
CPU B: ...
|
||||
CPU B: writel(newval2, ring_ptr);
|
||||
CPU B: (void)readl(safe_register); /* 配置寄存器?*/
|
||||
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
|
||||
|
||||
在解决方案中,读取safe_register寄存器,触发IO芯片清刷未处理的写操作,
|
||||
再处理后面的读操作,防止引发数据不一致问题。
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user