We need the char/misc driver fixes in here as well.
Unified · Split
| @@ -86,6 +86,8 @@ ForEachMacros: · 85 unmodified lines | ||
| 86 | 86 | - 'bio_for_each_segment_all' |
| 87 | 87 | - 'bio_list_for_each' |
| 88 | 88 | - 'bip_for_each_vec' |
| 89 | + - 'bitmap_for_each_clear_region' | |
| 90 | + - 'bitmap_for_each_set_region' | |
| 89 | 91 | - 'blkg_for_each_descendant_post' |
| 90 | 92 | - 'blkg_for_each_descendant_pre' |
| 91 | 93 | - 'blk_queue_for_each_rl' |
| @@ -115,6 +117,7 @@ ForEachMacros: · 23 unmodified lines | ||
| 115 | 117 | - 'drm_client_for_each_connector_iter' |
| 116 | 118 | - 'drm_client_for_each_modeset' |
| 117 | 119 | - 'drm_connector_for_each_possible_encoder' |
| 120 | + - 'drm_for_each_bridge_in_chain' | |
| 118 | 121 | - 'drm_for_each_connector_iter' |
| 119 | 122 | - 'drm_for_each_crtc' |
| 120 | 123 | - 'drm_for_each_encoder' |
| @@ -136,9 +139,10 @@ ForEachMacros: · 15 unmodified lines | ||
| 136 | 139 | - 'for_each_bio' |
| 137 | 140 | - 'for_each_board_func_rsrc' |
| 138 | 141 | - 'for_each_bvec' |
| 142 | + - 'for_each_card_auxs' | |
| 143 | + - 'for_each_card_auxs_safe' | |
| 139 | 144 | - 'for_each_card_components' |
| 140 | − - 'for_each_card_links' | |
| 141 | − - 'for_each_card_links_safe' | |
| 145 | + - 'for_each_card_pre_auxs' | |
| 142 | 146 | - 'for_each_card_prelinks' |
| 143 | 147 | - 'for_each_card_rtds' |
| 144 | 148 | - 'for_each_card_rtds_safe' |
| @@ -166,6 +170,7 @@ ForEachMacros: · 21 unmodified lines | ||
| 166 | 170 | - 'for_each_dpcm_fe' |
| 167 | 171 | - 'for_each_drhd_unit' |
| 168 | 172 | - 'for_each_dss_dev' |
| 173 | + - 'for_each_efi_handle' | |
| 169 | 174 | - 'for_each_efi_memory_desc' |
| 170 | 175 | - 'for_each_efi_memory_desc_in_map' |
| 171 | 176 | - 'for_each_element' |
| @@ -190,6 +195,7 @@ ForEachMacros: · 18 unmodified lines | ||
| 190 | 195 | - 'for_each_lru' |
| 191 | 196 | - 'for_each_matching_node' |
| 192 | 197 | - 'for_each_matching_node_and_match' |
| 198 | + - 'for_each_member' | |
| 193 | 199 | - 'for_each_memblock' |
| 194 | 200 | - 'for_each_memblock_type' |
| 195 | 201 | - 'for_each_memcg_cache_index' |
| @@ -200,9 +206,11 @@ ForEachMacros: · 4 unmodified lines | ||
| 200 | 206 | - 'for_each_msi_entry' |
| 201 | 207 | - 'for_each_msi_entry_safe' |
| 202 | 208 | - 'for_each_net' |
| 209 | + - 'for_each_net_continue_reverse' | |
| 203 | 210 | - 'for_each_netdev' |
| 204 | 211 | - 'for_each_netdev_continue' |
| 205 | 212 | - 'for_each_netdev_continue_rcu' |
| 213 | + - 'for_each_netdev_continue_reverse' | |
| 206 | 214 | - 'for_each_netdev_feature' |
| 207 | 215 | - 'for_each_netdev_in_bond_rcu' |
| 208 | 216 | - 'for_each_netdev_rcu' |
| @@ -254,10 +262,10 @@ ForEachMacros: · 45 unmodified lines | ||
| 254 | 262 | - 'for_each_reserved_mem_region' |
| 255 | 263 | - 'for_each_rtd_codec_dai' |
| 256 | 264 | - 'for_each_rtd_codec_dai_rollback' |
| 257 | − - 'for_each_rtdcom' | |
| 258 | − - 'for_each_rtdcom_safe' | |
| 265 | + - 'for_each_rtd_components' | |
| 259 | 266 | - 'for_each_set_bit' |
| 260 | 267 | - 'for_each_set_bit_from' |
| 268 | + - 'for_each_set_clump8' | |
| 261 | 269 | - 'for_each_sg' |
| 262 | 270 | - 'for_each_sg_dma_page' |
| 263 | 271 | - 'for_each_sg_page' |
| @@ -267,6 +275,7 @@ ForEachMacros: · 3 unmodified lines | ||
| 267 | 275 | - 'for_each_subelement_id' |
| 268 | 276 | - '__for_each_thread' |
| 269 | 277 | - 'for_each_thread' |
| 278 | + - 'for_each_wakeup_source' | |
| 270 | 279 | - 'for_each_zone' |
| 271 | 280 | - 'for_each_zone_zonelist' |
| 272 | 281 | - 'for_each_zone_zonelist_nodemask' |
| @@ -330,6 +339,7 @@ ForEachMacros: · 57 unmodified lines | ||
| 330 | 339 | - 'list_for_each' |
| 331 | 340 | - 'list_for_each_codec' |
| 332 | 341 | - 'list_for_each_codec_safe' |
| 342 | + - 'list_for_each_continue' | |
| 333 | 343 | - 'list_for_each_entry' |
| 334 | 344 | - 'list_for_each_entry_continue' |
| 335 | 345 | - 'list_for_each_entry_continue_rcu' |
| @@ -351,6 +361,7 @@ ForEachMacros: · 15 unmodified lines | ||
| 351 | 361 | - 'llist_for_each_entry' |
| 352 | 362 | - 'llist_for_each_entry_safe' |
| 353 | 363 | - 'llist_for_each_safe' |
| 364 | + - 'mci_for_each_dimm' | |
| 354 | 365 | - 'media_device_for_each_entity' |
| 355 | 366 | - 'media_device_for_each_intf' |
| 356 | 367 | - 'media_device_for_each_link' |
| @@ -444,10 +455,16 @@ ForEachMacros: · 87 unmodified lines | ||
| 444 | 455 | - 'virtio_device_for_each_vq' |
| 445 | 456 | - 'xa_for_each' |
| 446 | 457 | - 'xa_for_each_marked' |
| 458 | + - 'xa_for_each_range' | |
| 447 | 459 | - 'xa_for_each_start' |
| 448 | 460 | - 'xas_for_each' |
| 449 | 461 | - 'xas_for_each_conflict' |
| 450 | 462 | - 'xas_for_each_marked' |
| 463 | + - 'xbc_array_for_each_value' | |
| 464 | + - 'xbc_for_each_key_value' | |
| 465 | + - 'xbc_node_for_each_array_value' | |
| 466 | + - 'xbc_node_for_each_child' | |
| 467 | + - 'xbc_node_for_each_key_value' | |
| 451 | 468 | - 'zorro_for_each_dev' |
| 452 | 469 | |
| 453 | 470 | #IncludeBlocks: Preserve # Unknown to clang-format-5.0 |
| @@ -110,6 +110,8 @@ stable kernels. · 109 unmodified lines | ||
| 110 | 110 | +----------------+-----------------+-----------------+-----------------------------+ |
| 111 | 111 | | Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 | |
| 112 | 112 | +----------------+-----------------+-----------------+-----------------------------+ |
| 113 | +| Cavium | ThunderX GICv3 | #38539 | N/A | | |
| 114 | ++----------------+-----------------+-----------------+-----------------------------+ | |
| 113 | 115 | | Cavium | ThunderX Core | #27456 | CAVIUM_ERRATUM_27456 | |
| 114 | 116 | +----------------+-----------------+-----------------+-----------------------------+ |
| 115 | 117 | | Cavium | ThunderX Core | #30115 | CAVIUM_ERRATUM_30115 | |
| @@ -110,6 +110,13 @@ PROPERTIES · 109 unmodified lines | ||
| 110 | 110 | Usage: required |
| 111 | 111 | Definition: See soc/fsl/qman.txt and soc/fsl/bman.txt |
| 112 | 112 | |
| 113 | +- fsl,erratum-a050385 | |
| 114 | + Usage: optional | |
| 115 | + Value type: boolean | |
| 116 | + Definition: A boolean property. Indicates the presence of the | |
| 117 | + erratum A050385 which indicates that DMA transactions that are | |
| 118 | + split can result in a FMan lock. | |
| 119 | + | |
| 113 | 120 | ============================================================================= |
| 114 | 121 | FMan MURAM Node |
| 115 | 122 | |
| @@ -850,3 +850,11 @@ business doing so. · 849 unmodified lines | ||
| 850 | 850 | d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are |
| 851 | 851 | very suspect (and won't work in modules). Such uses are very likely to |
| 852 | 852 | be misspelled d_alloc_anon(). |
| 853 | + | |
| 854 | +--- | |
| 855 | + | |
| 856 | +**mandatory** | |
| 857 | + | |
| 858 | +[should've been added in 2016] stale comment in finish_open() nonwithstanding, | |
| 859 | +failure exits in ->atomic_open() instances should *NOT* fput() the file, | |
| 860 | +no matter what. Everything is handled by the caller. | |
| @@ -237,7 +237,7 @@ This is solely useful to speed up test compiles. · 236 unmodified lines | ||
| 237 | 237 | KBUILD_EXTRA_SYMBOLS |
| 238 | 238 | -------------------- |
| 239 | 239 | For modules that use symbols from other modules. |
| 240 | −See more details in modules.txt. | |
| 240 | +See more details in modules.rst. | |
| 241 | 241 | |
| 242 | 242 | ALLSOURCE_ARCHS |
| 243 | 243 | --------------- |
| @@ -44,7 +44,7 @@ intermediate:: · 43 unmodified lines | ||
| 44 | 44 | def_bool y |
| 45 | 45 | |
| 46 | 46 | Then, Kconfig moves onto the evaluation stage to resolve inter-symbol |
| 47 | −dependency as explained in kconfig-language.txt. | |
| 47 | +dependency as explained in kconfig-language.rst. | |
| 48 | 48 | |
| 49 | 49 | |
| 50 | 50 | Variables |
| @@ -924,7 +924,7 @@ When kbuild executes, the following steps are followed (roughly): · 923 unmodified lines | ||
| 924 | 924 | $(KBUILD_AFLAGS_MODULE) is used to add arch-specific options that |
| 925 | 925 | are used for assembler. |
| 926 | 926 | |
| 927 | − From commandline AFLAGS_MODULE shall be used (see kbuild.txt). | |
| 927 | + From commandline AFLAGS_MODULE shall be used (see kbuild.rst). | |
| 928 | 928 | |
| 929 | 929 | KBUILD_CFLAGS_KERNEL |
| 930 | 930 | $(CC) options specific for built-in |
| @@ -937,7 +937,7 @@ When kbuild executes, the following steps are followed (roughly): · 6 unmodified lines | ||
| 937 | 937 | |
| 938 | 938 | $(KBUILD_CFLAGS_MODULE) is used to add arch-specific options that |
| 939 | 939 | are used for $(CC). |
| 940 | − From commandline CFLAGS_MODULE shall be used (see kbuild.txt). | |
| 940 | + From commandline CFLAGS_MODULE shall be used (see kbuild.rst). | |
| 941 | 941 | |
| 942 | 942 | KBUILD_LDFLAGS_MODULE |
| 943 | 943 | Options for $(LD) when linking modules |
| @@ -945,7 +945,7 @@ When kbuild executes, the following steps are followed (roughly): · 1 unmodified line | ||
| 945 | 945 | $(KBUILD_LDFLAGS_MODULE) is used to add arch-specific options |
| 946 | 946 | used when linking modules. This is often a linker script. |
| 947 | 947 | |
| 948 | − From commandline LDFLAGS_MODULE shall be used (see kbuild.txt). | |
| 948 | + From commandline LDFLAGS_MODULE shall be used (see kbuild.rst). | |
| 949 | 949 | |
| 950 | 950 | KBUILD_LDS |
| 951 | 951 | |
| @@ -470,9 +470,9 @@ build. · 469 unmodified lines | ||
| 470 | 470 | |
| 471 | 471 | The syntax of the Module.symvers file is:: |
| 472 | 472 | |
| 473 | − <CRC> <Symbol> <Namespace> <Module> <Export Type> | |
| 473 | + <CRC> <Symbol> <Module> <Export Type> <Namespace> | |
| 474 | 474 | |
| 475 | − 0xe1cc2a05 usb_stor_suspend USB_STORAGE drivers/usb/storage/usb-storage EXPORT_SYMBOL_GPL | |
| 475 | + 0xe1cc2a05 usb_stor_suspend drivers/usb/storage/usb-storage EXPORT_SYMBOL_GPL USB_STORAGE | |
| 476 | 476 | |
| 477 | 477 | The fields are separated by tabs and values may be empty (e.g. |
| 478 | 478 | if no namespace is defined for an exported symbol). |
| @@ -40,9 +40,6 @@ example usage · 39 unmodified lines | ||
| 40 | 40 | # Delete a snapshot using: |
| 41 | 41 | $ devlink region del pci/0000:00:05.0/cr-space snapshot 1 |
| 42 | 42 | |
| 43 | − # Trigger (request) a snapshot be taken: | |
| 44 | − $ devlink region trigger pci/0000:00:05.0/cr-space | |
| 45 | − | |
| 46 | 43 | # Dump a snapshot: |
| 47 | 44 | $ devlink region dump pci/0000:00:05.0/fw-health snapshot 1 |
| 48 | 45 | 0000000000000000 0014 95dc 0014 9514 0035 1670 0034 db30 |
| @@ -8,9 +8,9 @@ Overview · 7 unmodified lines | ||
| 8 | 8 | ======== |
| 9 | 9 | |
| 10 | 10 | The net_failover driver provides an automated failover mechanism via APIs |
| 11 | −to create and destroy a failover master netdev and mananges a primary and | |
| 11 | +to create and destroy a failover master netdev and manages a primary and | |
| 12 | 12 | standby slave netdevs that get registered via the generic failover |
| 13 | −infrastructrure. | |
| 13 | +infrastructure. | |
| 14 | 14 | |
| 15 | 15 | The failover netdev acts a master device and controls 2 slave devices. The |
| 16 | 16 | original paravirtual interface is registered as 'standby' slave netdev and |
| @@ -29,7 +29,7 @@ virtio-net accelerated datapath: STANDBY mode · 12 unmodified lines | ||
| 29 | 29 | ============================================= |
| 30 | 30 | |
| 31 | 31 | net_failover enables hypervisor controlled accelerated datapath to virtio-net |
| 32 | −enabled VMs in a transparent manner with no/minimal guest userspace chanages. | |
| 32 | +enabled VMs in a transparent manner with no/minimal guest userspace changes. | |
| 33 | 33 | |
| 34 | 34 | To support this, the hypervisor needs to enable VIRTIO_NET_F_STANDBY |
| 35 | 35 | feature on the virtio-net interface and assign the same MAC address to both |
| @@ -159,7 +159,7 @@ Socket Interface · 158 unmodified lines | ||
| 159 | 159 | set SO_RDS_TRANSPORT on a socket for which the transport has |
| 160 | 160 | been previously attached explicitly (by SO_RDS_TRANSPORT) or |
| 161 | 161 | implicitly (via bind(2)) will return an error of EOPNOTSUPP. |
| 162 | − An attempt to set SO_RDS_TRANSPPORT to RDS_TRANS_NONE will | |
| 162 | + An attempt to set SO_RDS_TRANSPORT to RDS_TRANS_NONE will | |
| 163 | 163 | always return EINVAL. |
| 164 | 164 | |
| 165 | 165 | RDMA for RDS |
| @@ -4076,7 +4076,6 @@ F: drivers/scsi/snic/ · 4075 unmodified lines | ||
| 4076 | 4076 | CISCO VIC ETHERNET NIC DRIVER |
| 4077 | 4077 | M: Christian Benvenuti <benve@cisco.com> |
| 4078 | 4078 | M: Govindarajulu Varadarajan <_govind@gmx.com> |
| 4079 | −M: Parvi Kaustubhi <pkaustub@cisco.com> | |
| 4080 | 4079 | S: Supported |
| 4081 | 4080 | F: drivers/net/ethernet/cisco/enic/ |
| 4082 | 4081 | |
| @@ -4575,7 +4574,7 @@ F: drivers/infiniband/hw/cxgb4/ · 492 unmodified lines | ||
| 4575 | 4574 | F: include/uapi/rdma/cxgb4-abi.h |
| 4576 | 4575 | |
| 4577 | 4576 | CXGB4VF ETHERNET DRIVER (CXGB4VF) |
| 4578 | −M: Casey Leedom <leedom@chelsio.com> | |
| 4577 | +M: Vishal Kulkarni <vishal@gmail.com> | |
| 4579 | 4578 | L: netdev@vger.kernel.org |
| 4580 | 4579 | W: http://www.chelsio.com |
| 4581 | 4580 | S: Supported |
| @@ -6201,7 +6200,6 @@ S: Supported · 1619 unmodified lines | ||
| 6201 | 6200 | F: drivers/scsi/be2iscsi/ |
| 6202 | 6201 | |
| 6203 | 6202 | Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER (be2net) |
| 6204 | −M: Sathya Perla <sathya.perla@broadcom.com> | |
| 6205 | 6203 | M: Ajit Khaparde <ajit.khaparde@broadcom.com> |
| 6206 | 6204 | M: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com> |
| 6207 | 6205 | M: Somnath Kotur <somnath.kotur@broadcom.com> |
| @@ -11132,7 +11130,7 @@ M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> · 4924 unmodified lines | ||
| 11132 | 11130 | L: linux-mips@vger.kernel.org |
| 11133 | 11131 | W: http://www.linux-mips.org/ |
| 11134 | 11132 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git |
| 11135 | −Q: http://patchwork.linux-mips.org/project/linux-mips/list/ | |
| 11133 | +Q: https://patchwork.kernel.org/project/linux-mips/list/ | |
| 11136 | 11134 | S: Maintained |
| 11137 | 11135 | F: Documentation/devicetree/bindings/mips/ |
| 11138 | 11136 | F: Documentation/mips/ |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | VERSION = 5 |
| 3 | 3 | PATCHLEVEL = 6 |
| 4 | 4 | SUBLEVEL = 0 |
| 5 | −EXTRAVERSION = -rc5 | |
| 5 | +EXTRAVERSION = -rc7 | |
| 6 | 6 | NAME = Kleptomaniac Octopus |
| 7 | 7 | |
| 8 | 8 | # *DOCUMENTATION* |
| @@ -1804,7 +1804,7 @@ existing-targets := $(wildcard $(sort $(targets))) · 1795 unmodified lines | ||
| 1804 | 1804 | |
| 1805 | 1805 | -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) |
| 1806 | 1806 | |
| 1807 | −endif # config-targets | |
| 1807 | +endif # config-build | |
| 1808 | 1808 | endif # mixed-build |
| 1809 | 1809 | endif # need-sub-make |
| 1810 | 1810 | |
| @@ -154,7 +154,7 @@ config ARC_CPU_HS · 153 unmodified lines | ||
| 154 | 154 | help |
| 155 | 155 | Support for ARC HS38x Cores based on ARCv2 ISA |
| 156 | 156 | The notable features are: |
| 157 | − - SMP configurations of upto 4 core with coherency | |
| 157 | + - SMP configurations of up to 4 cores with coherency | |
| 158 | 158 | - Optional L2 Cache and IO-Coherency |
| 159 | 159 | - Revised Interrupt Architecture (multiple priorites, reg banks, |
| 160 | 160 | auto stack switch, auto regfile save/restore) |
| @@ -192,7 +192,7 @@ config ARC_SMP_HALT_ON_RESET · 31 unmodified lines | ||
| 192 | 192 | help |
| 193 | 193 | In SMP configuration cores can be configured as Halt-on-reset |
| 194 | 194 | or they could all start at same time. For Halt-on-reset, non |
| 195 | − masters are parked until Master kicks them so they can start of | |
| 195 | + masters are parked until Master kicks them so they can start off | |
| 196 | 196 | at designated entry point. For other case, all jump to common |
| 197 | 197 | entry point and spin wait for Master's signal. |
| 198 | 198 | |
| @@ -21,8 +21,6 @@ CONFIG_MODULES=y · 20 unmodified lines | ||
| 21 | 21 | CONFIG_MODULE_FORCE_LOAD=y |
| 22 | 22 | CONFIG_MODULE_UNLOAD=y |
| 23 | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 25 | −# CONFIG_IOSCHED_CFQ is not set | |
| 26 | 24 | CONFIG_ARC_PLAT_EZNPS=y |
| 27 | 25 | CONFIG_SMP=y |
| 28 | 26 | CONFIG_NR_CPUS=4096 |
| @@ -20,8 +20,6 @@ CONFIG_ISA_ARCOMPACT=y · 19 unmodified lines | ||
| 20 | 20 | CONFIG_KPROBES=y |
| 21 | 21 | CONFIG_MODULES=y |
| 22 | 22 | # CONFIG_BLK_DEV_BSG is not set |
| 23 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 24 | −# CONFIG_IOSCHED_CFQ is not set | |
| 25 | 23 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci" |
| 26 | 24 | # CONFIG_COMPACTION is not set |
| 27 | 25 | CONFIG_NET=y |
| @@ -19,8 +19,6 @@ CONFIG_PERF_EVENTS=y · 18 unmodified lines | ||
| 19 | 19 | CONFIG_KPROBES=y |
| 20 | 20 | CONFIG_MODULES=y |
| 21 | 21 | # CONFIG_BLK_DEV_BSG is not set |
| 22 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 23 | −# CONFIG_IOSCHED_CFQ is not set | |
| 24 | 22 | CONFIG_ISA_ARCV2=y |
| 25 | 23 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs" |
| 26 | 24 | # CONFIG_COMPACTION is not set |
| @@ -14,8 +14,6 @@ CONFIG_PERF_EVENTS=y · 13 unmodified lines | ||
| 14 | 14 | CONFIG_KPROBES=y |
| 15 | 15 | CONFIG_MODULES=y |
| 16 | 16 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 18 | −# CONFIG_IOSCHED_CFQ is not set | |
| 19 | 17 | CONFIG_ISA_ARCV2=y |
| 20 | 18 | CONFIG_SMP=y |
| 21 | 19 | # CONFIG_ARC_TIMERS_64BIT is not set |
| @@ -43,6 +43,8 @@ extern void fpu_init_task(struct pt_regs *regs); · 42 unmodified lines | ||
| 43 | 43 | |
| 44 | 44 | #endif /* !CONFIG_ISA_ARCOMPACT */ |
| 45 | 45 | |
| 46 | +struct task_struct; | |
| 47 | + | |
| 46 | 48 | extern void fpu_save_restore(struct task_struct *p, struct task_struct *n); |
| 47 | 49 | |
| 48 | 50 | #else /* !CONFIG_ARC_FPU_SAVE_RESTORE */ |
| @@ -29,6 +29,8 @@ · 28 unmodified lines | ||
| 29 | 29 | .endm |
| 30 | 30 | |
| 31 | 31 | #define ASM_NL ` /* use '`' to mark new line in macro */ |
| 32 | +#define __ALIGN .align 4 | |
| 33 | +#define __ALIGN_STR __stringify(__ALIGN) | |
| 32 | 34 | |
| 33 | 35 | /* annotation for data we want in DCCM - if enabled in .config */ |
| 34 | 36 | .macro ARCFP_DATA nm |
| @@ -8,11 +8,11 @@ · 7 unmodified lines | ||
| 8 | 8 | #include <linux/delay.h> |
| 9 | 9 | #include <linux/root_dev.h> |
| 10 | 10 | #include <linux/clk.h> |
| 11 | −#include <linux/clk-provider.h> | |
| 12 | 11 | #include <linux/clocksource.h> |
| 13 | 12 | #include <linux/console.h> |
| 14 | 13 | #include <linux/module.h> |
| 15 | 14 | #include <linux/cpu.h> |
| 15 | +#include <linux/of_clk.h> | |
| 16 | 16 | #include <linux/of_fdt.h> |
| 17 | 17 | #include <linux/of.h> |
| 18 | 18 | #include <linux/cache.h> |
| @@ -104,8 +104,7 @@ static void show_faulting_vma(unsigned long address) · 103 unmodified lines | ||
| 104 | 104 | if (IS_ERR(nm)) |
| 105 | 105 | nm = "?"; |
| 106 | 106 | } |
| 107 | − pr_info(" @off 0x%lx in [%s]\n" | |
| 108 | − " VMA: 0x%08lx to 0x%08lx\n", | |
| 107 | + pr_info(" @off 0x%lx in [%s] VMA: 0x%08lx to 0x%08lx\n", | |
| 109 | 108 | vma->vm_start < TASK_UNMAPPED_BASE ? |
| 110 | 109 | address : address - vma->vm_start, |
| 111 | 110 | nm, vma->vm_start, vma->vm_end); |
| @@ -120,8 +119,6 @@ static void show_ecr_verbose(struct pt_regs *regs) · 8 unmodified lines | ||
| 120 | 119 | unsigned int vec, cause_code; |
| 121 | 120 | unsigned long address; |
| 122 | 121 | |
| 123 | − pr_info("\n[ECR ]: 0x%08lx => ", regs->event); | |
| 124 | − | |
| 125 | 122 | /* For Data fault, this is data address not instruction addr */ |
| 126 | 123 | address = current->thread.fault_address; |
| 127 | 124 | |
| @@ -130,10 +127,10 @@ static void show_ecr_verbose(struct pt_regs *regs) · 2 unmodified lines | ||
| 130 | 127 | |
| 131 | 128 | /* For DTLB Miss or ProtV, display the memory involved too */ |
| 132 | 129 | if (vec == ECR_V_DTLB_MISS) { |
| 133 | − pr_cont("Invalid %s @ 0x%08lx by insn @ 0x%08lx\n", | |
| 130 | + pr_cont("Invalid %s @ 0x%08lx by insn @ %pS\n", | |
| 134 | 131 | (cause_code == 0x01) ? "Read" : |
| 135 | 132 | ((cause_code == 0x02) ? "Write" : "EX"), |
| 136 | − address, regs->ret); | |
| 133 | + address, (void *)regs->ret); | |
| 137 | 134 | } else if (vec == ECR_V_ITLB_MISS) { |
| 138 | 135 | pr_cont("Insn could not be fetched\n"); |
| 139 | 136 | } else if (vec == ECR_V_MACH_CHK) { |
| @@ -191,31 +188,31 @@ void show_regs(struct pt_regs *regs) · 51 unmodified lines | ||
| 191 | 188 | |
| 192 | 189 | show_ecr_verbose(regs); |
| 193 | 190 | |
| 194 | − pr_info("[EFA ]: 0x%08lx\n[BLINK ]: %pS\n[ERET ]: %pS\n", | |
| 195 | − current->thread.fault_address, | |
| 196 | − (void *)regs->blink, (void *)regs->ret); | |
| 197 | − | |
| 198 | 191 | if (user_mode(regs)) |
| 199 | 192 | show_faulting_vma(regs->ret); /* faulting code, not data */ |
| 200 | 193 | |
| 201 | − pr_info("[STAT32]: 0x%08lx", regs->status32); | |
| 194 | + pr_info("ECR: 0x%08lx EFA: 0x%08lx ERET: 0x%08lx\n", | |
| 195 | + regs->event, current->thread.fault_address, regs->ret); | |
| 196 | + | |
| 197 | + pr_info("STAT32: 0x%08lx", regs->status32); | |
| 202 | 198 | |
| 203 | 199 | #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" |
| 204 | 200 | |
| 205 | 201 | #ifdef CONFIG_ISA_ARCOMPACT |
| 206 | − pr_cont(" : %2s%2s%2s%2s%2s%2s%2s\n", | |
| 202 | + pr_cont(" [%2s%2s%2s%2s%2s%2s%2s]", | |
| 207 | 203 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", |
| 208 | 204 | STS_BIT(regs, DE), STS_BIT(regs, AE), |
| 209 | 205 | STS_BIT(regs, A2), STS_BIT(regs, A1), |
| 210 | 206 | STS_BIT(regs, E2), STS_BIT(regs, E1)); |
| 211 | 207 | #else |
| 212 | − pr_cont(" : %2s%2s%2s%2s\n", | |
| 208 | + pr_cont(" [%2s%2s%2s%2s]", | |
| 213 | 209 | STS_BIT(regs, IE), |
| 214 | 210 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", |
| 215 | 211 | STS_BIT(regs, DE), STS_BIT(regs, AE)); |
| 216 | 212 | #endif |
| 217 | − pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", | |
| 218 | − regs->bta, regs->sp, regs->fp); | |
| 213 | + pr_cont(" BTA: 0x%08lx\n", regs->bta); | |
| 214 | + pr_info("BLK: %pS\n SP: 0x%08lx FP: 0x%08lx\n", | |
| 215 | + (void *)regs->blink, regs->sp, regs->fp); | |
| 219 | 216 | pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", |
| 220 | 217 | regs->lp_start, regs->lp_end, regs->lp_count); |
| 221 | 218 | |
| @@ -307,13 +307,15 @@ endif · 306 unmodified lines | ||
| 307 | 307 | ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y) |
| 308 | 308 | prepare: stack_protector_prepare |
| 309 | 309 | stack_protector_prepare: prepare0 |
| 310 | − $(eval KBUILD_CFLAGS += \ | |
| 310 | + $(eval SSP_PLUGIN_CFLAGS := \ | |
| 311 | 311 | -fplugin-arg-arm_ssp_per_task_plugin-tso=$(shell \ |
| 312 | 312 | awk '{if ($$2 == "THREAD_SZ_ORDER") print $$3;}'\ |
| 313 | 313 | include/generated/asm-offsets.h) \ |
| 314 | 314 | -fplugin-arg-arm_ssp_per_task_plugin-offset=$(shell \ |
| 315 | 315 | awk '{if ($$2 == "TI_STACK_CANARY") print $$3;}'\ |
| 316 | 316 | include/generated/asm-offsets.h)) |
| 317 | + $(eval KBUILD_CFLAGS += $(SSP_PLUGIN_CFLAGS)) | |
| 318 | + $(eval GCC_PLUGINS_CFLAGS += $(SSP_PLUGIN_CFLAGS)) | |
| 317 | 319 | endif |
| 318 | 320 | |
| 319 | 321 | all: $(notdir $(KBUILD_IMAGE)) |
| @@ -101,7 +101,6 @@ clean-files += piggy_data lib1funcs.S ashldi3.S bswapsdi2.S \ · 100 unmodified lines | ||
| 101 | 101 | $(libfdt) $(libfdt_hdrs) hyp-stub.S |
| 102 | 102 | |
| 103 | 103 | KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING |
| 104 | −KBUILD_CFLAGS += $(DISABLE_ARM_SSP_PER_TASK_PLUGIN) | |
| 105 | 104 | |
| 106 | 105 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| 107 | 106 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| @@ -117,7 +116,8 @@ CFLAGS_fdt_ro.o := $(nossp-flags-y) · 9 unmodified lines | ||
| 117 | 116 | CFLAGS_fdt_rw.o := $(nossp-flags-y) |
| 118 | 117 | CFLAGS_fdt_wip.o := $(nossp-flags-y) |
| 119 | 118 | |
| 120 | −ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin -I$(obj) | |
| 119 | +ccflags-y := -fpic $(call cc-option,-mno-single-pic-base,) -fno-builtin \ | |
| 120 | + -I$(obj) $(DISABLE_ARM_SSP_PER_TASK_PLUGIN) | |
| 121 | 121 | asflags-y := -DZIMAGE |
| 122 | 122 | |
| 123 | 123 | # Supply kernel BSS size to the decompressor via a linker symbol. |
| @@ -94,6 +94,8 @@ static bool __init cntvct_functional(void) · 93 unmodified lines | ||
| 94 | 94 | * this. |
| 95 | 95 | */ |
| 96 | 96 | np = of_find_compatible_node(NULL, NULL, "arm,armv7-timer"); |
| 97 | + if (!np) | |
| 98 | + np = of_find_compatible_node(NULL, NULL, "arm,armv8-timer"); | |
| 97 | 99 | if (!np) |
| 98 | 100 | goto out_put; |
| 99 | 101 | |
| @@ -118,7 +118,7 @@ ENTRY(arm_copy_from_user) · 117 unmodified lines | ||
| 118 | 118 | |
| 119 | 119 | ENDPROC(arm_copy_from_user) |
| 120 | 120 | |
| 121 | − .pushsection .fixup,"ax" | |
| 121 | + .pushsection .text.fixup,"ax" | |
| 122 | 122 | .align 0 |
| 123 | 123 | copy_abort_preamble |
| 124 | 124 | ldmfd sp!, {r1, r2, r3} |
| @@ -20,6 +20,8 @@ · 19 unmodified lines | ||
| 20 | 20 | }; |
| 21 | 21 | |
| 22 | 22 | &fman0 { |
| 23 | + fsl,erratum-a050385; | |
| 24 | + | |
| 23 | 25 | /* these aliases provide the FMan ports mapping */ |
| 24 | 26 | enet0: ethernet@e0000 { |
| 25 | 27 | }; |
| @@ -29,11 +29,9 @@ typedef struct { · 28 unmodified lines | ||
| 29 | 29 | */ |
| 30 | 30 | #define ASID(mm) ((mm)->context.id.counter & 0xffff) |
| 31 | 31 | |
| 32 | −extern bool arm64_use_ng_mappings; | |
| 33 | − | |
| 34 | 32 | static inline bool arm64_kernel_unmapped_at_el0(void) |
| 35 | 33 | { |
| 36 | − return arm64_use_ng_mappings; | |
| 34 | + return cpus_have_const_cap(ARM64_UNMAP_KERNEL_AT_EL0); | |
| 37 | 35 | } |
| 38 | 36 | |
| 39 | 37 | typedef void (*bp_hardening_cb_t)(void); |
| @@ -23,11 +23,13 @@ · 22 unmodified lines | ||
| 23 | 23 | |
| 24 | 24 | #include <asm/pgtable-types.h> |
| 25 | 25 | |
| 26 | +extern bool arm64_use_ng_mappings; | |
| 27 | + | |
| 26 | 28 | #define _PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED) |
| 27 | 29 | #define _PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S) |
| 28 | 30 | |
| 29 | −#define PTE_MAYBE_NG (arm64_kernel_unmapped_at_el0() ? PTE_NG : 0) | |
| 30 | −#define PMD_MAYBE_NG (arm64_kernel_unmapped_at_el0() ? PMD_SECT_NG : 0) | |
| 31 | +#define PTE_MAYBE_NG (arm64_use_ng_mappings ? PTE_NG : 0) | |
| 32 | +#define PMD_MAYBE_NG (arm64_use_ng_mappings ? PMD_SECT_NG : 0) | |
| 31 | 33 | |
| 32 | 34 | #define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG) |
| 33 | 35 | #define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG) |
| @@ -25,8 +25,8 @@ · 24 unmodified lines | ||
| 25 | 25 | #define __NR_compat_gettimeofday 78 |
| 26 | 26 | #define __NR_compat_sigreturn 119 |
| 27 | 27 | #define __NR_compat_rt_sigreturn 173 |
| 28 | −#define __NR_compat_clock_getres 247 | |
| 29 | 28 | #define __NR_compat_clock_gettime 263 |
| 29 | +#define __NR_compat_clock_getres 264 | |
| 30 | 30 | #define __NR_compat_clock_gettime64 403 |
| 31 | 31 | #define __NR_compat_clock_getres_time64 406 |
| 32 | 32 | |
| @@ -958,11 +958,22 @@ void tick_broadcast(const struct cpumask *mask) · 957 unmodified lines | ||
| 958 | 958 | } |
| 959 | 959 | #endif |
| 960 | 960 | |
| 961 | +/* | |
| 962 | + * The number of CPUs online, not counting this CPU (which may not be | |
| 963 | + * fully online and so not counted in num_online_cpus()). | |
| 964 | + */ | |
| 965 | +static inline unsigned int num_other_online_cpus(void) | |
| 966 | +{ | |
| 967 | + unsigned int this_cpu_online = cpu_online(smp_processor_id()); | |
| 968 | + | |
| 969 | + return num_online_cpus() - this_cpu_online; | |
| 970 | +} | |
| 971 | + | |
| 961 | 972 | void smp_send_stop(void) |
| 962 | 973 | { |
| 963 | 974 | unsigned long timeout; |
| 964 | 975 | |
| 965 | − if (num_online_cpus() > 1) { | |
| 976 | + if (num_other_online_cpus()) { | |
| 966 | 977 | cpumask_t mask; |
| 967 | 978 | |
| 968 | 979 | cpumask_copy(&mask, cpu_online_mask); |
| @@ -975,10 +986,10 @@ void smp_send_stop(void) · 6 unmodified lines | ||
| 975 | 986 | |
| 976 | 987 | /* Wait up to one second for other CPUs to stop */ |
| 977 | 988 | timeout = USEC_PER_SEC; |
| 978 | − while (num_online_cpus() > 1 && timeout--) | |
| 989 | + while (num_other_online_cpus() && timeout--) | |
| 979 | 990 | udelay(1); |
| 980 | 991 | |
| 981 | − if (num_online_cpus() > 1) | |
| 992 | + if (num_other_online_cpus()) | |
| 982 | 993 | pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", |
| 983 | 994 | cpumask_pr_args(cpu_online_mask)); |
| 984 | 995 | |
| @@ -1001,7 +1012,11 @@ void crash_smp_send_stop(void) · 16 unmodified lines | ||
| 1001 | 1012 | |
| 1002 | 1013 | cpus_stopped = 1; |
| 1003 | 1014 | |
| 1004 | − if (num_online_cpus() == 1) { | |
| 1015 | + /* | |
| 1016 | + * If this cpu is the only one alive at this point in time, online or | |
| 1017 | + * not, there are no stop messages to be sent around, so just back out. | |
| 1018 | + */ | |
| 1019 | + if (num_other_online_cpus() == 0) { | |
| 1005 | 1020 | sdei_mask_local_cpu(); |
| 1006 | 1021 | return; |
| 1007 | 1022 | } |
| @@ -1009,7 +1024,7 @@ void crash_smp_send_stop(void) · 1 unmodified line | ||
| 1009 | 1024 | cpumask_copy(&mask, cpu_online_mask); |
| 1010 | 1025 | cpumask_clear_cpu(smp_processor_id(), &mask); |
| 1011 | 1026 | |
| 1012 | − atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); | |
| 1027 | + atomic_set(&waiting_for_crash_ipi, num_other_online_cpus()); | |
| 1013 | 1028 | |
| 1014 | 1029 | pr_crit("SMP: stopping secondary CPUs\n"); |
| 1015 | 1030 | smp_cross_call(&mask, IPI_CPU_CRASH_STOP); |
| @@ -4,6 +4,8 @@ · 3 unmodified lines | ||
| 4 | 4 | #include "jz4780.dtsi" |
| 5 | 5 | #include <dt-bindings/clock/ingenic,tcu.h> |
| 6 | 6 | #include <dt-bindings/gpio/gpio.h> |
| 7 | +#include <dt-bindings/interrupt-controller/irq.h> | |
| 8 | +#include <dt-bindings/regulator/active-semi,8865-regulator.h> | |
| 7 | 9 | |
| 8 | 10 | / { |
| 9 | 11 | compatible = "img,ci20", "ingenic,jz4780"; |
| @@ -163,63 +165,71 @@ · 153 unmodified lines | ||
| 163 | 165 | |
| 164 | 166 | regulators { |
| 165 | 167 | vddcore: SUDCDC1 { |
| 166 | − regulator-name = "VDDCORE"; | |
| 168 | + regulator-name = "DCDC_REG1"; | |
| 167 | 169 | regulator-min-microvolt = <1100000>; |
| 168 | 170 | regulator-max-microvolt = <1100000>; |
| 169 | 171 | regulator-always-on; |
| 170 | 172 | }; |
| 171 | 173 | vddmem: SUDCDC2 { |
| 172 | − regulator-name = "VDDMEM"; | |
| 174 | + regulator-name = "DCDC_REG2"; | |
| 173 | 175 | regulator-min-microvolt = <1500000>; |
| 174 | 176 | regulator-max-microvolt = <1500000>; |
| 175 | 177 | regulator-always-on; |
| 176 | 178 | }; |
| 177 | 179 | vcc_33: SUDCDC3 { |
| 178 | − regulator-name = "VCC33"; | |
| 180 | + regulator-name = "DCDC_REG3"; | |
| 179 | 181 | regulator-min-microvolt = <3300000>; |
| 180 | 182 | regulator-max-microvolt = <3300000>; |
| 181 | 183 | regulator-always-on; |
| 182 | 184 | }; |
| 183 | 185 | vcc_50: SUDCDC4 { |
| 184 | − regulator-name = "VCC50"; | |
| 186 | + regulator-name = "SUDCDC_REG4"; | |
| 185 | 187 | regulator-min-microvolt = <5000000>; |
| 186 | 188 | regulator-max-microvolt = <5000000>; |
| 187 | 189 | regulator-always-on; |
| 188 | 190 | }; |
| 189 | 191 | vcc_25: LDO_REG5 { |
| 190 | − regulator-name = "VCC25"; | |
| 192 | + regulator-name = "LDO_REG5"; | |
| 191 | 193 | regulator-min-microvolt = <2500000>; |
| 192 | 194 | regulator-max-microvolt = <2500000>; |
| 193 | 195 | regulator-always-on; |
| 194 | 196 | }; |
| 195 | 197 | wifi_io: LDO_REG6 { |
| 196 | − regulator-name = "WIFIIO"; | |
| 198 | + regulator-name = "LDO_REG6"; | |
| 197 | 199 | regulator-min-microvolt = <2500000>; |
| 198 | 200 | regulator-max-microvolt = <2500000>; |
| 199 | 201 | regulator-always-on; |
| 200 | 202 | }; |
| 201 | 203 | vcc_28: LDO_REG7 { |
| 202 | − regulator-name = "VCC28"; | |
| 204 | + regulator-name = "LDO_REG7"; | |
| 203 | 205 | regulator-min-microvolt = <2800000>; |
| 204 | 206 | regulator-max-microvolt = <2800000>; |
| 205 | 207 | regulator-always-on; |
| 206 | 208 | }; |
| 207 | 209 | vcc_15: LDO_REG8 { |
| 208 | − regulator-name = "VCC15"; | |
| 210 | + regulator-name = "LDO_REG8"; | |
| 209 | 211 | regulator-min-microvolt = <1500000>; |
| 210 | 212 | regulator-max-microvolt = <1500000>; |
| 211 | 213 | regulator-always-on; |
| 212 | 214 | }; |
| 213 | − vcc_18: LDO_REG9 { | |
| 214 | − regulator-name = "VCC18"; | |
| 215 | − regulator-min-microvolt = <1800000>; | |
| 216 | − regulator-max-microvolt = <1800000>; | |
| 215 | + vrtc_18: LDO_REG9 { | |
| 216 | + regulator-name = "LDO_REG9"; | |
| 217 | + /* Despite the datasheet stating 3.3V | |
| 218 | + * for REG9 and the driver expecting that, | |
| 219 | + * REG9 outputs 1.8V. | |
| 220 | + * Likely the CI20 uses a proprietary | |
| 221 | + * factory programmed chip variant. | |
| 222 | + * Since this is a simple on/off LDO the | |
| 223 | + * exact values do not matter. | |
| 224 | + */ | |
| 225 | + regulator-min-microvolt = <3300000>; | |
| 226 | + regulator-max-microvolt = <3300000>; | |
| 217 | 227 | regulator-always-on; |
| 218 | 228 | }; |
| 219 | 229 | vcc_11: LDO_REG10 { |
| 220 | − regulator-name = "VCC11"; | |
| 221 | − regulator-min-microvolt = <1100000>; | |
| 222 | − regulator-max-microvolt = <1100000>; | |
| 230 | + regulator-name = "LDO_REG10"; | |
| 231 | + regulator-min-microvolt = <1200000>; | |
| 232 | + regulator-max-microvolt = <1200000>; | |
| 223 | 233 | regulator-always-on; |
| 224 | 234 | }; |
| 225 | 235 | }; |
| @@ -261,7 +271,9 @@ · 35 unmodified lines | ||
| 261 | 271 | rtc@51 { |
| 262 | 272 | compatible = "nxp,pcf8563"; |
| 263 | 273 | reg = <0x51>; |
| 264 | − interrupts = <110>; | |
| 274 | + | |
| 275 | + interrupt-parent = <&gpf>; | |
| 276 | + interrupts = <30 IRQ_TYPE_LEVEL_LOW>; | |
| 265 | 277 | }; |
| 266 | 278 | }; |
| 267 | 279 | |
| @@ -605,7 +605,8 @@ static void __init bootcmdline_init(char **cmdline_p) · 604 unmodified lines | ||
| 605 | 605 | * If we're configured to take boot arguments from DT, look for those |
| 606 | 606 | * now. |
| 607 | 607 | */ |
| 608 | − if (IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB)) | |
| 608 | + if (IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB) || | |
| 609 | + IS_ENABLED(CONFIG_MIPS_CMDLINE_DTB_EXTEND)) | |
| 609 | 610 | of_scan_flat_dt(bootcmdline_scan_chosen, &dt_bootargs); |
| 610 | 611 | #endif |
| 611 | 612 | |
| @@ -1817,6 +1817,7 @@ static void kvmppc_core_vcpu_free_pr(struct kvm_vcpu *vcpu) · 1816 unmodified lines | ||
| 1817 | 1817 | { |
| 1818 | 1818 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); |
| 1819 | 1819 | |
| 1820 | + kvmppc_mmu_destroy_pr(vcpu); | |
| 1820 | 1821 | free_page((unsigned long)vcpu->arch.shared & PAGE_MASK); |
| 1821 | 1822 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER |
| 1822 | 1823 | kfree(vcpu->arch.shadow_vcpu); |
| @@ -759,7 +759,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) · 758 unmodified lines | ||
| 759 | 759 | return 0; |
| 760 | 760 | |
| 761 | 761 | out_vcpu_uninit: |
| 762 | − kvmppc_mmu_destroy(vcpu); | |
| 763 | 762 | kvmppc_subarch_vcpu_uninit(vcpu); |
| 764 | 763 | return err; |
| 765 | 764 | } |
| @@ -792,7 +791,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) · 26 unmodified lines | ||
| 792 | 791 | |
| 793 | 792 | kvmppc_core_vcpu_free(vcpu); |
| 794 | 793 | |
| 795 | − kvmppc_mmu_destroy(vcpu); | |
| 796 | 794 | kvmppc_subarch_vcpu_uninit(vcpu); |
| 797 | 795 | } |
| 798 | 796 | |
| @@ -120,12 +120,6 @@ static void __init kasan_unmap_early_shadow_vmalloc(void) · 119 unmodified lines | ||
| 120 | 120 | unsigned long k_cur; |
| 121 | 121 | phys_addr_t pa = __pa(kasan_early_shadow_page); |
| 122 | 122 | |
| 123 | − if (!early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) { | |
| 124 | − int ret = kasan_init_shadow_page_tables(k_start, k_end); | |
| 125 | − | |
| 126 | − if (ret) | |
| 127 | − panic("kasan: kasan_init_shadow_page_tables() failed"); | |
| 128 | − } | |
| 129 | 123 | for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) { |
| 130 | 124 | pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); |
| 131 | 125 | pte_t *ptep = pte_offset_kernel(pmd, k_cur); |
| @@ -143,7 +137,8 @@ void __init kasan_mmu_init(void) · 11 unmodified lines | ||
| 143 | 137 | int ret; |
| 144 | 138 | struct memblock_region *reg; |
| 145 | 139 | |
| 146 | − if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) { | |
| 140 | + if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE) || | |
| 141 | + IS_ENABLED(CONFIG_KASAN_VMALLOC)) { | |
| 147 | 142 | ret = kasan_init_shadow_page_tables(KASAN_SHADOW_START, KASAN_SHADOW_END); |
| 148 | 143 | |
| 149 | 144 | if (ret) |
| @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) · 3267 unmodified lines | ||
| 3268 | 3268 | /* Initial reset is a superset of the normal reset */ |
| 3269 | 3269 | kvm_arch_vcpu_ioctl_normal_reset(vcpu); |
| 3270 | 3270 | |
| 3271 | − /* this equals initial cpu reset in pop, but we don't switch to ESA */ | |
| 3271 | + /* | |
| 3272 | + * This equals initial cpu reset in pop, but we don't switch to ESA. | |
| 3273 | + * We do not only reset the internal data, but also ... | |
| 3274 | + */ | |
| 3272 | 3275 | vcpu->arch.sie_block->gpsw.mask = 0; |
| 3273 | 3276 | vcpu->arch.sie_block->gpsw.addr = 0; |
| 3274 | 3277 | kvm_s390_set_prefix(vcpu, 0); |
| @@ -3278,6 +3281,19 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) · 3 unmodified lines | ||
| 3278 | 3281 | memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); |
| 3279 | 3282 | vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; |
| 3280 | 3283 | vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK; |
| 3284 | + | |
| 3285 | + /* ... the data in sync regs */ | |
| 3286 | + memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs)); | |
| 3287 | + vcpu->run->s.regs.ckc = 0; | |
| 3288 | + vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK; | |
| 3289 | + vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK; | |
| 3290 | + vcpu->run->psw_addr = 0; | |
| 3291 | + vcpu->run->psw_mask = 0; | |
| 3292 | + vcpu->run->s.regs.todpr = 0; | |
| 3293 | + vcpu->run->s.regs.cputm = 0; | |
| 3294 | + vcpu->run->s.regs.ckc = 0; | |
| 3295 | + vcpu->run->s.regs.pp = 0; | |
| 3296 | + vcpu->run->s.regs.gbea = 1; | |
| 3281 | 3297 | vcpu->run->s.regs.fpc = 0; |
| 3282 | 3298 | vcpu->arch.sie_block->gbea = 1; |
| 3283 | 3299 | vcpu->arch.sie_block->pp = 0; |
| @@ -194,9 +194,10 @@ avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1) · 193 unmodified lines | ||
| 194 | 194 | avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1) |
| 195 | 195 | sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1) |
| 196 | 196 | sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1) |
| 197 | +adx_instr := $(call as-instr,adox %r10$(comma)%r10,-DCONFIG_AS_ADX=1) | |
| 197 | 198 | |
| 198 | −KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) | |
| 199 | −KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) | |
| 199 | +KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr) | |
| 200 | +KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr) | |
| 200 | 201 | |
| 201 | 202 | KBUILD_LDFLAGS := -m elf_$(UTS_MACHINE) |
| 202 | 203 | |
| @@ -11,6 +11,7 @@ avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\ · 10 unmodified lines | ||
| 11 | 11 | avx512_supported :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,yes,no) |
| 12 | 12 | sha1_ni_supported :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,yes,no) |
| 13 | 13 | sha256_ni_supported :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,yes,no) |
| 14 | +adx_supported := $(call as-instr,adox %r10$(comma)%r10,yes,no) | |
| 14 | 15 | |
| 15 | 16 | obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o |
| 16 | 17 | |
| @@ -39,7 +40,11 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2) += aegis128-aesni.o · 22 unmodified lines | ||
| 39 | 40 | |
| 40 | 41 | obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o |
| 41 | 42 | obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o |
| 42 | −obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o | |
| 43 | + | |
| 44 | +# These modules require the assembler to support ADX. | |
| 45 | +ifeq ($(adx_supported),yes) | |
| 46 | + obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o | |
| 47 | +endif | |
| 43 | 48 | |
| 44 | 49 | # These modules require assembler to support AVX. |
| 45 | 50 | ifeq ($(avx_supported),yes) |
| @@ -190,15 +190,12 @@ static int amd_uncore_event_init(struct perf_event *event) · 189 unmodified lines | ||
| 190 | 190 | |
| 191 | 191 | /* |
| 192 | 192 | * NB and Last level cache counters (MSRs) are shared across all cores |
| 193 | − * that share the same NB / Last level cache. Interrupts can be directed | |
| 194 | − * to a single target core, however, event counts generated by processes | |
| 195 | − * running on other cores cannot be masked out. So we do not support | |
| 196 | − * sampling and per-thread events. | |
| 193 | + * that share the same NB / Last level cache. On family 16h and below, | |
| 194 | + * Interrupts can be directed to a single target core, however, event | |
| 195 | + * counts generated by processes running on other cores cannot be masked | |
| 196 | + * out. So we do not support sampling and per-thread events via | |
| 197 | + * CAP_NO_INTERRUPT, and we do not enable counter overflow interrupts: | |
| 197 | 198 | */ |
| 198 | − if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) | |
| 199 | − return -EINVAL; | |
| 200 | − | |
| 201 | − /* and we do not enable counter overflow interrupts */ | |
| 202 | 199 | hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; |
| 203 | 200 | hwc->idx = -1; |
| 204 | 201 | |
| @@ -306,7 +303,7 @@ static struct pmu amd_nb_pmu = { · 101 unmodified lines | ||
| 306 | 303 | .start = amd_uncore_start, |
| 307 | 304 | .stop = amd_uncore_stop, |
| 308 | 305 | .read = amd_uncore_read, |
| 309 | − .capabilities = PERF_PMU_CAP_NO_EXCLUDE, | |
| 306 | + .capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT, | |
| 310 | 307 | }; |
| 311 | 308 | |
| 312 | 309 | static struct pmu amd_llc_pmu = { |
| @@ -317,7 +314,7 @@ static struct pmu amd_llc_pmu = { · 4 unmodified lines | ||
| 317 | 314 | .start = amd_uncore_start, |
| 318 | 315 | .stop = amd_uncore_stop, |
| 319 | 316 | .read = amd_uncore_read, |
| 320 | − .capabilities = PERF_PMU_CAP_NO_EXCLUDE, | |
| 317 | + .capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT, | |
| 321 | 318 | }; |
| 322 | 319 | |
| 323 | 320 | static struct amd_uncore *amd_uncore_alloc(unsigned int cpu) |
| @@ -360,7 +360,6 @@ struct x86_emulate_ctxt { · 359 unmodified lines | ||
| 360 | 360 | u64 d; |
| 361 | 361 | unsigned long _eip; |
| 362 | 362 | struct operand memop; |
| 363 | − /* Fields above regs are cleared together. */ | |
| 364 | 363 | unsigned long _regs[NR_VCPU_REGS]; |
| 365 | 364 | struct operand *memopp; |
| 366 | 365 | struct fetch_cache fetch; |
| @@ -838,13 +838,15 @@ static void free_moved_vector(struct apic_chip_data *apicd) · 837 unmodified lines | ||
| 838 | 838 | bool managed = apicd->is_managed; |
| 839 | 839 | |
| 840 | 840 | /* |
| 841 | − * This should never happen. Managed interrupts are not | |
| 842 | − * migrated except on CPU down, which does not involve the | |
| 843 | − * cleanup vector. But try to keep the accounting correct | |
| 844 | − * nevertheless. | |
| 841 | + * Managed interrupts are usually not migrated away | |
| 842 | + * from an online CPU, but CPU isolation 'managed_irq' | |
| 843 | + * can make that happen. | |
| 844 | + * 1) Activation does not take the isolation into account | |
| 845 | + * to keep the code simple | |
| 846 | + * 2) Migration away from an isolated CPU can happen when | |
| 847 | + * a non-isolated CPU which is in the calculated | |
| 848 | + * affinity mask comes online. | |
| 845 | 849 | */ |
| 846 | − WARN_ON_ONCE(managed); | |
| 847 | − | |
| 848 | 850 | trace_vector_free_moved(apicd->irq, cpu, vector, managed); |
| 849 | 851 | irq_matrix_free(vector_matrix, cpu, vector, managed); |
| 850 | 852 | per_cpu(vector_irq, cpu)[vector] = VECTOR_UNUSED; |
| @@ -493,17 +493,18 @@ static void intel_ppin_init(struct cpuinfo_x86 *c) · 492 unmodified lines | ||
| 493 | 493 | return; |
| 494 | 494 | |
| 495 | 495 | if ((val & 3UL) == 1UL) { |
| 496 | − /* PPIN available but disabled: */ | |
| 496 | + /* PPIN locked in disabled mode */ | |
| 497 | 497 | return; |
| 498 | 498 | } |
| 499 | 499 | |
| 500 | − /* If PPIN is disabled, but not locked, try to enable: */ | |
| 501 | − if (!(val & 3UL)) { | |
| 500 | + /* If PPIN is disabled, try to enable */ | |
| 501 | + if (!(val & 2UL)) { | |
| 502 | 502 | wrmsrl_safe(MSR_PPIN_CTL, val | 2UL); |
| 503 | 503 | rdmsrl_safe(MSR_PPIN_CTL, &val); |
| 504 | 504 | } |
| 505 | 505 | |
| 506 | − if ((val & 3UL) == 2UL) | |
| 506 | + /* Is the enable bit set? */ | |
| 507 | + if (val & 2UL) | |
| 507 | 508 | set_cpu_cap(c, X86_FEATURE_INTEL_PPIN); |
| 508 | 509 | } |
| 509 | 510 | } |
| @@ -486,9 +486,14 @@ static int thermal_throttle_offline(unsigned int cpu) · 485 unmodified lines | ||
| 486 | 486 | { |
| 487 | 487 | struct thermal_state *state = &per_cpu(thermal_state, cpu); |
| 488 | 488 | struct device *dev = get_cpu_device(cpu); |
| 489 | + u32 l; | |
| 490 | + | |
| 491 | + /* Mask the thermal vector before draining evtl. pending work */ | |
| 492 | + l = apic_read(APIC_LVTTHMR); | |
| 493 | + apic_write(APIC_LVTTHMR, l | APIC_LVT_MASKED); | |
| 489 | 494 | |
| 490 | − cancel_delayed_work(&state->package_throttle.therm_work); | |
| 491 | − cancel_delayed_work(&state->core_throttle.therm_work); | |
| 495 | + cancel_delayed_work_sync(&state->package_throttle.therm_work); | |
| 496 | + cancel_delayed_work_sync(&state->core_throttle.therm_work); | |
| 492 | 497 | |
| 493 | 498 | state->package_throttle.rate_control_active = false; |
| 494 | 499 | state->core_throttle.rate_control_active = false; |
| @@ -68,7 +68,7 @@ config KVM_WERROR · 67 unmodified lines | ||
| 68 | 68 | depends on (X86_64 && !KASAN) || !COMPILE_TEST |
| 69 | 69 | depends on EXPERT |
| 70 | 70 | help |
| 71 | − Add -Werror to the build flags for (and only for) i915.ko. | |
| 71 | + Add -Werror to the build flags for KVM. | |
| 72 | 72 | |
| 73 | 73 | If in doubt, say "N". |
| 74 | 74 | |
| @@ -5173,6 +5173,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len) · 5172 unmodified lines | ||
| 5173 | 5173 | ctxt->fetch.ptr = ctxt->fetch.data; |
| 5174 | 5174 | ctxt->fetch.end = ctxt->fetch.data + insn_len; |
| 5175 | 5175 | ctxt->opcode_len = 1; |
| 5176 | + ctxt->intercept = x86_intercept_none; | |
| 5176 | 5177 | if (insn_len > 0) |
| 5177 | 5178 | memcpy(ctxt->fetch.data, insn, insn_len); |
| 5178 | 5179 | else { |
| @@ -378,12 +378,15 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) · 377 unmodified lines | ||
| 378 | 378 | if (e->fields.delivery_mode == APIC_DM_FIXED) { |
| 379 | 379 | struct kvm_lapic_irq irq; |
| 380 | 380 | |
| 381 | − irq.shorthand = APIC_DEST_NOSHORT; | |
| 382 | 381 | irq.vector = e->fields.vector; |
| 383 | 382 | irq.delivery_mode = e->fields.delivery_mode << 8; |
| 384 | − irq.dest_id = e->fields.dest_id; | |
| 385 | 383 | irq.dest_mode = |
| 386 | 384 | kvm_lapic_irq_dest_mode(!!e->fields.dest_mode); |
| 385 | + irq.level = false; | |
| 386 | + irq.trig_mode = e->fields.trig_mode; | |
| 387 | + irq.shorthand = APIC_DEST_NOSHORT; | |
| 388 | + irq.dest_id = e->fields.dest_id; | |
| 389 | + irq.msi_redir_hint = false; | |
| 387 | 390 | bitmap_zero(&vcpu_bitmap, 16); |
| 388 | 391 | kvm_bitmap_or_dest_vcpus(ioapic->kvm, &irq, |
| 389 | 392 | &vcpu_bitmap); |
| @@ -6312,7 +6312,8 @@ static void svm_handle_exit_irqoff(struct kvm_vcpu *vcpu, · 6311 unmodified lines | ||
| 6312 | 6312 | enum exit_fastpath_completion *exit_fastpath) |
| 6313 | 6313 | { |
| 6314 | 6314 | if (!is_guest_mode(vcpu) && |
| 6315 | − to_svm(vcpu)->vmcb->control.exit_code == EXIT_REASON_MSR_WRITE) | |
| 6315 | + to_svm(vcpu)->vmcb->control.exit_code == SVM_EXIT_MSR && | |
| 6316 | + to_svm(vcpu)->vmcb->control.exit_info_1) | |
| 6316 | 6317 | *exit_fastpath = handle_fastpath_set_msr_irqoff(vcpu); |
| 6317 | 6318 | } |
| 6318 | 6319 | |
| @@ -224,7 +224,7 @@ static inline void nested_release_evmcs(struct kvm_vcpu *vcpu) · 223 unmodified lines | ||
| 224 | 224 | return; |
| 225 | 225 | |
| 226 | 226 | kvm_vcpu_unmap(vcpu, &vmx->nested.hv_evmcs_map, true); |
| 227 | − vmx->nested.hv_evmcs_vmptr = -1ull; | |
| 227 | + vmx->nested.hv_evmcs_vmptr = 0; | |
| 228 | 228 | vmx->nested.hv_evmcs = NULL; |
| 229 | 229 | } |
| 230 | 230 | |
| @@ -1923,7 +1923,8 @@ static int nested_vmx_handle_enlightened_vmptrld(struct kvm_vcpu *vcpu, · 1692 unmodified lines | ||
| 1923 | 1923 | if (!nested_enlightened_vmentry(vcpu, &evmcs_gpa)) |
| 1924 | 1924 | return 1; |
| 1925 | 1925 | |
| 1926 | − if (unlikely(evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) { | |
| 1926 | + if (unlikely(!vmx->nested.hv_evmcs || | |
| 1927 | + evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) { | |
| 1927 | 1928 | if (!vmx->nested.hv_evmcs) |
| 1928 | 1929 | vmx->nested.current_vmptr = -1ull; |
| 1929 | 1930 | |
| @@ -2338,6 +2338,17 @@ static void hardware_disable(void) · 2337 unmodified lines | ||
| 2338 | 2338 | kvm_cpu_vmxoff(); |
| 2339 | 2339 | } |
| 2340 | 2340 | |
| 2341 | +/* | |
| 2342 | + * There is no X86_FEATURE for SGX yet, but anyway we need to query CPUID | |
| 2343 | + * directly instead of going through cpu_has(), to ensure KVM is trapping | |
| 2344 | + * ENCLS whenever it's supported in hardware. It does not matter whether | |
| 2345 | + * the host OS supports or has enabled SGX. | |
| 2346 | + */ | |
| 2347 | +static bool cpu_has_sgx(void) | |
| 2348 | +{ | |
| 2349 | + return cpuid_eax(0) >= 0x12 && (cpuid_eax(0x12) & BIT(0)); | |
| 2350 | +} | |
| 2351 | + | |
| 2341 | 2352 | static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, |
| 2342 | 2353 | u32 msr, u32 *result) |
| 2343 | 2354 | { |
| @@ -2418,8 +2429,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, · 74 unmodified lines | ||
| 2418 | 2429 | SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | |
| 2419 | 2430 | SECONDARY_EXEC_PT_USE_GPA | |
| 2420 | 2431 | SECONDARY_EXEC_PT_CONCEAL_VMX | |
| 2421 | − SECONDARY_EXEC_ENABLE_VMFUNC | | |
| 2422 | − SECONDARY_EXEC_ENCLS_EXITING; | |
| 2432 | + SECONDARY_EXEC_ENABLE_VMFUNC; | |
| 2433 | + if (cpu_has_sgx()) | |
| 2434 | + opt2 |= SECONDARY_EXEC_ENCLS_EXITING; | |
| 2423 | 2435 | if (adjust_vmx_controls(min2, opt2, |
| 2424 | 2436 | MSR_IA32_VMX_PROCBASED_CTLS2, |
| 2425 | 2437 | &_cpu_based_2nd_exec_control) < 0) |
| @@ -7195,10 +7195,12 @@ static void kvm_timer_init(void) · 7194 unmodified lines | ||
| 7195 | 7195 | |
| 7196 | 7196 | cpu = get_cpu(); |
| 7197 | 7197 | policy = cpufreq_cpu_get(cpu); |
| 7198 | − if (policy && policy->cpuinfo.max_freq) | |
| 7199 | − max_tsc_khz = policy->cpuinfo.max_freq; | |
| 7198 | + if (policy) { | |
| 7199 | + if (policy->cpuinfo.max_freq) | |
| 7200 | + max_tsc_khz = policy->cpuinfo.max_freq; | |
| 7201 | + cpufreq_cpu_put(policy); | |
| 7202 | + } | |
| 7200 | 7203 | put_cpu(); |
| 7201 | − cpufreq_cpu_put(policy); | |
| 7202 | 7204 | #endif |
| 7203 | 7205 | cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block, |
| 7204 | 7206 | CPUFREQ_TRANSITION_NOTIFIER); |
| @@ -190,7 +190,7 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) · 189 unmodified lines | ||
| 190 | 190 | return pmd_k; |
| 191 | 191 | } |
| 192 | 192 | |
| 193 | −void vmalloc_sync_all(void) | |
| 193 | +static void vmalloc_sync(void) | |
| 194 | 194 | { |
| 195 | 195 | unsigned long address; |
| 196 | 196 | |
| @@ -217,6 +217,16 @@ void vmalloc_sync_all(void) · 20 unmodified lines | ||
| 217 | 217 | } |
| 218 | 218 | } |
| 219 | 219 | |
| 220 | +void vmalloc_sync_mappings(void) | |
| 221 | +{ | |
| 222 | + vmalloc_sync(); | |
| 223 | +} | |
| 224 | + | |
| 225 | +void vmalloc_sync_unmappings(void) | |
| 226 | +{ | |
| 227 | + vmalloc_sync(); | |
| 228 | +} | |
| 229 | + | |
| 220 | 230 | /* |
| 221 | 231 | * 32-bit: |
| 222 | 232 | * |
| @@ -319,11 +329,23 @@ out: · 96 unmodified lines | ||
| 319 | 329 | |
| 320 | 330 | #else /* CONFIG_X86_64: */ |
| 321 | 331 | |
| 322 | −void vmalloc_sync_all(void) | |
| 332 | +void vmalloc_sync_mappings(void) | |
| 323 | 333 | { |
| 334 | + /* | |
| 335 | + * 64-bit mappings might allocate new p4d/pud pages | |
| 336 | + * that need to be propagated to all tasks' PGDs. | |
| 337 | + */ | |
| 324 | 338 | sync_global_pgds(VMALLOC_START & PGDIR_MASK, VMALLOC_END); |
| 325 | 339 | } |
| 326 | 340 | |
| 341 | +void vmalloc_sync_unmappings(void) | |
| 342 | +{ | |
| 343 | + /* | |
| 344 | + * Unmappings never allocate or free p4d/pud pages. | |
| 345 | + * No work is required here. | |
| 346 | + */ | |
| 347 | +} | |
| 348 | + | |
| 327 | 349 | /* |
| 328 | 350 | * 64-bit: |
| 329 | 351 | * |
| @@ -106,6 +106,19 @@ static unsigned int __ioremap_check_encrypted(struct resource *res) · 105 unmodified lines | ||
| 106 | 106 | return 0; |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | +/* | |
| 110 | + * The EFI runtime services data area is not covered by walk_mem_res(), but must | |
| 111 | + * be mapped encrypted when SEV is active. | |
| 112 | + */ | |
| 113 | +static void __ioremap_check_other(resource_size_t addr, struct ioremap_desc *desc) | |
| 114 | +{ | |
| 115 | + if (!sev_active()) | |
| 116 | + return; | |
| 117 | + | |
| 118 | + if (efi_mem_type(addr) == EFI_RUNTIME_SERVICES_DATA) | |
| 119 | + desc->flags |= IORES_MAP_ENCRYPTED; | |
| 120 | +} | |
| 121 | + | |
| 109 | 122 | static int __ioremap_collect_map_flags(struct resource *res, void *arg) |
| 110 | 123 | { |
| 111 | 124 | struct ioremap_desc *desc = arg; |
| @@ -124,6 +137,9 @@ static int __ioremap_collect_map_flags(struct resource *res, void *arg) · 12 unmodified lines | ||
| 124 | 137 | * To avoid multiple resource walks, this function walks resources marked as |
| 125 | 138 | * IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a |
| 126 | 139 | * resource described not as IORES_DESC_NONE (e.g. IORES_DESC_ACPI_TABLES). |
| 140 | + * | |
| 141 | + * After that, deal with misc other ranges in __ioremap_check_other() which do | |
| 142 | + * not fall into the above category. | |
| 127 | 143 | */ |
| 128 | 144 | static void __ioremap_check_mem(resource_size_t addr, unsigned long size, |
| 129 | 145 | struct ioremap_desc *desc) |
| @@ -135,6 +151,8 @@ static void __ioremap_check_mem(resource_size_t addr, unsigned long size, · 5 unmodified lines | ||
| 135 | 151 | memset(desc, 0, sizeof(struct ioremap_desc)); |
| 136 | 152 | |
| 137 | 153 | walk_mem_res(start, end, desc, __ioremap_collect_map_flags); |
| 154 | + | |
| 155 | + __ioremap_check_other(addr, desc); | |
| 138 | 156 | } |
| 139 | 157 | |
| 140 | 158 | /* |
| @@ -1318,7 +1318,7 @@ static bool iocg_is_idle(struct ioc_gq *iocg) · 1317 unmodified lines | ||
| 1318 | 1318 | return false; |
| 1319 | 1319 | |
| 1320 | 1320 | /* is something in flight? */ |
| 1321 | − if (atomic64_read(&iocg->done_vtime) < atomic64_read(&iocg->vtime)) | |
| 1321 | + if (atomic64_read(&iocg->done_vtime) != atomic64_read(&iocg->vtime)) | |
| 1322 | 1322 | return false; |
| 1323 | 1323 | |
| 1324 | 1324 | return true; |
| @@ -398,6 +398,28 @@ void blk_mq_sched_insert_request(struct request *rq, bool at_head, · 397 unmodified lines | ||
| 398 | 398 | WARN_ON(e && (rq->tag != -1)); |
| 399 | 399 | |
| 400 | 400 | if (blk_mq_sched_bypass_insert(hctx, !!e, rq)) { |
| 401 | + /* | |
| 402 | + * Firstly normal IO request is inserted to scheduler queue or | |
| 403 | + * sw queue, meantime we add flush request to dispatch queue( | |
| 404 | + * hctx->dispatch) directly and there is at most one in-flight | |
| 405 | + * flush request for each hw queue, so it doesn't matter to add | |
| 406 | + * flush request to tail or front of the dispatch queue. | |
| 407 | + * | |
| 408 | + * Secondly in case of NCQ, flush request belongs to non-NCQ | |
| 409 | + * command, and queueing it will fail when there is any | |
| 410 | + * in-flight normal IO request(NCQ command). When adding flush | |
| 411 | + * rq to the front of hctx->dispatch, it is easier to introduce | |
| 412 | + * extra time to flush rq's latency because of S_SCHED_RESTART | |
| 413 | + * compared with adding to the tail of dispatch queue, then | |
| 414 | + * chance of flush merge is increased, and less flush requests | |
| 415 | + * will be issued to controller. It is observed that ~10% time | |
| 416 | + * is saved in blktests block/004 on disk attached to AHCI/NCQ | |
| 417 | + * drive when adding flush rq to the front of hctx->dispatch. | |
| 418 | + * | |
| 419 | + * Simply queue flush rq to the front of hctx->dispatch so that | |
| 420 | + * intensive flush workloads can benefit in case of NCQ HW. | |
| 421 | + */ | |
| 422 | + at_head = (rq->rq_flags & RQF_FLUSH_SEQ) ? true : at_head; | |
| 401 | 423 | blk_mq_request_bypass_insert(rq, at_head, false); |
| 402 | 424 | goto run; |
| 403 | 425 | } |
| @@ -301,6 +301,42 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector) · 300 unmodified lines | ||
| 301 | 301 | } |
| 302 | 302 | EXPORT_SYMBOL_GPL(disk_map_sector_rcu); |
| 303 | 303 | |
| 304 | +/** | |
| 305 | + * disk_has_partitions | |
| 306 | + * @disk: gendisk of interest | |
| 307 | + * | |
| 308 | + * Walk through the partition table and check if valid partition exists. | |
| 309 | + * | |
| 310 | + * CONTEXT: | |
| 311 | + * Don't care. | |
| 312 | + * | |
| 313 | + * RETURNS: | |
| 314 | + * True if the gendisk has at least one valid non-zero size partition. | |
| 315 | + * Otherwise false. | |
| 316 | + */ | |
| 317 | +bool disk_has_partitions(struct gendisk *disk) | |
| 318 | +{ | |
| 319 | + struct disk_part_tbl *ptbl; | |
| 320 | + int i; | |
| 321 | + bool ret = false; | |
| 322 | + | |
| 323 | + rcu_read_lock(); | |
| 324 | + ptbl = rcu_dereference(disk->part_tbl); | |
| 325 | + | |
| 326 | + /* Iterate partitions skipping the whole device at index 0 */ | |
| 327 | + for (i = 1; i < ptbl->len; i++) { | |
| 328 | + if (rcu_dereference(ptbl->part[i])) { | |
| 329 | + ret = true; | |
| 330 | + break; | |
| 331 | + } | |
| 332 | + } | |
| 333 | + | |
| 334 | + rcu_read_unlock(); | |
| 335 | + | |
| 336 | + return ret; | |
| 337 | +} | |
| 338 | +EXPORT_SYMBOL_GPL(disk_has_partitions); | |
| 339 | + | |
| 304 | 340 | /* |
| 305 | 341 | * Can be deleted altogether. Later. |
| 306 | 342 | * |
| @@ -171,7 +171,7 @@ int ghes_estatus_pool_init(int num_ghes) · 170 unmodified lines | ||
| 171 | 171 | * New allocation must be visible in all pgd before it can be found by |
| 172 | 172 | * an NMI allocating from the pool. |
| 173 | 173 | */ |
| 174 | − vmalloc_sync_all(); | |
| 174 | + vmalloc_sync_mappings(); | |
| 175 | 175 | |
| 176 | 176 | rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); |
| 177 | 177 | if (rc) |
| @@ -439,6 +439,7 @@ static int binderfs_binder_ctl_create(struct super_block *sb) · 438 unmodified lines | ||
| 439 | 439 | inode->i_uid = info->root_uid; |
| 440 | 440 | inode->i_gid = info->root_gid; |
| 441 | 441 | |
| 442 | + refcount_set(&device->ref, 1); | |
| 442 | 443 | device->binderfs_inode = inode; |
| 443 | 444 | device->miscdev.minor = minor; |
| 444 | 445 | |
| @@ -91,7 +91,7 @@ · 90 unmodified lines | ||
| 91 | 91 | #ifdef GENERAL_DEBUG |
| 92 | 92 | #define PRINTK(args...) printk(args) |
| 93 | 93 | #else |
| 94 | −#define PRINTK(args...) | |
| 94 | +#define PRINTK(args...) do {} while (0) | |
| 95 | 95 | #endif /* GENERAL_DEBUG */ |
| 96 | 96 | |
| 97 | 97 | #ifdef EXTRA_DEBUG |
| @@ -111,7 +111,7 @@ config CFAG12864B · 110 unmodified lines | ||
| 111 | 111 | If unsure, say N. |
| 112 | 112 | |
| 113 | 113 | config CFAG12864B_RATE |
| 114 | − int "Refresh rate (hertz)" | |
| 114 | + int "Refresh rate (hertz)" | |
| 115 | 115 | depends on CFAG12864B |
| 116 | 116 | default "20" |
| 117 | 117 | ---help--- |
| @@ -329,7 +329,7 @@ config PANEL_LCD_PROTO · 211 unmodified lines | ||
| 329 | 329 | |
| 330 | 330 | config PANEL_LCD_PIN_E |
| 331 | 331 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" |
| 332 | − int "Parallel port pin number & polarity connected to the LCD E signal (-17...17) " | |
| 332 | + int "Parallel port pin number & polarity connected to the LCD E signal (-17...17) " | |
| 333 | 333 | range -17 17 |
| 334 | 334 | default 14 |
| 335 | 335 | ---help--- |
| @@ -344,7 +344,7 @@ config PANEL_LCD_PIN_E · 8 unmodified lines | ||
| 344 | 344 | |
| 345 | 345 | config PANEL_LCD_PIN_RS |
| 346 | 346 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" |
| 347 | − int "Parallel port pin number & polarity connected to the LCD RS signal (-17...17) " | |
| 347 | + int "Parallel port pin number & polarity connected to the LCD RS signal (-17...17) " | |
| 348 | 348 | range -17 17 |
| 349 | 349 | default 17 |
| 350 | 350 | ---help--- |
| @@ -359,7 +359,7 @@ config PANEL_LCD_PIN_RS · 8 unmodified lines | ||
| 359 | 359 | |
| 360 | 360 | config PANEL_LCD_PIN_RW |
| 361 | 361 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" |
| 362 | − int "Parallel port pin number & polarity connected to the LCD RW signal (-17...17) " | |
| 362 | + int "Parallel port pin number & polarity connected to the LCD RW signal (-17...17) " | |
| 363 | 363 | range -17 17 |
| 364 | 364 | default 16 |
| 365 | 365 | ---help--- |
| @@ -374,7 +374,7 @@ config PANEL_LCD_PIN_RW · 8 unmodified lines | ||
| 374 | 374 | |
| 375 | 375 | config PANEL_LCD_PIN_SCL |
| 376 | 376 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0" |
| 377 | − int "Parallel port pin number & polarity connected to the LCD SCL signal (-17...17) " | |
| 377 | + int "Parallel port pin number & polarity connected to the LCD SCL signal (-17...17) " | |
| 378 | 378 | range -17 17 |
| 379 | 379 | default 1 |
| 380 | 380 | ---help--- |
| @@ -389,7 +389,7 @@ config PANEL_LCD_PIN_SCL · 8 unmodified lines | ||
| 389 | 389 | |
| 390 | 390 | config PANEL_LCD_PIN_SDA |
| 391 | 391 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0" |
| 392 | − int "Parallel port pin number & polarity connected to the LCD SDA signal (-17...17) " | |
| 392 | + int "Parallel port pin number & polarity connected to the LCD SDA signal (-17...17) " | |
| 393 | 393 | range -17 17 |
| 394 | 394 | default 2 |
| 395 | 395 | ---help--- |
| @@ -404,12 +404,12 @@ config PANEL_LCD_PIN_SDA · 8 unmodified lines | ||
| 404 | 404 | |
| 405 | 405 | config PANEL_LCD_PIN_BL |
| 406 | 406 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" |
| 407 | − int "Parallel port pin number & polarity connected to the LCD backlight signal (-17...17) " | |
| 407 | + int "Parallel port pin number & polarity connected to the LCD backlight signal (-17...17) " | |
| 408 | 408 | range -17 17 |
| 409 | 409 | default 0 |
| 410 | 410 | ---help--- |
| 411 | 411 | This describes the number of the parallel port pin to which the LCD 'BL' signal |
| 412 | − has been connected. It can be : | |
| 412 | + has been connected. It can be : | |
| 413 | 413 | |
| 414 | 414 | 0 : no connection (eg: connected to ground) |
| 415 | 415 | 1..17 : directly connected to any of these pins on the DB25 plug |
| @@ -86,7 +86,7 @@ struct charlcd_priv { · 85 unmodified lines | ||
| 86 | 86 | int len; |
| 87 | 87 | } esc_seq; |
| 88 | 88 | |
| 89 | − unsigned long long drvdata[0]; | |
| 89 | + unsigned long long drvdata[]; | |
| 90 | 90 | }; |
| 91 | 91 | |
| 92 | 92 | #define charlcd_to_priv(p) container_of(p, struct charlcd_priv, lcd) |
| @@ -356,7 +356,6 @@ static int img_ascii_lcd_probe(struct platform_device *pdev) · 355 unmodified lines | ||
| 356 | 356 | const struct of_device_id *match; |
| 357 | 357 | const struct img_ascii_lcd_config *cfg; |
| 358 | 358 | struct img_ascii_lcd_ctx *ctx; |
| 359 | − struct resource *res; | |
| 360 | 359 | int err; |
| 361 | 360 | |
| 362 | 361 | match = of_match_device(img_ascii_lcd_matches, &pdev->dev); |
| @@ -378,8 +377,7 @@ static int img_ascii_lcd_probe(struct platform_device *pdev) · 15 unmodified lines | ||
| 378 | 377 | &ctx->offset)) |
| 379 | 378 | return -EINVAL; |
| 380 | 379 | } else { |
| 381 | − res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
| 382 | − ctx->base = devm_ioremap_resource(&pdev->dev, res); | |
| 380 | + ctx->base = devm_platform_ioremap_resource(pdev, 0); | |
| 383 | 381 | if (IS_ERR(ctx->base)) |
| 384 | 382 | return PTR_ERR(ctx->base); |
| 385 | 383 | } |
| @@ -363,10 +363,10 @@ static void setup_pdev_dma_masks(struct platform_device *pdev) · 362 unmodified lines | ||
| 363 | 363 | { |
| 364 | 364 | if (!pdev->dev.coherent_dma_mask) |
| 365 | 365 | pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); |
| 366 | − if (!pdev->dma_mask) | |
| 367 | − pdev->dma_mask = DMA_BIT_MASK(32); | |
| 368 | − if (!pdev->dev.dma_mask) | |
| 369 | − pdev->dev.dma_mask = &pdev->dma_mask; | |
| 366 | + if (!pdev->dev.dma_mask) { | |
| 367 | + pdev->platform_dma_mask = DMA_BIT_MASK(32); | |
| 368 | + pdev->dev.dma_mask = &pdev->platform_dma_mask; | |
| 369 | + } | |
| 370 | 370 | }; |
| 371 | 371 | |
| 372 | 372 | /** |
| @@ -662,20 +662,8 @@ struct platform_device *platform_device_register_full( · 289 unmodified lines | ||
| 662 | 662 | pdev->dev.of_node_reused = pdevinfo->of_node_reused; |
| 663 | 663 | |
| 664 | 664 | if (pdevinfo->dma_mask) { |
| 665 | − /* | |
| 666 | − * This memory isn't freed when the device is put, | |
| 667 | − * I don't have a nice idea for that though. Conceptually | |
| 668 | − * dma_mask in struct device should not be a pointer. | |
| 669 | − * See http://thread.gmane.org/gmane.linux.kernel.pci/9081 | |
| 670 | − */ | |
| 671 | − pdev->dev.dma_mask = | |
| 672 | − kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL); | |
| 673 | − if (!pdev->dev.dma_mask) | |
| 674 | − goto err; | |
| 675 | − | |
| 676 | − kmemleak_ignore(pdev->dev.dma_mask); | |
| 677 | − | |
| 678 | − *pdev->dev.dma_mask = pdevinfo->dma_mask; | |
| 665 | + pdev->platform_dma_mask = pdevinfo->dma_mask; | |
| 666 | + pdev->dev.dma_mask = &pdev->platform_dma_mask; | |
| 679 | 667 | pdev->dev.coherent_dma_mask = pdevinfo->dma_mask; |
| 680 | 668 | } |
| 681 | 669 | |
| @@ -700,7 +688,6 @@ struct platform_device *platform_device_register_full( · 18 unmodified lines | ||
| 700 | 688 | if (ret) { |
| 701 | 689 | err: |
| 702 | 690 | ACPI_COMPANION_SET(&pdev->dev, NULL); |
| 703 | − kfree(pdev->dev.dma_mask); | |
| 704 | 691 | platform_device_put(pdev); |
| 705 | 692 | return ERR_PTR(ret); |
| 706 | 693 | } |
| @@ -245,13 +245,20 @@ static blk_status_t virtio_queue_rq(struct blk_mq_hw_ctx *hctx, · 244 unmodified lines | ||
| 245 | 245 | err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num); |
| 246 | 246 | if (err) { |
| 247 | 247 | virtqueue_kick(vblk->vqs[qid].vq); |
| 248 | − blk_mq_stop_hw_queue(hctx); | |
| 248 | + /* Don't stop the queue if -ENOMEM: we may have failed to | |
| 249 | + * bounce the buffer due to global resource outage. | |
| 250 | + */ | |
| 251 | + if (err == -ENOSPC) | |
| 252 | + blk_mq_stop_hw_queue(hctx); | |
| 249 | 253 | spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); |
| 250 | − /* Out of mem doesn't actually happen, since we fall back | |
| 251 | − * to direct descriptors */ | |
| 252 | − if (err == -ENOMEM || err == -ENOSPC) | |
| 254 | + switch (err) { | |
| 255 | + case -ENOSPC: | |
| 253 | 256 | return BLK_STS_DEV_RESOURCE; |
| 254 | − return BLK_STS_IOERR; | |
| 257 | + case -ENOMEM: | |
| 258 | + return BLK_STS_RESOURCE; | |
| 259 | + default: | |
| 260 | + return BLK_STS_IOERR; | |
| 261 | + } | |
| 255 | 262 | } |
| 256 | 263 | |
| 257 | 264 | if (bd->last && virtqueue_kick_prepare(vblk->vqs[qid].vq)) |
| @@ -194,7 +194,7 @@ static int platform_ipmi_probe(struct platform_device *pdev) · 193 unmodified lines | ||
| 194 | 194 | else |
| 195 | 195 | io.slave_addr = slave_addr; |
| 196 | 196 | |
| 197 | − io.irq = platform_get_irq(pdev, 0); | |
| 197 | + io.irq = platform_get_irq_optional(pdev, 0); | |
| 198 | 198 | if (io.irq > 0) |
| 199 | 199 | io.irq_setup = ipmi_std_irq_setup; |
| 200 | 200 | else |
| @@ -378,7 +378,7 @@ static int acpi_ipmi_probe(struct platform_device *pdev) · 177 unmodified lines | ||
| 378 | 378 | io.irq = tmp; |
| 379 | 379 | io.irq_setup = acpi_gpe_irq_setup; |
| 380 | 380 | } else { |
| 381 | − int irq = platform_get_irq(pdev, 0); | |
| 381 | + int irq = platform_get_irq_optional(pdev, 0); | |
| 382 | 382 | |
| 383 | 383 | if (irq > 0) { |
| 384 | 384 | io.irq = irq; |
| @@ -4713,7 +4713,7 @@ EXPORT_SYMBOL(of_clk_get_by_name); · 4712 unmodified lines | ||
| 4713 | 4713 | * |
| 4714 | 4714 | * Returns: The number of clocks that are possible parents of this node |
| 4715 | 4715 | */ |
| 4716 | −unsigned int of_clk_get_parent_count(struct device_node *np) | |
| 4716 | +unsigned int of_clk_get_parent_count(const struct device_node *np) | |
| 4717 | 4717 | { |
| 4718 | 4718 | int count; |
| 4719 | 4719 | |
| @@ -4725,7 +4725,7 @@ unsigned int of_clk_get_parent_count(struct device_node *np) · 5 unmodified lines | ||
| 4725 | 4725 | } |
| 4726 | 4726 | EXPORT_SYMBOL_GPL(of_clk_get_parent_count); |
| 4727 | 4727 | |
| 4728 | −const char *of_clk_get_parent_name(struct device_node *np, int index) | |
| 4728 | +const char *of_clk_get_parent_name(const struct device_node *np, int index) | |
| 4729 | 4729 | { |
| 4730 | 4730 | struct of_phandle_args clkspec; |
| 4731 | 4731 | struct property *prop; |
| @@ -592,24 +592,6 @@ static struct clk_branch disp_cc_mdss_rot_clk = { · 591 unmodified lines | ||
| 592 | 592 | }, |
| 593 | 593 | }; |
| 594 | 594 | |
| 595 | −static struct clk_branch disp_cc_mdss_rscc_ahb_clk = { | |
| 596 | − .halt_reg = 0x400c, | |
| 597 | − .halt_check = BRANCH_HALT, | |
| 598 | − .clkr = { | |
| 599 | − .enable_reg = 0x400c, | |
| 600 | − .enable_mask = BIT(0), | |
| 601 | − .hw.init = &(struct clk_init_data){ | |
| 602 | − .name = "disp_cc_mdss_rscc_ahb_clk", | |
| 603 | − .parent_data = &(const struct clk_parent_data){ | |
| 604 | − .hw = &disp_cc_mdss_ahb_clk_src.clkr.hw, | |
| 605 | − }, | |
| 606 | − .num_parents = 1, | |
| 607 | − .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, | |
| 608 | − .ops = &clk_branch2_ops, | |
| 609 | − }, | |
| 610 | − }, | |
| 611 | −}; | |
| 612 | − | |
| 613 | 595 | static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { |
| 614 | 596 | .halt_reg = 0x4008, |
| 615 | 597 | .halt_check = BRANCH_HALT, |
| @@ -687,7 +669,6 @@ static struct clk_regmap *disp_cc_sc7180_clocks[] = { · 71 unmodified lines | ||
| 687 | 669 | [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, |
| 688 | 670 | [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, |
| 689 | 671 | [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr, |
| 690 | − [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr, | |
| 691 | 672 | [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, |
| 692 | 673 | [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, |
| 693 | 674 | [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, |
| @@ -97,7 +97,7 @@ static struct clk_branch video_cc_vcodec0_axi_clk = { · 96 unmodified lines | ||
| 97 | 97 | |
| 98 | 98 | static struct clk_branch video_cc_vcodec0_core_clk = { |
| 99 | 99 | .halt_reg = 0x890, |
| 100 | − .halt_check = BRANCH_HALT, | |
| 100 | + .halt_check = BRANCH_HALT_VOTED, | |
| 101 | 101 | .clkr = { |
| 102 | 102 | .enable_reg = 0x890, |
| 103 | 103 | .enable_mask = BIT(0), |
| @@ -83,13 +83,16 @@ static ssize_t · 82 unmodified lines | ||
| 83 | 83 | efivar_attr_read(struct efivar_entry *entry, char *buf) |
| 84 | 84 | { |
| 85 | 85 | struct efi_variable *var = &entry->var; |
| 86 | + unsigned long size = sizeof(var->Data); | |
| 86 | 87 | char *str = buf; |
| 88 | + int ret; | |
| 87 | 89 | |
| 88 | 90 | if (!entry || !buf) |
| 89 | 91 | return -EINVAL; |
| 90 | 92 | |
| 91 | − var->DataSize = 1024; | |
| 92 | − if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | |
| 93 | + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); | |
| 94 | + var->DataSize = size; | |
| 95 | + if (ret) | |
| 93 | 96 | return -EIO; |
| 94 | 97 | |
| 95 | 98 | if (var->Attributes & EFI_VARIABLE_NON_VOLATILE) |
| @@ -116,13 +119,16 @@ static ssize_t · 20 unmodified lines | ||
| 116 | 119 | efivar_size_read(struct efivar_entry *entry, char *buf) |
| 117 | 120 | { |
| 118 | 121 | struct efi_variable *var = &entry->var; |
| 122 | + unsigned long size = sizeof(var->Data); | |
| 119 | 123 | char *str = buf; |
| 124 | + int ret; | |
| 120 | 125 | |
| 121 | 126 | if (!entry || !buf) |
| 122 | 127 | return -EINVAL; |
| 123 | 128 | |
| 124 | − var->DataSize = 1024; | |
| 125 | − if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | |
| 129 | + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); | |
| 130 | + var->DataSize = size; | |
| 131 | + if (ret) | |
| 126 | 132 | return -EIO; |
| 127 | 133 | |
| 128 | 134 | str += sprintf(str, "0x%lx\n", var->DataSize); |
| @@ -133,12 +139,15 @@ static ssize_t · 4 unmodified lines | ||
| 133 | 139 | efivar_data_read(struct efivar_entry *entry, char *buf) |
| 134 | 140 | { |
| 135 | 141 | struct efi_variable *var = &entry->var; |
| 142 | + unsigned long size = sizeof(var->Data); | |
| 143 | + int ret; | |
| 136 | 144 | |
| 137 | 145 | if (!entry || !buf) |
| 138 | 146 | return -EINVAL; |
| 139 | 147 | |
| 140 | − var->DataSize = 1024; | |
| 141 | − if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | |
| 148 | + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); | |
| 149 | + var->DataSize = size; | |
| 150 | + if (ret) | |
| 142 | 151 | return -EIO; |
| 143 | 152 | |
| 144 | 153 | memcpy(buf, var->Data, var->DataSize); |
| @@ -199,6 +208,9 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count) · 54 unmodified lines | ||
| 199 | 208 | u8 *data; |
| 200 | 209 | int err; |
| 201 | 210 | |
| 211 | + if (!entry || !buf) | |
| 212 | + return -EINVAL; | |
| 213 | + | |
| 202 | 214 | if (in_compat_syscall()) { |
| 203 | 215 | struct compat_efi_variable *compat; |
| 204 | 216 | |
| @@ -250,14 +262,16 @@ efivar_show_raw(struct efivar_entry *entry, char *buf) · 45 unmodified lines | ||
| 250 | 262 | { |
| 251 | 263 | struct efi_variable *var = &entry->var; |
| 252 | 264 | struct compat_efi_variable *compat; |
| 265 | + unsigned long datasize = sizeof(var->Data); | |
| 253 | 266 | size_t size; |
| 267 | + int ret; | |
| 254 | 268 | |
| 255 | 269 | if (!entry || !buf) |
| 256 | 270 | return 0; |
| 257 | 271 | |
| 258 | − var->DataSize = 1024; | |
| 259 | − if (efivar_entry_get(entry, &entry->var.Attributes, | |
| 260 | − &entry->var.DataSize, entry->var.Data)) | |
| 272 | + ret = efivar_entry_get(entry, &var->Attributes, &datasize, var->Data); | |
| 273 | + var->DataSize = datasize; | |
| 274 | + if (ret) | |
| 261 | 275 | return -EIO; |
| 262 | 276 | |
| 263 | 277 | if (in_compat_syscall()) { |
| @@ -781,11 +781,11 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf, · 780 unmodified lines | ||
| 781 | 781 | ssize_t result = 0; |
| 782 | 782 | uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; |
| 783 | 783 | |
| 784 | − if (size & 3 || *pos & 3) | |
| 784 | + if (size > 4096 || size & 3 || *pos & 3) | |
| 785 | 785 | return -EINVAL; |
| 786 | 786 | |
| 787 | 787 | /* decode offset */ |
| 788 | − offset = *pos & GENMASK_ULL(11, 0); | |
| 788 | + offset = (*pos & GENMASK_ULL(11, 0)) >> 2; | |
| 789 | 789 | se = (*pos & GENMASK_ULL(19, 12)) >> 12; |
| 790 | 790 | sh = (*pos & GENMASK_ULL(27, 20)) >> 20; |
| 791 | 791 | cu = (*pos & GENMASK_ULL(35, 28)) >> 28; |
| @@ -823,7 +823,7 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf, · 31 unmodified lines | ||
| 823 | 823 | while (size) { |
| 824 | 824 | uint32_t value; |
| 825 | 825 | |
| 826 | − value = data[offset++]; | |
| 826 | + value = data[result >> 2]; | |
| 827 | 827 | r = put_user(value, (uint32_t *)buf); |
| 828 | 828 | if (r) { |
| 829 | 829 | result = r; |
| @@ -3913,6 +3913,8 @@ static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive, · 3912 unmodified lines | ||
| 3913 | 3913 | if (r) |
| 3914 | 3914 | goto out; |
| 3915 | 3915 | |
| 3916 | + amdgpu_fbdev_set_suspend(tmp_adev, 0); | |
| 3917 | + | |
| 3916 | 3918 | /* must succeed. */ |
| 3917 | 3919 | amdgpu_ras_resume(tmp_adev); |
| 3918 | 3920 | |
| @@ -4086,6 +4088,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, · 167 unmodified lines | ||
| 4086 | 4088 | */ |
| 4087 | 4089 | amdgpu_unregister_gpu_instance(tmp_adev); |
| 4088 | 4090 | |
| 4091 | + amdgpu_fbdev_set_suspend(adev, 1); | |
| 4092 | + | |
| 4089 | 4093 | /* disable ras on ALL IPs */ |
| 4090 | 4094 | if (!(in_ras_intr && !use_baco) && |
| 4091 | 4095 | amdgpu_device_ip_need_full_reset(tmp_adev)) |
| @@ -693,7 +693,7 @@ static int jpeg_v2_0_set_clockgating_state(void *handle, · 692 unmodified lines | ||
| 693 | 693 | bool enable = (state == AMD_CG_STATE_GATE); |
| 694 | 694 | |
| 695 | 695 | if (enable) { |
| 696 | − if (jpeg_v2_0_is_idle(handle)) | |
| 696 | + if (!jpeg_v2_0_is_idle(handle)) | |
| 697 | 697 | return -EBUSY; |
| 698 | 698 | jpeg_v2_0_enable_clock_gating(adev); |
| 699 | 699 | } else { |
| @@ -477,7 +477,7 @@ static int jpeg_v2_5_set_clockgating_state(void *handle, · 476 unmodified lines | ||
| 477 | 477 | continue; |
| 478 | 478 | |
| 479 | 479 | if (enable) { |
| 480 | − if (jpeg_v2_5_is_idle(handle)) | |
| 480 | + if (!jpeg_v2_5_is_idle(handle)) | |
| 481 | 481 | return -EBUSY; |
| 482 | 482 | jpeg_v2_5_enable_clock_gating(adev, i); |
| 483 | 483 | } else { |
| @@ -89,6 +89,13 @@ · 88 unmodified lines | ||
| 89 | 89 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L |
| 90 | 90 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L |
| 91 | 91 | #define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 |
| 92 | + | |
| 93 | +/* for Vega20/arcturus regiter offset change */ | |
| 94 | +#define mmROM_INDEX_VG20 0x00e4 | |
| 95 | +#define mmROM_INDEX_VG20_BASE_IDX 0 | |
| 96 | +#define mmROM_DATA_VG20 0x00e5 | |
| 97 | +#define mmROM_DATA_VG20_BASE_IDX 0 | |
| 98 | + | |
| 92 | 99 | /* |
| 93 | 100 | * Indirect registers accessor |
| 94 | 101 | */ |
| @@ -309,6 +316,8 @@ static bool soc15_read_bios_from_rom(struct amdgpu_device *adev, · 214 unmodified lines | ||
| 309 | 316 | { |
| 310 | 317 | u32 *dw_ptr; |
| 311 | 318 | u32 i, length_dw; |
| 319 | + uint32_t rom_index_offset; | |
| 320 | + uint32_t rom_data_offset; | |
| 312 | 321 | |
| 313 | 322 | if (bios == NULL) |
| 314 | 323 | return false; |
| @@ -321,11 +330,23 @@ static bool soc15_read_bios_from_rom(struct amdgpu_device *adev, · 6 unmodified lines | ||
| 321 | 330 | dw_ptr = (u32 *)bios; |
| 322 | 331 | length_dw = ALIGN(length_bytes, 4) / 4; |
| 323 | 332 | |
| 333 | + switch (adev->asic_type) { | |
| 334 | + case CHIP_VEGA20: | |
| 335 | + case CHIP_ARCTURUS: | |
| 336 | + rom_index_offset = SOC15_REG_OFFSET(SMUIO, 0, mmROM_INDEX_VG20); | |
| 337 | + rom_data_offset = SOC15_REG_OFFSET(SMUIO, 0, mmROM_DATA_VG20); | |
| 338 | + break; | |
| 339 | + default: | |
| 340 | + rom_index_offset = SOC15_REG_OFFSET(SMUIO, 0, mmROM_INDEX); | |
| 341 | + rom_data_offset = SOC15_REG_OFFSET(SMUIO, 0, mmROM_DATA); | |
| 342 | + break; | |
| 343 | + } | |
| 344 | + | |
| 324 | 345 | /* set rom index to 0 */ |
| 325 | − WREG32(SOC15_REG_OFFSET(SMUIO, 0, mmROM_INDEX), 0); | |
| 346 | + WREG32(rom_index_offset, 0); | |
| 326 | 347 | /* read out the rom data */ |
| 327 | 348 | for (i = 0; i < length_dw; i++) |
| 328 | − dw_ptr[i] = RREG32(SOC15_REG_OFFSET(SMUIO, 0, mmROM_DATA)); | |
| 349 | + dw_ptr[i] = RREG32(rom_data_offset); | |
| 329 | 350 | |
| 330 | 351 | return true; |
| 331 | 352 | } |
| @@ -1352,7 +1352,7 @@ static int vcn_v1_0_set_clockgating_state(void *handle, · 1351 unmodified lines | ||
| 1352 | 1352 | |
| 1353 | 1353 | if (enable) { |
| 1354 | 1354 | /* wait for STATUS to clear */ |
| 1355 | − if (vcn_v1_0_is_idle(handle)) | |
| 1355 | + if (!vcn_v1_0_is_idle(handle)) | |
| 1356 | 1356 | return -EBUSY; |
| 1357 | 1357 | vcn_v1_0_enable_clock_gating(adev); |
| 1358 | 1358 | } else { |
| @@ -1217,7 +1217,7 @@ static int vcn_v2_0_set_clockgating_state(void *handle, · 1216 unmodified lines | ||
| 1217 | 1217 | |
| 1218 | 1218 | if (enable) { |
| 1219 | 1219 | /* wait for STATUS to clear */ |
| 1220 | − if (vcn_v2_0_is_idle(handle)) | |
| 1220 | + if (!vcn_v2_0_is_idle(handle)) | |
| 1221 | 1221 | return -EBUSY; |
| 1222 | 1222 | vcn_v2_0_enable_clock_gating(adev); |
| 1223 | 1223 | } else { |
| @@ -1672,7 +1672,7 @@ static int vcn_v2_5_set_clockgating_state(void *handle, · 1671 unmodified lines | ||
| 1672 | 1672 | return 0; |
| 1673 | 1673 | |
| 1674 | 1674 | if (enable) { |
| 1675 | − if (vcn_v2_5_is_idle(handle)) | |
| 1675 | + if (!vcn_v2_5_is_idle(handle)) | |
| 1676 | 1676 | return -EBUSY; |
| 1677 | 1677 | vcn_v2_5_enable_clock_gating(adev); |
| 1678 | 1678 | } else { |
| @@ -522,8 +522,9 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params) · 521 unmodified lines | ||
| 522 | 522 | |
| 523 | 523 | acrtc_state = to_dm_crtc_state(acrtc->base.state); |
| 524 | 524 | |
| 525 | − DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id, | |
| 526 | − amdgpu_dm_vrr_active(acrtc_state)); | |
| 525 | + DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d, planes:%d\n", acrtc->crtc_id, | |
| 526 | + amdgpu_dm_vrr_active(acrtc_state), | |
| 527 | + acrtc_state->active_planes); | |
| 527 | 528 | |
| 528 | 529 | amdgpu_dm_crtc_handle_crc_irq(&acrtc->base); |
| 529 | 530 | drm_crtc_handle_vblank(&acrtc->base); |
| @@ -543,7 +544,18 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params) · 13 unmodified lines | ||
| 543 | 544 | &acrtc_state->vrr_params.adjust); |
| 544 | 545 | } |
| 545 | 546 | |
| 546 | − if (acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED) { | |
| 547 | + /* | |
| 548 | + * If there aren't any active_planes then DCH HUBP may be clock-gated. | |
| 549 | + * In that case, pageflip completion interrupts won't fire and pageflip | |
| 550 | + * completion events won't get delivered. Prevent this by sending | |
| 551 | + * pending pageflip events from here if a flip is still pending. | |
| 552 | + * | |
| 553 | + * If any planes are enabled, use dm_pflip_high_irq() instead, to | |
| 554 | + * avoid race conditions between flip programming and completion, | |
| 555 | + * which could cause too early flip completion events. | |
| 556 | + */ | |
| 557 | + if (acrtc->pflip_status == AMDGPU_FLIP_SUBMITTED && | |
| 558 | + acrtc_state->active_planes == 0) { | |
| 547 | 559 | if (acrtc->event) { |
| 548 | 560 | drm_crtc_send_vblank_event(&acrtc->base, acrtc->event); |
| 549 | 561 | acrtc->event = NULL; |
| @@ -3401,6 +3401,17 @@ static bool retrieve_link_cap(struct dc_link *link) · 3400 unmodified lines | ||
| 3401 | 3401 | sink_id.ieee_device_id, |
| 3402 | 3402 | sizeof(sink_id.ieee_device_id)); |
| 3403 | 3403 | |
| 3404 | + /* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */ | |
| 3405 | + { | |
| 3406 | + uint8_t str_mbp_2017[] = { 101, 68, 21, 101, 98, 97 }; | |
| 3407 | + | |
| 3408 | + if ((link->dpcd_caps.sink_dev_id == 0x0010fa) && | |
| 3409 | + !memcmp(link->dpcd_caps.sink_dev_id_str, str_mbp_2017, | |
| 3410 | + sizeof(str_mbp_2017))) { | |
| 3411 | + link->reported_link_cap.link_rate = 0x0c; | |
| 3412 | + } | |
| 3413 | + } | |
| 3414 | + | |
| 3404 | 3415 | core_link_read_dpcd( |
| 3405 | 3416 | link, |
| 3406 | 3417 | DP_SINK_HW_REVISION_START, |
| @@ -108,7 +108,6 @@ static const struct hwseq_private_funcs dcn20_private_funcs = { · 107 unmodified lines | ||
| 108 | 108 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, |
| 109 | 109 | .dpp_pg_control = dcn20_dpp_pg_control, |
| 110 | 110 | .hubp_pg_control = dcn20_hubp_pg_control, |
| 111 | − .dsc_pg_control = NULL, | |
| 112 | 111 | .update_odm = dcn20_update_odm, |
| 113 | 112 | .dsc_pg_control = dcn20_dsc_pg_control, |
| 114 | 113 | .get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color, |
| @@ -335,6 +335,117 @@ struct _vcs_dpi_soc_bounding_box_st dcn2_0_soc = { · 334 unmodified lines | ||
| 335 | 335 | .use_urgent_burst_bw = 0 |
| 336 | 336 | }; |
| 337 | 337 | |
| 338 | +struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv14_soc = { | |
| 339 | + .clock_limits = { | |
| 340 | + { | |
| 341 | + .state = 0, | |
| 342 | + .dcfclk_mhz = 560.0, | |
| 343 | + .fabricclk_mhz = 560.0, | |
| 344 | + .dispclk_mhz = 513.0, | |
| 345 | + .dppclk_mhz = 513.0, | |
| 346 | + .phyclk_mhz = 540.0, | |
| 347 | + .socclk_mhz = 560.0, | |
| 348 | + .dscclk_mhz = 171.0, | |
| 349 | + .dram_speed_mts = 8960.0, | |
| 350 | + }, | |
| 351 | + { | |
| 352 | + .state = 1, | |
| 353 | + .dcfclk_mhz = 694.0, | |
| 354 | + .fabricclk_mhz = 694.0, | |
| 355 | + .dispclk_mhz = 642.0, | |
| 356 | + .dppclk_mhz = 642.0, | |
| 357 | + .phyclk_mhz = 600.0, | |
| 358 | + .socclk_mhz = 694.0, | |
| 359 | + .dscclk_mhz = 214.0, | |
| 360 | + .dram_speed_mts = 11104.0, | |
| 361 | + }, | |
| 362 | + { | |
| 363 | + .state = 2, | |
| 364 | + .dcfclk_mhz = 875.0, | |
| 365 | + .fabricclk_mhz = 875.0, | |
| 366 | + .dispclk_mhz = 734.0, | |
| 367 | + .dppclk_mhz = 734.0, | |
| 368 | + .phyclk_mhz = 810.0, | |
| 369 | + .socclk_mhz = 875.0, | |
| 370 | + .dscclk_mhz = 245.0, | |
| 371 | + .dram_speed_mts = 14000.0, | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + .state = 3, | |
| 375 | + .dcfclk_mhz = 1000.0, | |
| 376 | + .fabricclk_mhz = 1000.0, | |
| 377 | + .dispclk_mhz = 1100.0, | |
| 378 | + .dppclk_mhz = 1100.0, | |
| 379 | + .phyclk_mhz = 810.0, | |
| 380 | + .socclk_mhz = 1000.0, | |
| 381 | + .dscclk_mhz = 367.0, | |
| 382 | + .dram_speed_mts = 16000.0, | |
| 383 | + }, | |
| 384 | + { | |
| 385 | + .state = 4, | |
| 386 | + .dcfclk_mhz = 1200.0, | |
| 387 | + .fabricclk_mhz = 1200.0, | |
| 388 | + .dispclk_mhz = 1284.0, | |
| 389 | + .dppclk_mhz = 1284.0, | |
| 390 | + .phyclk_mhz = 810.0, | |
| 391 | + .socclk_mhz = 1200.0, | |
| 392 | + .dscclk_mhz = 428.0, | |
| 393 | + .dram_speed_mts = 16000.0, | |
| 394 | + }, | |
| 395 | + /*Extra state, no dispclk ramping*/ | |
| 396 | + { | |
| 397 | + .state = 5, | |
| 398 | + .dcfclk_mhz = 1200.0, | |
| 399 | + .fabricclk_mhz = 1200.0, | |
| 400 | + .dispclk_mhz = 1284.0, | |
| 401 | + .dppclk_mhz = 1284.0, | |
| 402 | + .phyclk_mhz = 810.0, | |
| 403 | + .socclk_mhz = 1200.0, | |
| 404 | + .dscclk_mhz = 428.0, | |
| 405 | + .dram_speed_mts = 16000.0, | |
| 406 | + }, | |
| 407 | + }, | |
| 408 | + .num_states = 5, | |
| 409 | + .sr_exit_time_us = 8.6, | |
| 410 | + .sr_enter_plus_exit_time_us = 10.9, | |
| 411 | + .urgent_latency_us = 4.0, | |
| 412 | + .urgent_latency_pixel_data_only_us = 4.0, | |
| 413 | + .urgent_latency_pixel_mixed_with_vm_data_us = 4.0, | |
| 414 | + .urgent_latency_vm_data_only_us = 4.0, | |
| 415 | + .urgent_out_of_order_return_per_channel_pixel_only_bytes = 4096, | |
| 416 | + .urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 4096, | |
| 417 | + .urgent_out_of_order_return_per_channel_vm_only_bytes = 4096, | |
| 418 | + .pct_ideal_dram_sdp_bw_after_urgent_pixel_only = 40.0, | |
| 419 | + .pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm = 40.0, | |
| 420 | + .pct_ideal_dram_sdp_bw_after_urgent_vm_only = 40.0, | |
| 421 | + .max_avg_sdp_bw_use_normal_percent = 40.0, | |
| 422 | + .max_avg_dram_bw_use_normal_percent = 40.0, | |
| 423 | + .writeback_latency_us = 12.0, | |
| 424 | + .ideal_dram_bw_after_urgent_percent = 40.0, | |
| 425 | + .max_request_size_bytes = 256, | |
| 426 | + .dram_channel_width_bytes = 2, | |
| 427 | + .fabric_datapath_to_dcn_data_return_bytes = 64, | |
| 428 | + .dcn_downspread_percent = 0.5, | |
| 429 | + .downspread_percent = 0.38, | |
| 430 | + .dram_page_open_time_ns = 50.0, | |
| 431 | + .dram_rw_turnaround_time_ns = 17.5, | |
| 432 | + .dram_return_buffer_per_channel_bytes = 8192, | |
| 433 | + .round_trip_ping_latency_dcfclk_cycles = 131, | |
| 434 | + .urgent_out_of_order_return_per_channel_bytes = 256, | |
| 435 | + .channel_interleave_bytes = 256, | |
| 436 | + .num_banks = 8, | |
| 437 | + .num_chans = 8, | |
| 438 | + .vmm_page_size_bytes = 4096, | |
| 439 | + .dram_clock_change_latency_us = 404.0, | |
| 440 | + .dummy_pstate_latency_us = 5.0, | |
| 441 | + .writeback_dram_clock_change_latency_us = 23.0, | |
| 442 | + .return_bus_width_bytes = 64, | |
| 443 | + .dispclk_dppclk_vco_speed_mhz = 3850, | |
| 444 | + .xfc_bus_transport_time_us = 20, | |
| 445 | + .xfc_xbuf_latency_tolerance_us = 4, | |
| 446 | + .use_urgent_burst_bw = 0 | |
| 447 | +}; | |
| 448 | + | |
| 338 | 449 | struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc = { 0 }; |
| 339 | 450 | |
| 340 | 451 | #ifndef mmDP0_DP_DPHY_INTERNAL_CTRL |
| @@ -3291,6 +3402,9 @@ void dcn20_patch_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st · 2950 unmodified lines | ||
| 3291 | 3402 | static struct _vcs_dpi_soc_bounding_box_st *get_asic_rev_soc_bb( |
| 3292 | 3403 | uint32_t hw_internal_rev) |
| 3293 | 3404 | { |
| 3405 | + if (ASICREV_IS_NAVI14_M(hw_internal_rev)) | |
| 3406 | + return &dcn2_0_nv14_soc; | |
| 3407 | + | |
| 3294 | 3408 | if (ASICREV_IS_NAVI12_P(hw_internal_rev)) |
| 3295 | 3409 | return &dcn2_0_nv12_soc; |
| 3296 | 3410 | |
| @@ -116,7 +116,6 @@ static const struct hwseq_private_funcs dcn21_private_funcs = { · 115 unmodified lines | ||
| 116 | 116 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, |
| 117 | 117 | .dpp_pg_control = dcn20_dpp_pg_control, |
| 118 | 118 | .hubp_pg_control = dcn20_hubp_pg_control, |
| 119 | − .dsc_pg_control = NULL, | |
| 120 | 119 | .update_odm = dcn20_update_odm, |
| 121 | 120 | .dsc_pg_control = dcn20_dsc_pg_control, |
| 122 | 121 | .get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color, |
| @@ -2006,8 +2006,11 @@ int smu_set_watermarks_for_clock_ranges(struct smu_context *smu, · 2005 unmodified lines | ||
| 2006 | 2006 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && |
| 2007 | 2007 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) { |
| 2008 | 2008 | smu_set_watermarks_table(smu, table, clock_ranges); |
| 2009 | − smu->watermarks_bitmap |= WATERMARKS_EXIST; | |
| 2010 | − smu->watermarks_bitmap &= ~WATERMARKS_LOADED; | |
| 2009 | + | |
| 2010 | + if (!(smu->watermarks_bitmap & WATERMARKS_EXIST)) { | |
| 2011 | + smu->watermarks_bitmap |= WATERMARKS_EXIST; | |
| 2012 | + smu->watermarks_bitmap &= ~WATERMARKS_LOADED; | |
| 2013 | + } | |
| 2011 | 2014 | } |
| 2012 | 2015 | |
| 2013 | 2016 | mutex_unlock(&smu->mutex); |
| @@ -1062,15 +1062,6 @@ static int navi10_display_config_changed(struct smu_context *smu) · 1061 unmodified lines | ||
| 1062 | 1062 | { |
| 1063 | 1063 | int ret = 0; |
| 1064 | 1064 | |
| 1065 | − if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && | |
| 1066 | − !(smu->watermarks_bitmap & WATERMARKS_LOADED)) { | |
| 1067 | − ret = smu_write_watermarks_table(smu); | |
| 1068 | − if (ret) | |
| 1069 | − return ret; | |
| 1070 | − | |
| 1071 | − smu->watermarks_bitmap |= WATERMARKS_LOADED; | |
| 1072 | − } | |
| 1073 | − | |
| 1074 | 1065 | if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && |
| 1075 | 1066 | smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && |
| 1076 | 1067 | smu_feature_is_supported(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) { |
| @@ -1493,6 +1484,7 @@ static int navi10_set_watermarks_table(struct smu_context *smu, · 416 unmodified lines | ||
| 1493 | 1484 | *clock_ranges) |
| 1494 | 1485 | { |
| 1495 | 1486 | int i; |
| 1487 | + int ret = 0; | |
| 1496 | 1488 | Watermarks_t *table = watermarks; |
| 1497 | 1489 | |
| 1498 | 1490 | if (!table || !clock_ranges) |
| @@ -1544,6 +1536,18 @@ static int navi10_set_watermarks_table(struct smu_context *smu, · 45 unmodified lines | ||
| 1544 | 1536 | clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; |
| 1545 | 1537 | } |
| 1546 | 1538 | |
| 1539 | + smu->watermarks_bitmap |= WATERMARKS_EXIST; | |
| 1540 | + | |
| 1541 | + /* pass data to smu controller */ | |
| 1542 | + if (!(smu->watermarks_bitmap & WATERMARKS_LOADED)) { | |
| 1543 | + ret = smu_write_watermarks_table(smu); | |
| 1544 | + if (ret) { | |
| 1545 | + pr_err("Failed to update WMTABLE!"); | |
| 1546 | + return ret; | |
| 1547 | + } | |
| 1548 | + smu->watermarks_bitmap |= WATERMARKS_LOADED; | |
| 1549 | + } | |
| 1550 | + | |
| 1547 | 1551 | return 0; |
| 1548 | 1552 | } |
| 1549 | 1553 | |
| @@ -806,9 +806,10 @@ static int renoir_set_watermarks_table( · 805 unmodified lines | ||
| 806 | 806 | clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; |
| 807 | 807 | } |
| 808 | 808 | |
| 809 | + smu->watermarks_bitmap |= WATERMARKS_EXIST; | |
| 810 | + | |
| 809 | 811 | /* pass data to smu controller */ |
| 810 | − if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && | |
| 811 | − !(smu->watermarks_bitmap & WATERMARKS_LOADED)) { | |
| 812 | + if (!(smu->watermarks_bitmap & WATERMARKS_LOADED)) { | |
| 812 | 813 | ret = smu_write_watermarks_table(smu); |
| 813 | 814 | if (ret) { |
| 814 | 815 | pr_err("Failed to update WMTABLE!"); |
| @@ -146,14 +146,14 @@ static const struct of_device_id komeda_of_match[] = { · 145 unmodified lines | ||
| 146 | 146 | |
| 147 | 147 | MODULE_DEVICE_TABLE(of, komeda_of_match); |
| 148 | 148 | |
| 149 | −static int komeda_rt_pm_suspend(struct device *dev) | |
| 149 | +static int __maybe_unused komeda_rt_pm_suspend(struct device *dev) | |
| 150 | 150 | { |
| 151 | 151 | struct komeda_drv *mdrv = dev_get_drvdata(dev); |
| 152 | 152 | |
| 153 | 153 | return komeda_dev_suspend(mdrv->mdev); |
| 154 | 154 | } |
| 155 | 155 | |
| 156 | −static int komeda_rt_pm_resume(struct device *dev) | |
| 156 | +static int __maybe_unused komeda_rt_pm_resume(struct device *dev) | |
| 157 | 157 | { |
| 158 | 158 | struct komeda_drv *mdrv = dev_get_drvdata(dev); |
| 159 | 159 | |
| @@ -156,10 +156,8 @@ int bochs_hw_init(struct drm_device *dev) · 155 unmodified lines | ||
| 156 | 156 | size = min(size, mem); |
| 157 | 157 | } |
| 158 | 158 | |
| 159 | − if (pci_request_region(pdev, 0, "bochs-drm") != 0) { | |
| 160 | − DRM_ERROR("Cannot request framebuffer\n"); | |
| 161 | − return -EBUSY; | |
| 162 | − } | |
| 159 | + if (pci_request_region(pdev, 0, "bochs-drm") != 0) | |
| 160 | + DRM_WARN("Cannot request framebuffer, boot fb still active?\n"); | |
| 163 | 161 | |
| 164 | 162 | bochs->fb_map = ioremap(addr, size); |
| 165 | 163 | if (bochs->fb_map == NULL) { |
| @@ -1624,28 +1624,34 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode) · 1623 unmodified lines | ||
| 1624 | 1624 | frame.colorspace = HDMI_COLORSPACE_RGB; |
| 1625 | 1625 | |
| 1626 | 1626 | /* Set up colorimetry */ |
| 1627 | − switch (hdmi->hdmi_data.enc_out_encoding) { | |
| 1628 | − case V4L2_YCBCR_ENC_601: | |
| 1629 | − if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) | |
| 1630 | − frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; | |
| 1631 | − else | |
| 1627 | + if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { | |
| 1628 | + switch (hdmi->hdmi_data.enc_out_encoding) { | |
| 1629 | + case V4L2_YCBCR_ENC_601: | |
| 1630 | + if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) | |
| 1631 | + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; | |
| 1632 | + else | |
| 1633 | + frame.colorimetry = HDMI_COLORIMETRY_ITU_601; | |
| 1634 | + frame.extended_colorimetry = | |
| 1635 | + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | |
| 1636 | + break; | |
| 1637 | + case V4L2_YCBCR_ENC_709: | |
| 1638 | + if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) | |
| 1639 | + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; | |
| 1640 | + else | |
| 1641 | + frame.colorimetry = HDMI_COLORIMETRY_ITU_709; | |
| 1642 | + frame.extended_colorimetry = | |
| 1643 | + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709; | |
| 1644 | + break; | |
| 1645 | + default: /* Carries no data */ | |
| 1632 | 1646 | frame.colorimetry = HDMI_COLORIMETRY_ITU_601; |
| 1647 | + frame.extended_colorimetry = | |
| 1648 | + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | |
| 1649 | + break; | |
| 1650 | + } | |
| 1651 | + } else { | |
| 1652 | + frame.colorimetry = HDMI_COLORIMETRY_NONE; | |
| 1633 | 1653 | frame.extended_colorimetry = |
| 1634 | − HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | |
| 1635 | − break; | |
| 1636 | − case V4L2_YCBCR_ENC_709: | |
| 1637 | − if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) | |
| 1638 | − frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; | |
| 1639 | − else | |
| 1640 | − frame.colorimetry = HDMI_COLORIMETRY_ITU_709; | |
| 1641 | − frame.extended_colorimetry = | |
| 1642 | − HDMI_EXTENDED_COLORIMETRY_XV_YCC_709; | |
| 1643 | − break; | |
| 1644 | − default: /* Carries no data */ | |
| 1645 | − frame.colorimetry = HDMI_COLORIMETRY_ITU_601; | |
| 1646 | − frame.extended_colorimetry = | |
| 1647 | − HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | |
| 1648 | − break; | |
| 1654 | + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | |
| 1649 | 1655 | } |
| 1650 | 1656 | |
| 1651 | 1657 | frame.scan_mode = HDMI_SCAN_MODE_NONE; |
| @@ -1935,7 +1935,7 @@ static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port, · 1934 unmodified lines | ||
| 1935 | 1935 | return parent_lct + 1; |
| 1936 | 1936 | } |
| 1937 | 1937 | |
| 1938 | −static bool drm_dp_mst_is_dp_mst_end_device(u8 pdt, bool mcs) | |
| 1938 | +static bool drm_dp_mst_is_end_device(u8 pdt, bool mcs) | |
| 1939 | 1939 | { |
| 1940 | 1940 | switch (pdt) { |
| 1941 | 1941 | case DP_PEER_DEVICE_DP_LEGACY_CONV: |
| @@ -1965,13 +1965,13 @@ drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt, · 23 unmodified lines | ||
| 1965 | 1965 | |
| 1966 | 1966 | /* Teardown the old pdt, if there is one */ |
| 1967 | 1967 | if (port->pdt != DP_PEER_DEVICE_NONE) { |
| 1968 | − if (drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) { | |
| 1968 | + if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { | |
| 1969 | 1969 | /* |
| 1970 | 1970 | * If the new PDT would also have an i2c bus, |
| 1971 | 1971 | * don't bother with reregistering it |
| 1972 | 1972 | */ |
| 1973 | 1973 | if (new_pdt != DP_PEER_DEVICE_NONE && |
| 1974 | − drm_dp_mst_is_dp_mst_end_device(new_pdt, new_mcs)) { | |
| 1974 | + drm_dp_mst_is_end_device(new_pdt, new_mcs)) { | |
| 1975 | 1975 | port->pdt = new_pdt; |
| 1976 | 1976 | port->mcs = new_mcs; |
| 1977 | 1977 | return 0; |
| @@ -1991,7 +1991,7 @@ drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt, · 13 unmodified lines | ||
| 1991 | 1991 | port->mcs = new_mcs; |
| 1992 | 1992 | |
| 1993 | 1993 | if (port->pdt != DP_PEER_DEVICE_NONE) { |
| 1994 | − if (drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) { | |
| 1994 | + if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { | |
| 1995 | 1995 | /* add i2c over sideband */ |
| 1996 | 1996 | ret = drm_dp_mst_register_i2c_bus(&port->aux); |
| 1997 | 1997 | } else { |
| @@ -2172,7 +2172,7 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb, · 174 unmodified lines | ||
| 2172 | 2172 | } |
| 2173 | 2173 | |
| 2174 | 2174 | if (port->pdt != DP_PEER_DEVICE_NONE && |
| 2175 | − drm_dp_mst_is_dp_mst_end_device(port->pdt, port->mcs)) { | |
| 2175 | + drm_dp_mst_is_end_device(port->pdt, port->mcs)) { | |
| 2176 | 2176 | port->cached_edid = drm_get_edid(port->connector, |
| 2177 | 2177 | &port->aux.ddc); |
| 2178 | 2178 | drm_connector_set_tile_property(port->connector); |
| @@ -2302,14 +2302,18 @@ drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb, · 123 unmodified lines | ||
| 2302 | 2302 | mutex_unlock(&mgr->lock); |
| 2303 | 2303 | } |
| 2304 | 2304 | |
| 2305 | − if (old_ddps != port->ddps) { | |
| 2306 | − if (port->ddps) { | |
| 2307 | − if (!port->input) { | |
| 2308 | − drm_dp_send_enum_path_resources(mgr, mstb, | |
| 2309 | − port); | |
| 2310 | − } | |
| 2305 | + /* | |
| 2306 | + * Reprobe PBN caps on both hotplug, and when re-probing the link | |
| 2307 | + * for our parent mstb | |
| 2308 | + */ | |
| 2309 | + if (old_ddps != port->ddps || !created) { | |
| 2310 | + if (port->ddps && !port->input) { | |
| 2311 | + ret = drm_dp_send_enum_path_resources(mgr, mstb, | |
| 2312 | + port); | |
| 2313 | + if (ret == 1) | |
| 2314 | + changed = true; | |
| 2311 | 2315 | } else { |
| 2312 | − port->available_pbn = 0; | |
| 2316 | + port->full_pbn = 0; | |
| 2313 | 2317 | } |
| 2314 | 2318 | } |
| 2315 | 2319 | |
| @@ -2401,11 +2405,10 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb, · 85 unmodified lines | ||
| 2401 | 2405 | port->ddps = conn_stat->displayport_device_plug_status; |
| 2402 | 2406 | |
| 2403 | 2407 | if (old_ddps != port->ddps) { |
| 2404 | − if (port->ddps) { | |
| 2405 | − dowork = true; | |
| 2406 | − } else { | |
| 2407 | − port->available_pbn = 0; | |
| 2408 | − } | |
| 2408 | + if (port->ddps && !port->input) | |
| 2409 | + drm_dp_send_enum_path_resources(mgr, mstb, port); | |
| 2410 | + else | |
| 2411 | + port->full_pbn = 0; | |
| 2409 | 2412 | } |
| 2410 | 2413 | |
| 2411 | 2414 | new_pdt = port->input ? DP_PEER_DEVICE_NONE : conn_stat->peer_device_type; |
| @@ -2556,13 +2559,6 @@ static int drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mg · 144 unmodified lines | ||
| 2556 | 2559 | if (port->input || !port->ddps) |
| 2557 | 2560 | continue; |
| 2558 | 2561 | |
| 2559 | − if (!port->available_pbn) { | |
| 2560 | − drm_modeset_lock(&mgr->base.lock, NULL); | |
| 2561 | − drm_dp_send_enum_path_resources(mgr, mstb, port); | |
| 2562 | − drm_modeset_unlock(&mgr->base.lock); | |
| 2563 | − changed = true; | |
| 2564 | − } | |
| 2565 | − | |
| 2566 | 2562 | if (port->mstb) |
| 2567 | 2563 | mstb_child = drm_dp_mst_topology_get_mstb_validated( |
| 2568 | 2564 | mgr, port->mstb); |
| @@ -2990,6 +2986,7 @@ drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, · 421 unmodified lines | ||
| 2990 | 2986 | |
| 2991 | 2987 | ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); |
| 2992 | 2988 | if (ret > 0) { |
| 2989 | + ret = 0; | |
| 2993 | 2990 | path_res = &txmsg->reply.u.path_resources; |
| 2994 | 2991 | |
| 2995 | 2992 | if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) { |
| @@ -3002,14 +2999,22 @@ drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, · 6 unmodified lines | ||
| 3002 | 2999 | path_res->port_number, |
| 3003 | 3000 | path_res->full_payload_bw_number, |
| 3004 | 3001 | path_res->avail_payload_bw_number); |
| 3005 | − port->available_pbn = | |
| 3006 | − path_res->avail_payload_bw_number; | |
| 3002 | + | |
| 3003 | + /* | |
| 3004 | + * If something changed, make sure we send a | |
| 3005 | + * hotplug | |
| 3006 | + */ | |
| 3007 | + if (port->full_pbn != path_res->full_payload_bw_number || | |
| 3008 | + port->fec_capable != path_res->fec_capable) | |
| 3009 | + ret = 1; | |
| 3010 | + | |
| 3011 | + port->full_pbn = path_res->full_payload_bw_number; | |
| 3007 | 3012 | port->fec_capable = path_res->fec_capable; |
| 3008 | 3013 | } |
| 3009 | 3014 | } |
| 3010 | 3015 | |
| 3011 | 3016 | kfree(txmsg); |
| 3012 | − return 0; | |
| 3017 | + return ret; | |
| 3013 | 3018 | } |
| 3014 | 3019 | |
| 3015 | 3020 | static struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb) |
| @@ -3596,13 +3601,9 @@ drm_dp_mst_topology_mgr_invalidate_mstb(struct drm_dp_mst_branch *mstb) · 580 unmodified lines | ||
| 3596 | 3601 | /* The link address will need to be re-sent on resume */ |
| 3597 | 3602 | mstb->link_address_sent = false; |
| 3598 | 3603 | |
| 3599 | − list_for_each_entry(port, &mstb->ports, next) { | |
| 3600 | − /* The PBN for each port will also need to be re-probed */ | |
| 3601 | − port->available_pbn = 0; | |
| 3602 | − | |
| 3604 | + list_for_each_entry(port, &mstb->ports, next) | |
| 3603 | 3605 | if (port->mstb) |
| 3604 | 3606 | drm_dp_mst_topology_mgr_invalidate_mstb(port->mstb); |
| 3605 | − } | |
| 3606 | 3607 | } |
| 3607 | 3608 | |
| 3608 | 3609 | /** |
| @@ -4829,41 +4830,102 @@ static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port, · 1220 unmodified lines | ||
| 4829 | 4830 | return false; |
| 4830 | 4831 | } |
| 4831 | 4832 | |
| 4832 | −static inline | |
| 4833 | −int drm_dp_mst_atomic_check_bw_limit(struct drm_dp_mst_branch *branch, | |
| 4834 | − struct drm_dp_mst_topology_state *mst_state) | |
| 4833 | +static int | |
| 4834 | +drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port, | |
| 4835 | + struct drm_dp_mst_topology_state *state); | |
| 4836 | + | |
| 4837 | +static int | |
| 4838 | +drm_dp_mst_atomic_check_mstb_bw_limit(struct drm_dp_mst_branch *mstb, | |
| 4839 | + struct drm_dp_mst_topology_state *state) | |
| 4835 | 4840 | { |
| 4836 | − struct drm_dp_mst_port *port; | |
| 4837 | 4841 | struct drm_dp_vcpi_allocation *vcpi; |
| 4838 | − int pbn_limit = 0, pbn_used = 0; | |
| 4842 | + struct drm_dp_mst_port *port; | |
| 4843 | + int pbn_used = 0, ret; | |
| 4844 | + bool found = false; | |
| 4839 | 4845 | |
| 4840 | − list_for_each_entry(port, &branch->ports, next) { | |
| 4841 | − if (port->mstb) | |
| 4842 | − if (drm_dp_mst_atomic_check_bw_limit(port->mstb, mst_state)) | |
| 4843 | − return -ENOSPC; | |
| 4846 | + /* Check that we have at least one port in our state that's downstream | |
| 4847 | + * of this branch, otherwise we can skip this branch | |
| 4848 | + */ | |
| 4849 | + list_for_each_entry(vcpi, &state->vcpis, next) { | |
| 4850 | + if (!vcpi->pbn || | |
| 4851 | + !drm_dp_mst_port_downstream_of_branch(vcpi->port, mstb)) | |
| 4852 | + continue; | |
| 4844 | 4853 | |
| 4845 | − if (port->available_pbn > 0) | |
| 4846 | − pbn_limit = port->available_pbn; | |
| 4854 | + found = true; | |
| 4855 | + break; | |
| 4847 | 4856 | } |
| 4848 | − DRM_DEBUG_ATOMIC("[MST BRANCH:%p] branch has %d PBN available\n", | |
| 4849 | − branch, pbn_limit); | |
| 4857 | + if (!found) | |
| 4858 | + return 0; | |
| 4850 | 4859 | |
| 4851 | − list_for_each_entry(vcpi, &mst_state->vcpis, next) { | |
| 4852 | − if (!vcpi->pbn) | |
| 4853 | − continue; | |
| 4860 | + if (mstb->port_parent) | |
| 4861 | + DRM_DEBUG_ATOMIC("[MSTB:%p] [MST PORT:%p] Checking bandwidth limits on [MSTB:%p]\n", | |
| 4862 | + mstb->port_parent->parent, mstb->port_parent, | |
| 4863 | + mstb); | |
| 4864 | + else | |
| 4865 | + DRM_DEBUG_ATOMIC("[MSTB:%p] Checking bandwidth limits\n", | |
| 4866 | + mstb); | |
| 4867 | + | |
| 4868 | + list_for_each_entry(port, &mstb->ports, next) { | |
| 4869 | + ret = drm_dp_mst_atomic_check_port_bw_limit(port, state); | |
| 4870 | + if (ret < 0) | |
| 4871 | + return ret; | |
| 4854 | 4872 | |
| 4855 | − if (drm_dp_mst_port_downstream_of_branch(vcpi->port, branch)) | |
| 4856 | − pbn_used += vcpi->pbn; | |
| 4873 | + pbn_used += ret; | |
| 4857 | 4874 | } |
| 4858 | − DRM_DEBUG_ATOMIC("[MST BRANCH:%p] branch used %d PBN\n", | |
| 4859 | − branch, pbn_used); | |
| 4860 | 4875 | |
| 4861 | − if (pbn_used > pbn_limit) { | |
| 4862 | − DRM_DEBUG_ATOMIC("[MST BRANCH:%p] No available bandwidth\n", | |
| 4863 | − branch); | |
| 4876 | + return pbn_used; | |
| 4877 | +} | |
| 4878 | + | |
| 4879 | +static int | |
| 4880 | +drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port, | |
| 4881 | + struct drm_dp_mst_topology_state *state) | |
| 4882 | +{ | |
| 4883 | + struct drm_dp_vcpi_allocation *vcpi; | |
| 4884 | + int pbn_used = 0; | |
| 4885 | + | |
| 4886 | + if (port->pdt == DP_PEER_DEVICE_NONE) | |
| 4887 | + return 0; | |
| 4888 | + | |
| 4889 | + if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) { | |
| 4890 | + bool found = false; | |
| 4891 | + | |
| 4892 | + list_for_each_entry(vcpi, &state->vcpis, next) { | |
| 4893 | + if (vcpi->port != port) | |
| 4894 | + continue; | |
| 4895 | + if (!vcpi->pbn) | |
| 4896 | + return 0; | |
| 4897 | + | |
| 4898 | + found = true; | |
| 4899 | + break; | |
| 4900 | + } | |
| 4901 | + if (!found) | |
| 4902 | + return 0; | |
| 4903 | + | |
| 4904 | + /* This should never happen, as it means we tried to | |
| 4905 | + * set a mode before querying the full_pbn | |
| 4906 | + */ | |
| 4907 | + if (WARN_ON(!port->full_pbn)) | |
| 4908 | + return -EINVAL; | |
| 4909 | + | |
| 4910 | + pbn_used = vcpi->pbn; | |
| 4911 | + } else { | |
| 4912 | + pbn_used = drm_dp_mst_atomic_check_mstb_bw_limit(port->mstb, | |
| 4913 | + state); | |
| 4914 | + if (pbn_used <= 0) | |
| 4915 | + return pbn_used; | |
| 4916 | + } | |
| 4917 | + | |
| 4918 | + if (pbn_used > port->full_pbn) { | |
| 4919 | + DRM_DEBUG_ATOMIC("[MSTB:%p] [MST PORT:%p] required PBN of %d exceeds port limit of %d\n", | |
| 4920 | + port->parent, port, pbn_used, | |
| 4921 | + port->full_pbn); | |
| 4864 | 4922 | return -ENOSPC; |
| 4865 | 4923 | } |
| 4866 | − return 0; | |
| 4924 | + | |
| 4925 | + DRM_DEBUG_ATOMIC("[MSTB:%p] [MST PORT:%p] uses %d out of %d PBN\n", | |
| 4926 | + port->parent, port, pbn_used, port->full_pbn); | |
| 4927 | + | |
| 4928 | + return pbn_used; | |
| 4867 | 4929 | } |
| 4868 | 4930 | |
| 4869 | 4931 | static inline int |
| @@ -5061,9 +5123,15 @@ int drm_dp_mst_atomic_check(struct drm_atomic_state *state) · 191 unmodified lines | ||
| 5061 | 5123 | ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state); |
| 5062 | 5124 | if (ret) |
| 5063 | 5125 | break; |
| 5064 | − ret = drm_dp_mst_atomic_check_bw_limit(mgr->mst_primary, mst_state); | |
| 5065 | − if (ret) | |
| 5126 | + | |
| 5127 | + mutex_lock(&mgr->lock); | |
| 5128 | + ret = drm_dp_mst_atomic_check_mstb_bw_limit(mgr->mst_primary, | |
| 5129 | + mst_state); | |
| 5130 | + mutex_unlock(&mgr->lock); | |
| 5131 | + if (ret < 0) | |
| 5066 | 5132 | break; |
| 5133 | + else | |
| 5134 | + ret = 0; | |
| 5067 | 5135 | } |
| 5068 | 5136 | |
| 5069 | 5137 | return ret; |
| @@ -542,10 +542,12 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, · 541 unmodified lines | ||
| 542 | 542 | } |
| 543 | 543 | |
| 544 | 544 | DRM_DEBUG_LEASE("Creating lease\n"); |
| 545 | + /* lessee will take the ownership of leases */ | |
| 545 | 546 | lessee = drm_lease_create(lessor, &leases); |
| 546 | 547 | |
| 547 | 548 | if (IS_ERR(lessee)) { |
| 548 | 549 | ret = PTR_ERR(lessee); |
| 550 | + idr_destroy(&leases); | |
| 549 | 551 | goto out_leases; |
| 550 | 552 | } |
| 551 | 553 | |
| @@ -580,7 +582,6 @@ out_lessee: · 28 unmodified lines | ||
| 580 | 582 | |
| 581 | 583 | out_leases: |
| 582 | 584 | put_unused_fd(fd); |
| 583 | − idr_destroy(&leases); | |
| 584 | 585 | |
| 585 | 586 | DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl failed: %d\n", ret); |
| 586 | 587 | return ret; |
| @@ -55,6 +55,7 @@ static const char * const decon_clks_name[] = { · 54 unmodified lines | ||
| 55 | 55 | struct decon_context { |
| 56 | 56 | struct device *dev; |
| 57 | 57 | struct drm_device *drm_dev; |
| 58 | + void *dma_priv; | |
| 58 | 59 | struct exynos_drm_crtc *crtc; |
| 59 | 60 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 60 | 61 | struct exynos_drm_plane_config configs[WINDOWS_NR]; |
| @@ -644,7 +645,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data) · 583 unmodified lines | ||
| 644 | 645 | |
| 645 | 646 | decon_clear_channels(ctx->crtc); |
| 646 | 647 | |
| 647 | − return exynos_drm_register_dma(drm_dev, dev); | |
| 648 | + return exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv); | |
| 648 | 649 | } |
| 649 | 650 | |
| 650 | 651 | static void decon_unbind(struct device *dev, struct device *master, void *data) |
| @@ -654,7 +655,7 @@ static void decon_unbind(struct device *dev, struct device *master, void *data) · 3 unmodified lines | ||
| 654 | 655 | decon_atomic_disable(ctx->crtc); |
| 655 | 656 | |
| 656 | 657 | /* detach this sub driver from iommu mapping if supported. */ |
| 657 | − exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev); | |
| 658 | + exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev, &ctx->dma_priv); | |
| 658 | 659 | } |
| 659 | 660 | |
| 660 | 661 | static const struct component_ops decon_component_ops = { |
| @@ -40,6 +40,7 @@ · 39 unmodified lines | ||
| 40 | 40 | struct decon_context { |
| 41 | 41 | struct device *dev; |
| 42 | 42 | struct drm_device *drm_dev; |
| 43 | + void *dma_priv; | |
| 43 | 44 | struct exynos_drm_crtc *crtc; |
| 44 | 45 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 45 | 46 | struct exynos_drm_plane_config configs[WINDOWS_NR]; |
| @@ -127,13 +128,13 @@ static int decon_ctx_initialize(struct decon_context *ctx, · 81 unmodified lines | ||
| 127 | 128 | |
| 128 | 129 | decon_clear_channels(ctx->crtc); |
| 129 | 130 | |
| 130 | − return exynos_drm_register_dma(drm_dev, ctx->dev); | |
| 131 | + return exynos_drm_register_dma(drm_dev, ctx->dev, &ctx->dma_priv); | |
| 131 | 132 | } |
| 132 | 133 | |
| 133 | 134 | static void decon_ctx_remove(struct decon_context *ctx) |
| 134 | 135 | { |
| 135 | 136 | /* detach this sub driver from iommu mapping if supported. */ |
| 136 | − exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev); | |
| 137 | + exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev, &ctx->dma_priv); | |
| 137 | 138 | } |
| 138 | 139 | |
| 139 | 140 | static u32 decon_calc_clkdiv(struct decon_context *ctx, |
| @@ -58,7 +58,7 @@ static inline void clear_dma_max_seg_size(struct device *dev) · 57 unmodified lines | ||
| 58 | 58 | * mapping. |
| 59 | 59 | */ |
| 60 | 60 | static int drm_iommu_attach_device(struct drm_device *drm_dev, |
| 61 | − struct device *subdrv_dev) | |
| 61 | + struct device *subdrv_dev, void **dma_priv) | |
| 62 | 62 | { |
| 63 | 63 | struct exynos_drm_private *priv = drm_dev->dev_private; |
| 64 | 64 | int ret; |
| @@ -74,7 +74,14 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, · 9 unmodified lines | ||
| 74 | 74 | return ret; |
| 75 | 75 | |
| 76 | 76 | if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) { |
| 77 | − if (to_dma_iommu_mapping(subdrv_dev)) | |
| 77 | + /* | |
| 78 | + * Keep the original DMA mapping of the sub-device and | |
| 79 | + * restore it on Exynos DRM detach, otherwise the DMA | |
| 80 | + * framework considers it as IOMMU-less during the next | |
| 81 | + * probe (in case of deferred probe or modular build) | |
| 82 | + */ | |
| 83 | + *dma_priv = to_dma_iommu_mapping(subdrv_dev); | |
| 84 | + if (*dma_priv) | |
| 78 | 85 | arm_iommu_detach_device(subdrv_dev); |
| 79 | 86 | |
| 80 | 87 | ret = arm_iommu_attach_device(subdrv_dev, priv->mapping); |
| @@ -98,19 +105,21 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, · 17 unmodified lines | ||
| 98 | 105 | * mapping |
| 99 | 106 | */ |
| 100 | 107 | static void drm_iommu_detach_device(struct drm_device *drm_dev, |
| 101 | − struct device *subdrv_dev) | |
| 108 | + struct device *subdrv_dev, void **dma_priv) | |
| 102 | 109 | { |
| 103 | 110 | struct exynos_drm_private *priv = drm_dev->dev_private; |
| 104 | 111 | |
| 105 | − if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) | |
| 112 | + if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) { | |
| 106 | 113 | arm_iommu_detach_device(subdrv_dev); |
| 107 | − else if (IS_ENABLED(CONFIG_IOMMU_DMA)) | |
| 114 | + arm_iommu_attach_device(subdrv_dev, *dma_priv); | |
| 115 | + } else if (IS_ENABLED(CONFIG_IOMMU_DMA)) | |
| 108 | 116 | iommu_detach_device(priv->mapping, subdrv_dev); |
| 109 | 117 | |
| 110 | 118 | clear_dma_max_seg_size(subdrv_dev); |
| 111 | 119 | } |
| 112 | 120 | |
| 113 | −int exynos_drm_register_dma(struct drm_device *drm, struct device *dev) | |
| 121 | +int exynos_drm_register_dma(struct drm_device *drm, struct device *dev, | |
| 122 | + void **dma_priv) | |
| 114 | 123 | { |
| 115 | 124 | struct exynos_drm_private *priv = drm->dev_private; |
| 116 | 125 | |
| @@ -137,13 +146,14 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev) · 20 unmodified lines | ||
| 137 | 146 | priv->mapping = mapping; |
| 138 | 147 | } |
| 139 | 148 | |
| 140 | − return drm_iommu_attach_device(drm, dev); | |
| 149 | + return drm_iommu_attach_device(drm, dev, dma_priv); | |
| 141 | 150 | } |
| 142 | 151 | |
| 143 | −void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev) | |
| 152 | +void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev, | |
| 153 | + void **dma_priv) | |
| 144 | 154 | { |
| 145 | 155 | if (IS_ENABLED(CONFIG_EXYNOS_IOMMU)) |
| 146 | − drm_iommu_detach_device(drm, dev); | |
| 156 | + drm_iommu_detach_device(drm, dev, dma_priv); | |
| 147 | 157 | } |
| 148 | 158 | |
| 149 | 159 | void exynos_drm_cleanup_dma(struct drm_device *drm) |
| @@ -223,8 +223,10 @@ static inline bool is_drm_iommu_supported(struct drm_device *drm_dev) · 222 unmodified lines | ||
| 223 | 223 | return priv->mapping ? true : false; |
| 224 | 224 | } |
| 225 | 225 | |
| 226 | −int exynos_drm_register_dma(struct drm_device *drm, struct device *dev); | |
| 227 | −void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev); | |
| 226 | +int exynos_drm_register_dma(struct drm_device *drm, struct device *dev, | |
| 227 | + void **dma_priv); | |
| 228 | +void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev, | |
| 229 | + void **dma_priv); | |
| 228 | 230 | void exynos_drm_cleanup_dma(struct drm_device *drm); |
| 229 | 231 | |
| 230 | 232 | #ifdef CONFIG_DRM_EXYNOS_DPI |
| @@ -97,6 +97,7 @@ struct fimc_scaler { · 96 unmodified lines | ||
| 97 | 97 | struct fimc_context { |
| 98 | 98 | struct exynos_drm_ipp ipp; |
| 99 | 99 | struct drm_device *drm_dev; |
| 100 | + void *dma_priv; | |
| 100 | 101 | struct device *dev; |
| 101 | 102 | struct exynos_drm_ipp_task *task; |
| 102 | 103 | struct exynos_drm_ipp_formats *formats; |
| @@ -1133,7 +1134,7 @@ static int fimc_bind(struct device *dev, struct device *master, void *data) · 1030 unmodified lines | ||
| 1133 | 1134 | |
| 1134 | 1135 | ctx->drm_dev = drm_dev; |
| 1135 | 1136 | ipp->drm_dev = drm_dev; |
| 1136 | − exynos_drm_register_dma(drm_dev, dev); | |
| 1137 | + exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv); | |
| 1137 | 1138 | |
| 1138 | 1139 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 1139 | 1140 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | |
| @@ -1153,7 +1154,7 @@ static void fimc_unbind(struct device *dev, struct device *master, · 13 unmodified lines | ||
| 1153 | 1154 | struct exynos_drm_ipp *ipp = &ctx->ipp; |
| 1154 | 1155 | |
| 1155 | 1156 | exynos_drm_ipp_unregister(dev, ipp); |
| 1156 | − exynos_drm_unregister_dma(drm_dev, dev); | |
| 1157 | + exynos_drm_unregister_dma(drm_dev, dev, &ctx->dma_priv); | |
| 1157 | 1158 | } |
| 1158 | 1159 | |
| 1159 | 1160 | static const struct component_ops fimc_component_ops = { |
| @@ -167,6 +167,7 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = { · 166 unmodified lines | ||
| 167 | 167 | struct fimd_context { |
| 168 | 168 | struct device *dev; |
| 169 | 169 | struct drm_device *drm_dev; |
| 170 | + void *dma_priv; | |
| 170 | 171 | struct exynos_drm_crtc *crtc; |
| 171 | 172 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 172 | 173 | struct exynos_drm_plane_config configs[WINDOWS_NR]; |
| @@ -1090,7 +1091,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data) · 917 unmodified lines | ||
| 1090 | 1091 | if (is_drm_iommu_supported(drm_dev)) |
| 1091 | 1092 | fimd_clear_channels(ctx->crtc); |
| 1092 | 1093 | |
| 1093 | − return exynos_drm_register_dma(drm_dev, dev); | |
| 1094 | + return exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv); | |
| 1094 | 1095 | } |
| 1095 | 1096 | |
| 1096 | 1097 | static void fimd_unbind(struct device *dev, struct device *master, |
| @@ -1100,7 +1101,7 @@ static void fimd_unbind(struct device *dev, struct device *master, · 3 unmodified lines | ||
| 1100 | 1101 | |
| 1101 | 1102 | fimd_atomic_disable(ctx->crtc); |
| 1102 | 1103 | |
| 1103 | − exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev); | |
| 1104 | + exynos_drm_unregister_dma(ctx->drm_dev, ctx->dev, &ctx->dma_priv); | |
| 1104 | 1105 | |
| 1105 | 1106 | if (ctx->encoder) |
| 1106 | 1107 | exynos_dpi_remove(ctx->encoder); |
| @@ -232,6 +232,7 @@ struct g2d_runqueue_node { · 231 unmodified lines | ||
| 232 | 232 | |
| 233 | 233 | struct g2d_data { |
| 234 | 234 | struct device *dev; |
| 235 | + void *dma_priv; | |
| 235 | 236 | struct clk *gate_clk; |
| 236 | 237 | void __iomem *regs; |
| 237 | 238 | int irq; |
| @@ -1409,7 +1410,7 @@ static int g2d_bind(struct device *dev, struct device *master, void *data) · 1171 unmodified lines | ||
| 1409 | 1410 | return ret; |
| 1410 | 1411 | } |
| 1411 | 1412 | |
| 1412 | − ret = exynos_drm_register_dma(drm_dev, dev); | |
| 1413 | + ret = exynos_drm_register_dma(drm_dev, dev, &g2d->dma_priv); | |
| 1413 | 1414 | if (ret < 0) { |
| 1414 | 1415 | dev_err(dev, "failed to enable iommu.\n"); |
| 1415 | 1416 | g2d_fini_cmdlist(g2d); |
| @@ -1434,7 +1435,7 @@ static void g2d_unbind(struct device *dev, struct device *master, void *data) · 18 unmodified lines | ||
| 1434 | 1435 | priv->g2d_dev = NULL; |
| 1435 | 1436 | |
| 1436 | 1437 | cancel_work_sync(&g2d->runqueue_work); |
| 1437 | − exynos_drm_unregister_dma(g2d->drm_dev, dev); | |
| 1438 | + exynos_drm_unregister_dma(g2d->drm_dev, dev, &g2d->dma_priv); | |
| 1438 | 1439 | } |
| 1439 | 1440 | |
| 1440 | 1441 | static const struct component_ops g2d_component_ops = { |
| @@ -97,6 +97,7 @@ struct gsc_scaler { · 96 unmodified lines | ||
| 97 | 97 | struct gsc_context { |
| 98 | 98 | struct exynos_drm_ipp ipp; |
| 99 | 99 | struct drm_device *drm_dev; |
| 100 | + void *dma_priv; | |
| 100 | 101 | struct device *dev; |
| 101 | 102 | struct exynos_drm_ipp_task *task; |
| 102 | 103 | struct exynos_drm_ipp_formats *formats; |
| @@ -1169,7 +1170,7 @@ static int gsc_bind(struct device *dev, struct device *master, void *data) · 1066 unmodified lines | ||
| 1169 | 1170 | |
| 1170 | 1171 | ctx->drm_dev = drm_dev; |
| 1171 | 1172 | ctx->drm_dev = drm_dev; |
| 1172 | − exynos_drm_register_dma(drm_dev, dev); | |
| 1173 | + exynos_drm_register_dma(drm_dev, dev, &ctx->dma_priv); | |
| 1173 | 1174 | |
| 1174 | 1175 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 1175 | 1176 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | |
| @@ -1189,7 +1190,7 @@ static void gsc_unbind(struct device *dev, struct device *master, · 13 unmodified lines | ||
| 1189 | 1190 | struct exynos_drm_ipp *ipp = &ctx->ipp; |
| 1190 | 1191 | |
| 1191 | 1192 | exynos_drm_ipp_unregister(dev, ipp); |
| 1192 | − exynos_drm_unregister_dma(drm_dev, dev); | |
| 1193 | + exynos_drm_unregister_dma(drm_dev, dev, &ctx->dma_priv); | |
| 1193 | 1194 | } |
| 1194 | 1195 | |
| 1195 | 1196 | static const struct component_ops gsc_component_ops = { |
| @@ -56,6 +56,7 @@ struct rot_variant { · 55 unmodified lines | ||
| 56 | 56 | struct rot_context { |
| 57 | 57 | struct exynos_drm_ipp ipp; |
| 58 | 58 | struct drm_device *drm_dev; |
| 59 | + void *dma_priv; | |
| 59 | 60 | struct device *dev; |
| 60 | 61 | void __iomem *regs; |
| 61 | 62 | struct clk *clock; |
| @@ -243,7 +244,7 @@ static int rotator_bind(struct device *dev, struct device *master, void *data) · 181 unmodified lines | ||
| 243 | 244 | |
| 244 | 245 | rot->drm_dev = drm_dev; |
| 245 | 246 | ipp->drm_dev = drm_dev; |
| 246 | − exynos_drm_register_dma(drm_dev, dev); | |
| 247 | + exynos_drm_register_dma(drm_dev, dev, &rot->dma_priv); | |
| 247 | 248 | |
| 248 | 249 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 249 | 250 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE, |
| @@ -261,7 +262,7 @@ static void rotator_unbind(struct device *dev, struct device *master, · 11 unmodified lines | ||
| 261 | 262 | struct exynos_drm_ipp *ipp = &rot->ipp; |
| 262 | 263 | |
| 263 | 264 | exynos_drm_ipp_unregister(dev, ipp); |
| 264 | − exynos_drm_unregister_dma(rot->drm_dev, rot->dev); | |
| 265 | + exynos_drm_unregister_dma(rot->drm_dev, rot->dev, &rot->dma_priv); | |
| 265 | 266 | } |
| 266 | 267 | |
| 267 | 268 | static const struct component_ops rotator_component_ops = { |
| @@ -39,6 +39,7 @@ struct scaler_data { · 38 unmodified lines | ||
| 39 | 39 | struct scaler_context { |
| 40 | 40 | struct exynos_drm_ipp ipp; |
| 41 | 41 | struct drm_device *drm_dev; |
| 42 | + void *dma_priv; | |
| 42 | 43 | struct device *dev; |
| 43 | 44 | void __iomem *regs; |
| 44 | 45 | struct clk *clock[SCALER_MAX_CLK]; |
| @@ -450,7 +451,7 @@ static int scaler_bind(struct device *dev, struct device *master, void *data) · 405 unmodified lines | ||
| 450 | 451 | |
| 451 | 452 | scaler->drm_dev = drm_dev; |
| 452 | 453 | ipp->drm_dev = drm_dev; |
| 453 | − exynos_drm_register_dma(drm_dev, dev); | |
| 454 | + exynos_drm_register_dma(drm_dev, dev, &scaler->dma_priv); | |
| 454 | 455 | |
| 455 | 456 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 456 | 457 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | |
| @@ -470,7 +471,8 @@ static void scaler_unbind(struct device *dev, struct device *master, · 13 unmodified lines | ||
| 470 | 471 | struct exynos_drm_ipp *ipp = &scaler->ipp; |
| 471 | 472 | |
| 472 | 473 | exynos_drm_ipp_unregister(dev, ipp); |
| 473 | − exynos_drm_unregister_dma(scaler->drm_dev, scaler->dev); | |
| 474 | + exynos_drm_unregister_dma(scaler->drm_dev, scaler->dev, | |
| 475 | + &scaler->dma_priv); | |
| 474 | 476 | } |
| 475 | 477 | |
| 476 | 478 | static const struct component_ops scaler_component_ops = { |
| @@ -94,6 +94,7 @@ struct mixer_context { · 93 unmodified lines | ||
| 94 | 94 | struct platform_device *pdev; |
| 95 | 95 | struct device *dev; |
| 96 | 96 | struct drm_device *drm_dev; |
| 97 | + void *dma_priv; | |
| 97 | 98 | struct exynos_drm_crtc *crtc; |
| 98 | 99 | struct exynos_drm_plane planes[MIXER_WIN_NR]; |
| 99 | 100 | unsigned long flags; |
| @@ -894,12 +895,14 @@ static int mixer_initialize(struct mixer_context *mixer_ctx, · 794 unmodified lines | ||
| 894 | 895 | } |
| 895 | 896 | } |
| 896 | 897 | |
| 897 | − return exynos_drm_register_dma(drm_dev, mixer_ctx->dev); | |
| 898 | + return exynos_drm_register_dma(drm_dev, mixer_ctx->dev, | |
| 899 | + &mixer_ctx->dma_priv); | |
| 898 | 900 | } |
| 899 | 901 | |
| 900 | 902 | static void mixer_ctx_remove(struct mixer_context *mixer_ctx) |
| 901 | 903 | { |
| 902 | − exynos_drm_unregister_dma(mixer_ctx->drm_dev, mixer_ctx->dev); | |
| 904 | + exynos_drm_unregister_dma(mixer_ctx->drm_dev, mixer_ctx->dev, | |
| 905 | + &mixer_ctx->dma_priv); | |
| 903 | 906 | } |
| 904 | 907 | |
| 905 | 908 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) |
| @@ -423,7 +423,8 @@ eb_validate_vma(struct i915_execbuffer *eb, · 422 unmodified lines | ||
| 423 | 423 | if (unlikely(entry->flags & eb->invalid_flags)) |
| 424 | 424 | return -EINVAL; |
| 425 | 425 | |
| 426 | − if (unlikely(entry->alignment && !is_power_of_2(entry->alignment))) | |
| 426 | + if (unlikely(entry->alignment && | |
| 427 | + !is_power_of_2_u64(entry->alignment))) | |
| 427 | 428 | return -EINVAL; |
| 428 | 429 | |
| 429 | 430 | /* |
| @@ -1600,17 +1600,6 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve, · 1599 unmodified lines | ||
| 1600 | 1600 | spin_unlock(&old->breadcrumbs.irq_lock); |
| 1601 | 1601 | } |
| 1602 | 1602 | |
| 1603 | −static struct i915_request * | |
| 1604 | −last_active(const struct intel_engine_execlists *execlists) | |
| 1605 | −{ | |
| 1606 | − struct i915_request * const *last = READ_ONCE(execlists->active); | |
| 1607 | − | |
| 1608 | − while (*last && i915_request_completed(*last)) | |
| 1609 | − last++; | |
| 1610 | − | |
| 1611 | − return *last; | |
| 1612 | −} | |
| 1613 | − | |
| 1614 | 1603 | #define for_each_waiter(p__, rq__) \ |
| 1615 | 1604 | list_for_each_entry_lockless(p__, \ |
| 1616 | 1605 | &(rq__)->sched.waiters_list, \ |
| @@ -1679,11 +1668,9 @@ need_timeslice(struct intel_engine_cs *engine, const struct i915_request *rq) · 62 unmodified lines | ||
| 1679 | 1668 | if (!intel_engine_has_timeslices(engine)) |
| 1680 | 1669 | return false; |
| 1681 | 1670 | |
| 1682 | − if (list_is_last(&rq->sched.link, &engine->active.requests)) | |
| 1683 | − return false; | |
| 1684 | − | |
| 1685 | − hint = max(rq_prio(list_next_entry(rq, sched.link)), | |
| 1686 | − engine->execlists.queue_priority_hint); | |
| 1671 | + hint = engine->execlists.queue_priority_hint; | |
| 1672 | + if (!list_is_last(&rq->sched.link, &engine->active.requests)) | |
| 1673 | + hint = max(hint, rq_prio(list_next_entry(rq, sched.link))); | |
| 1687 | 1674 | |
| 1688 | 1675 | return hint >= effective_prio(rq); |
| 1689 | 1676 | } |
| @@ -1725,16 +1712,26 @@ static void set_timeslice(struct intel_engine_cs *engine) · 35 unmodified lines | ||
| 1725 | 1712 | set_timer_ms(&engine->execlists.timer, active_timeslice(engine)); |
| 1726 | 1713 | } |
| 1727 | 1714 | |
| 1715 | +static void start_timeslice(struct intel_engine_cs *engine) | |
| 1716 | +{ | |
| 1717 | + struct intel_engine_execlists *execlists = &engine->execlists; | |
| 1718 | + | |
| 1719 | + execlists->switch_priority_hint = execlists->queue_priority_hint; | |
| 1720 | + | |
| 1721 | + if (timer_pending(&execlists->timer)) | |
| 1722 | + return; | |
| 1723 | + | |
| 1724 | + set_timer_ms(&execlists->timer, timeslice(engine)); | |
| 1725 | +} | |
| 1726 | + | |
| 1728 | 1727 | static void record_preemption(struct intel_engine_execlists *execlists) |
| 1729 | 1728 | { |
| 1730 | 1729 | (void)I915_SELFTEST_ONLY(execlists->preempt_hang.count++); |
| 1731 | 1730 | } |
| 1732 | 1731 | |
| 1733 | −static unsigned long active_preempt_timeout(struct intel_engine_cs *engine) | |
| 1732 | +static unsigned long active_preempt_timeout(struct intel_engine_cs *engine, | |
| 1733 | + const struct i915_request *rq) | |
| 1734 | 1734 | { |
| 1735 | − struct i915_request *rq; | |
| 1736 | − | |
| 1737 | − rq = last_active(&engine->execlists); | |
| 1738 | 1735 | if (!rq) |
| 1739 | 1736 | return 0; |
| 1740 | 1737 | |
| @@ -1745,13 +1742,14 @@ static unsigned long active_preempt_timeout(struct intel_engine_cs *engine) · 4 unmodified lines | ||
| 1745 | 1742 | return READ_ONCE(engine->props.preempt_timeout_ms); |
| 1746 | 1743 | } |
| 1747 | 1744 | |
| 1748 | −static void set_preempt_timeout(struct intel_engine_cs *engine) | |
| 1745 | +static void set_preempt_timeout(struct intel_engine_cs *engine, | |
| 1746 | + const struct i915_request *rq) | |
| 1749 | 1747 | { |
| 1750 | 1748 | if (!intel_engine_has_preempt_reset(engine)) |
| 1751 | 1749 | return; |
| 1752 | 1750 | |
| 1753 | 1751 | set_timer_ms(&engine->execlists.preempt, |
| 1754 | − active_preempt_timeout(engine)); | |
| 1752 | + active_preempt_timeout(engine, rq)); | |
| 1755 | 1753 | } |
| 1756 | 1754 | |
| 1757 | 1755 | static inline void clear_ports(struct i915_request **ports, int count) |
| @@ -1764,6 +1762,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 6 unmodified lines | ||
| 1764 | 1762 | struct intel_engine_execlists * const execlists = &engine->execlists; |
| 1765 | 1763 | struct i915_request **port = execlists->pending; |
| 1766 | 1764 | struct i915_request ** const last_port = port + execlists->port_mask; |
| 1765 | + struct i915_request * const *active; | |
| 1767 | 1766 | struct i915_request *last; |
| 1768 | 1767 | struct rb_node *rb; |
| 1769 | 1768 | bool submit = false; |
| @@ -1818,7 +1817,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 48 unmodified lines | ||
| 1818 | 1817 | * i.e. we will retrigger preemption following the ack in case |
| 1819 | 1818 | * of trouble. |
| 1820 | 1819 | */ |
| 1821 | − last = last_active(execlists); | |
| 1820 | + active = READ_ONCE(execlists->active); | |
| 1821 | + while ((last = *active) && i915_request_completed(last)) | |
| 1822 | + active++; | |
| 1823 | + | |
| 1822 | 1824 | if (last) { |
| 1823 | 1825 | if (need_preempt(engine, last, rb)) { |
| 1824 | 1826 | ENGINE_TRACE(engine, |
| @@ -1888,11 +1890,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 63 unmodified lines | ||
| 1888 | 1890 | * Even if ELSP[1] is occupied and not worthy |
| 1889 | 1891 | * of timeslices, our queue might be. |
| 1890 | 1892 | */ |
| 1891 | − if (!execlists->timer.expires && | |
| 1892 | − need_timeslice(engine, last)) | |
| 1893 | − set_timer_ms(&execlists->timer, | |
| 1894 | − timeslice(engine)); | |
| 1895 | − | |
| 1893 | + start_timeslice(engine); | |
| 1896 | 1894 | return; |
| 1897 | 1895 | } |
| 1898 | 1896 | } |
| @@ -1927,7 +1925,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 28 unmodified lines | ||
| 1927 | 1925 | |
| 1928 | 1926 | if (last && !can_merge_rq(last, rq)) { |
| 1929 | 1927 | spin_unlock(&ve->base.active.lock); |
| 1930 | − return; /* leave this for another */ | |
| 1928 | + start_timeslice(engine); | |
| 1929 | + return; /* leave this for another sibling */ | |
| 1931 | 1930 | } |
| 1932 | 1931 | |
| 1933 | 1932 | ENGINE_TRACE(engine, |
| @@ -2103,7 +2102,7 @@ done: · 169 unmodified lines | ||
| 2103 | 2102 | * Skip if we ended up with exactly the same set of requests, |
| 2104 | 2103 | * e.g. trying to timeslice a pair of ordered contexts |
| 2105 | 2104 | */ |
| 2106 | − if (!memcmp(execlists->active, execlists->pending, | |
| 2105 | + if (!memcmp(active, execlists->pending, | |
| 2107 | 2106 | (port - execlists->pending + 1) * sizeof(*port))) { |
| 2108 | 2107 | do |
| 2109 | 2108 | execlists_schedule_out(fetch_and_zero(port)); |
| @@ -2114,7 +2113,7 @@ done: · 4 unmodified lines | ||
| 2114 | 2113 | clear_ports(port + 1, last_port - port); |
| 2115 | 2114 | |
| 2116 | 2115 | execlists_submit_ports(engine); |
| 2117 | − set_preempt_timeout(engine); | |
| 2116 | + set_preempt_timeout(engine, *active); | |
| 2118 | 2117 | } else { |
| 2119 | 2118 | skip_submit: |
| 2120 | 2119 | ring_set_paused(engine, 0); |
| @@ -4001,26 +4000,6 @@ static int gen12_emit_flush_render(struct i915_request *request, · 1880 unmodified lines | ||
| 4001 | 4000 | |
| 4002 | 4001 | *cs++ = preparser_disable(false); |
| 4003 | 4002 | intel_ring_advance(request, cs); |
| 4004 | − | |
| 4005 | − /* | |
| 4006 | − * Wa_1604544889:tgl | |
| 4007 | − */ | |
| 4008 | − if (IS_TGL_REVID(request->i915, TGL_REVID_A0, TGL_REVID_A0)) { | |
| 4009 | − flags = 0; | |
| 4010 | − flags |= PIPE_CONTROL_CS_STALL; | |
| 4011 | − flags |= PIPE_CONTROL_HDC_PIPELINE_FLUSH; | |
| 4012 | − | |
| 4013 | − flags |= PIPE_CONTROL_STORE_DATA_INDEX; | |
| 4014 | − flags |= PIPE_CONTROL_QW_WRITE; | |
| 4015 | − | |
| 4016 | − cs = intel_ring_begin(request, 6); | |
| 4017 | − if (IS_ERR(cs)) | |
| 4018 | − return PTR_ERR(cs); | |
| 4019 | − | |
| 4020 | − cs = gen8_emit_pipe_control(cs, flags, | |
| 4021 | − LRC_PPHWSP_SCRATCH_ADDR); | |
| 4022 | − intel_ring_advance(request, cs); | |
| 4023 | − } | |
| 4024 | 4003 | } |
| 4025 | 4004 | |
| 4026 | 4005 | return 0; |
| @@ -192,11 +192,15 @@ static void cacheline_release(struct intel_timeline_cacheline *cl) · 191 unmodified lines | ||
| 192 | 192 | |
| 193 | 193 | static void cacheline_free(struct intel_timeline_cacheline *cl) |
| 194 | 194 | { |
| 195 | + if (!i915_active_acquire_if_busy(&cl->active)) { | |
| 196 | + __idle_cacheline_free(cl); | |
| 197 | + return; | |
| 198 | + } | |
| 199 | + | |
| 195 | 200 | GEM_BUG_ON(ptr_test_bit(cl->vaddr, CACHELINE_FREE)); |
| 196 | 201 | cl->vaddr = ptr_set_bit(cl->vaddr, CACHELINE_FREE); |
| 197 | 202 | |
| 198 | − if (i915_active_is_idle(&cl->active)) | |
| 199 | − __idle_cacheline_free(cl); | |
| 203 | + i915_active_release(&cl->active); | |
| 200 | 204 | } |
| 201 | 205 | |
| 202 | 206 | int intel_timeline_init(struct intel_timeline *timeline, |
| @@ -1529,15 +1529,34 @@ err_obj: · 1528 unmodified lines | ||
| 1529 | 1529 | return ERR_PTR(err); |
| 1530 | 1530 | } |
| 1531 | 1531 | |
| 1532 | +static const struct { | |
| 1533 | + u32 start; | |
| 1534 | + u32 end; | |
| 1535 | +} mcr_ranges_gen8[] = { | |
| 1536 | + { .start = 0x5500, .end = 0x55ff }, | |
| 1537 | + { .start = 0x7000, .end = 0x7fff }, | |
| 1538 | + { .start = 0x9400, .end = 0x97ff }, | |
| 1539 | + { .start = 0xb000, .end = 0xb3ff }, | |
| 1540 | + { .start = 0xe000, .end = 0xe7ff }, | |
| 1541 | + {}, | |
| 1542 | +}; | |
| 1543 | + | |
| 1532 | 1544 | static bool mcr_range(struct drm_i915_private *i915, u32 offset) |
| 1533 | 1545 | { |
| 1546 | + int i; | |
| 1547 | + | |
| 1548 | + if (INTEL_GEN(i915) < 8) | |
| 1549 | + return false; | |
| 1550 | + | |
| 1534 | 1551 | /* |
| 1535 | − * Registers in this range are affected by the MCR selector | |
| 1552 | + * Registers in these ranges are affected by the MCR selector | |
| 1536 | 1553 | * which only controls CPU initiated MMIO. Routing does not |
| 1537 | 1554 | * work for CS access so we cannot verify them on this path. |
| 1538 | 1555 | */ |
| 1539 | − if (INTEL_GEN(i915) >= 8 && (offset >= 0xb000 && offset <= 0xb4ff)) | |
| 1540 | − return true; | |
| 1556 | + for (i = 0; mcr_ranges_gen8[i].start; i++) | |
| 1557 | + if (offset >= mcr_ranges_gen8[i].start && | |
| 1558 | + offset <= mcr_ranges_gen8[i].end) | |
| 1559 | + return true; | |
| 1541 | 1560 | |
| 1542 | 1561 | return false; |
| 1543 | 1562 | } |
| @@ -457,7 +457,8 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected) · 456 unmodified lines | ||
| 457 | 457 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; |
| 458 | 458 | |
| 459 | 459 | /* TODO: add more platforms support */ |
| 460 | − if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | |
| 460 | + if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv) || | |
| 461 | + IS_COFFEELAKE(dev_priv)) { | |
| 461 | 462 | if (connected) { |
| 462 | 463 | vgpu_vreg_t(vgpu, SFUSE_STRAP) |= |
| 463 | 464 | SFUSE_STRAP_DDID_DETECTED; |
| @@ -147,15 +147,14 @@ static void virt_vbt_generation(struct vbt *v) · 146 unmodified lines | ||
| 147 | 147 | /* there's features depending on version! */ |
| 148 | 148 | v->header.version = 155; |
| 149 | 149 | v->header.header_size = sizeof(v->header); |
| 150 | − v->header.vbt_size = sizeof(struct vbt) - sizeof(v->header); | |
| 150 | + v->header.vbt_size = sizeof(struct vbt); | |
| 151 | 151 | v->header.bdb_offset = offsetof(struct vbt, bdb_header); |
| 152 | 152 | |
| 153 | 153 | strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK"); |
| 154 | 154 | v->bdb_header.version = 186; /* child_dev_size = 33 */ |
| 155 | 155 | v->bdb_header.header_size = sizeof(v->bdb_header); |
| 156 | 156 | |
| 157 | − v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header) | |
| 158 | − - sizeof(struct bdb_header); | |
| 157 | + v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header); | |
| 159 | 158 | |
| 160 | 159 | /* general features */ |
| 161 | 160 | v->general_features_header.id = BDB_GENERAL_FEATURES; |
| @@ -272,10 +272,17 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) · 271 unmodified lines | ||
| 272 | 272 | { |
| 273 | 273 | struct intel_gvt *gvt = vgpu->gvt; |
| 274 | 274 | |
| 275 | − mutex_lock(&vgpu->vgpu_lock); | |
| 276 | − | |
| 277 | 275 | WARN(vgpu->active, "vGPU is still active!\n"); |
| 278 | 276 | |
| 277 | + /* | |
| 278 | + * remove idr first so later clean can judge if need to stop | |
| 279 | + * service if no active vgpu. | |
| 280 | + */ | |
| 281 | + mutex_lock(&gvt->lock); | |
| 282 | + idr_remove(&gvt->vgpu_idr, vgpu->id); | |
| 283 | + mutex_unlock(&gvt->lock); | |
| 284 | + | |
| 285 | + mutex_lock(&vgpu->vgpu_lock); | |
| 279 | 286 | intel_gvt_debugfs_remove_vgpu(vgpu); |
| 280 | 287 | intel_vgpu_clean_sched_policy(vgpu); |
| 281 | 288 | intel_vgpu_clean_submission(vgpu); |
| @@ -290,7 +297,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) · 8 unmodified lines | ||
| 290 | 297 | mutex_unlock(&vgpu->vgpu_lock); |
| 291 | 298 | |
| 292 | 299 | mutex_lock(&gvt->lock); |
| 293 | − idr_remove(&gvt->vgpu_idr, vgpu->id); | |
| 294 | 300 | if (idr_is_empty(&gvt->vgpu_idr)) |
| 295 | 301 | intel_gvt_clean_irq(gvt); |
| 296 | 302 | intel_gvt_update_vgpu_types(gvt); |
| @@ -527,19 +527,31 @@ submit_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state) · 526 unmodified lines | ||
| 527 | 527 | return NOTIFY_DONE; |
| 528 | 528 | } |
| 529 | 529 | |
| 530 | +static void irq_semaphore_cb(struct irq_work *wrk) | |
| 531 | +{ | |
| 532 | + struct i915_request *rq = | |
| 533 | + container_of(wrk, typeof(*rq), semaphore_work); | |
| 534 | + | |
| 535 | + i915_schedule_bump_priority(rq, I915_PRIORITY_NOSEMAPHORE); | |
| 536 | + i915_request_put(rq); | |
| 537 | +} | |
| 538 | + | |
| 530 | 539 | static int __i915_sw_fence_call |
| 531 | 540 | semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state) |
| 532 | 541 | { |
| 533 | − struct i915_request *request = | |
| 534 | − container_of(fence, typeof(*request), semaphore); | |
| 542 | + struct i915_request *rq = container_of(fence, typeof(*rq), semaphore); | |
| 535 | 543 | |
| 536 | 544 | switch (state) { |
| 537 | 545 | case FENCE_COMPLETE: |
| 538 | − i915_schedule_bump_priority(request, I915_PRIORITY_NOSEMAPHORE); | |
| 546 | + if (!(READ_ONCE(rq->sched.attr.priority) & I915_PRIORITY_NOSEMAPHORE)) { | |
| 547 | + i915_request_get(rq); | |
| 548 | + init_irq_work(&rq->semaphore_work, irq_semaphore_cb); | |
| 549 | + irq_work_queue(&rq->semaphore_work); | |
| 550 | + } | |
| 539 | 551 | break; |
| 540 | 552 | |
| 541 | 553 | case FENCE_FREE: |
| 542 | − i915_request_put(request); | |
| 554 | + i915_request_put(rq); | |
| 543 | 555 | break; |
| 544 | 556 | } |
| 545 | 557 | |
| @@ -776,8 +788,8 @@ i915_request_await_start(struct i915_request *rq, struct i915_request *signal) · 230 unmodified lines | ||
| 776 | 788 | struct dma_fence *fence; |
| 777 | 789 | int err; |
| 778 | 790 | |
| 779 | − GEM_BUG_ON(i915_request_timeline(rq) == | |
| 780 | − rcu_access_pointer(signal->timeline)); | |
| 791 | + if (i915_request_timeline(rq) == rcu_access_pointer(signal->timeline)) | |
| 792 | + return 0; | |
| 781 | 793 | |
| 782 | 794 | if (i915_request_started(signal)) |
| 783 | 795 | return 0; |
| @@ -821,7 +833,7 @@ i915_request_await_start(struct i915_request *rq, struct i915_request *signal) · 37 unmodified lines | ||
| 821 | 833 | return 0; |
| 822 | 834 | |
| 823 | 835 | err = 0; |
| 824 | − if (intel_timeline_sync_is_later(i915_request_timeline(rq), fence)) | |
| 836 | + if (!intel_timeline_sync_is_later(i915_request_timeline(rq), fence)) | |
| 825 | 837 | err = i915_sw_fence_await_dma_fence(&rq->submit, |
| 826 | 838 | fence, 0, |
| 827 | 839 | I915_FENCE_GFP); |
| @@ -1318,9 +1330,9 @@ void __i915_request_queue(struct i915_request *rq, · 490 unmodified lines | ||
| 1318 | 1330 | * decide whether to preempt the entire chain so that it is ready to |
| 1319 | 1331 | * run at the earliest possible convenience. |
| 1320 | 1332 | */ |
| 1321 | − i915_sw_fence_commit(&rq->semaphore); | |
| 1322 | 1333 | if (attr && rq->engine->schedule) |
| 1323 | 1334 | rq->engine->schedule(rq, attr); |
| 1335 | + i915_sw_fence_commit(&rq->semaphore); | |
| 1324 | 1336 | i915_sw_fence_commit(&rq->submit); |
| 1325 | 1337 | } |
| 1326 | 1338 | |
| @@ -26,6 +26,7 @@ · 25 unmodified lines | ||
| 26 | 26 | #define I915_REQUEST_H |
| 27 | 27 | |
| 28 | 28 | #include <linux/dma-fence.h> |
| 29 | +#include <linux/irq_work.h> | |
| 29 | 30 | #include <linux/lockdep.h> |
| 30 | 31 | |
| 31 | 32 | #include "gem/i915_gem_context_types.h" |
| @@ -208,6 +209,7 @@ struct i915_request { · 176 unmodified lines | ||
| 208 | 209 | }; |
| 209 | 210 | struct list_head execute_cb; |
| 210 | 211 | struct i915_sw_fence semaphore; |
| 212 | + struct irq_work semaphore_work; | |
| 211 | 213 | |
| 212 | 214 | /* |
| 213 | 215 | * A list of everyone we wait upon, and everyone who waits upon us. |
| @@ -234,6 +234,11 @@ static inline u64 ptr_to_u64(const void *ptr) · 233 unmodified lines | ||
| 234 | 234 | __idx; \ |
| 235 | 235 | }) |
| 236 | 236 | |
| 237 | +static inline bool is_power_of_2_u64(u64 n) | |
| 238 | +{ | |
| 239 | + return (n != 0 && ((n & (n - 1)) == 0)); | |
| 240 | +} | |
| 241 | + | |
| 237 | 242 | static inline void __list_del_many(struct list_head *head, |
| 238 | 243 | struct list_head *first) |
| 239 | 244 | { |
| @@ -532,6 +532,8 @@ static const struct hid_device_id hammer_devices[] = { · 531 unmodified lines | ||
| 532 | 532 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) }, |
| 533 | 533 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| 534 | 534 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MASTERBALL) }, |
| 535 | + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | |
| 536 | + USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MOONBALL) }, | |
| 535 | 537 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| 536 | 538 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_STAFF) }, |
| 537 | 539 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| @@ -478,6 +478,7 @@ · 477 unmodified lines | ||
| 478 | 478 | #define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030 |
| 479 | 479 | #define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c |
| 480 | 480 | #define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d |
| 481 | +#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044 | |
| 481 | 482 | |
| 482 | 483 | #define USB_VENDOR_ID_GOTOP 0x08f2 |
| 483 | 484 | #define USB_DEVICE_ID_SUPER_Q2 0x007f |
| @@ -726,6 +727,7 @@ · 242 unmodified lines | ||
| 726 | 727 | #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 |
| 727 | 728 | #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 |
| 728 | 729 | #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 |
| 730 | +#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d | |
| 729 | 731 | |
| 730 | 732 | #define USB_VENDOR_ID_LG 0x1fd2 |
| 731 | 733 | #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 |
| @@ -458,9 +458,9 @@ static ssize_t picolcd_fb_update_rate_show(struct device *dev, · 457 unmodified lines | ||
| 458 | 458 | if (ret >= PAGE_SIZE) |
| 459 | 459 | break; |
| 460 | 460 | else if (i == fb_update_rate) |
| 461 | − ret += snprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i); | |
| 461 | + ret += scnprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i); | |
| 462 | 462 | else |
| 463 | − ret += snprintf(buf+ret, PAGE_SIZE-ret, "%u ", i); | |
| 463 | + ret += scnprintf(buf+ret, PAGE_SIZE-ret, "%u ", i); | |
| 464 | 464 | if (ret > 0) |
| 465 | 465 | buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n'; |
| 466 | 466 | return ret; |
| @@ -103,6 +103,7 @@ static const struct hid_device_id hid_quirks[] = { · 102 unmodified lines | ||
| 103 | 103 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, |
| 104 | 104 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, |
| 105 | 105 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, |
| 106 | + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, | |
| 106 | 107 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007), HID_QUIRK_ALWAYS_POLL }, |
| 107 | 108 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077), HID_QUIRK_ALWAYS_POLL }, |
| 108 | 109 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS), HID_QUIRK_NOGET }, |
| @@ -313,7 +313,7 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr, · 312 unmodified lines | ||
| 313 | 313 | |
| 314 | 314 | while (i < ret) { |
| 315 | 315 | if (i + attribute->size > ret) { |
| 316 | − len += snprintf(&buf[len], | |
| 316 | + len += scnprintf(&buf[len], | |
| 317 | 317 | PAGE_SIZE - len, |
| 318 | 318 | "%d ", values[i]); |
| 319 | 319 | break; |
| @@ -336,10 +336,10 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr, · 16 unmodified lines | ||
| 336 | 336 | ++i; |
| 337 | 337 | break; |
| 338 | 338 | } |
| 339 | − len += snprintf(&buf[len], PAGE_SIZE - len, | |
| 339 | + len += scnprintf(&buf[len], PAGE_SIZE - len, | |
| 340 | 340 | "%lld ", value); |
| 341 | 341 | } |
| 342 | − len += snprintf(&buf[len], PAGE_SIZE - len, "\n"); | |
| 342 | + len += scnprintf(&buf[len], PAGE_SIZE - len, "\n"); | |
| 343 | 343 | |
| 344 | 344 | return len; |
| 345 | 345 | } else if (input) |
| @@ -719,9 +719,6 @@ static int msc_win_set_lockout(struct msc_window *win, · 718 unmodified lines | ||
| 719 | 719 | |
| 720 | 720 | if (old != expect) { |
| 721 | 721 | ret = -EINVAL; |
| 722 | − dev_warn_ratelimited(msc_dev(win->msc), | |
| 723 | − "expected lockout state %d, got %d\n", | |
| 724 | − expect, old); | |
| 725 | 722 | goto unlock; |
| 726 | 723 | } |
| 727 | 724 | |
| @@ -742,6 +739,10 @@ unlock: · 14 unmodified lines | ||
| 742 | 739 | /* from intel_th_msc_window_unlock(), don't warn if not locked */ |
| 743 | 740 | if (expect == WIN_LOCKED && old == new) |
| 744 | 741 | return 0; |
| 742 | + | |
| 743 | + dev_warn_ratelimited(msc_dev(win->msc), | |
| 744 | + "expected lockout state %d, got %d\n", | |
| 745 | + expect, old); | |
| 745 | 746 | } |
| 746 | 747 | |
| 747 | 748 | return ret; |
| @@ -761,7 +762,7 @@ static int msc_configure(struct msc *msc) · 13 unmodified lines | ||
| 761 | 762 | lockdep_assert_held(&msc->buf_mutex); |
| 762 | 763 | |
| 763 | 764 | if (msc->mode > MSC_MODE_MULTI) |
| 764 | − return -ENOTSUPP; | |
| 765 | + return -EINVAL; | |
| 765 | 766 | |
| 766 | 767 | if (msc->mode == MSC_MODE_MULTI) { |
| 767 | 768 | if (msc_win_set_lockout(msc->cur_win, WIN_READY, WIN_INUSE)) |
| @@ -1295,7 +1296,7 @@ static int msc_buffer_alloc(struct msc *msc, unsigned long *nr_pages, · 527 unmodified lines | ||
| 1295 | 1296 | } else if (msc->mode == MSC_MODE_MULTI) { |
| 1296 | 1297 | ret = msc_buffer_multi_alloc(msc, nr_pages, nr_wins); |
| 1297 | 1298 | } else { |
| 1298 | − ret = -ENOTSUPP; | |
| 1299 | + ret = -EINVAL; | |
| 1299 | 1300 | } |
| 1300 | 1301 | |
| 1301 | 1302 | if (!ret) { |
| @@ -1531,7 +1532,7 @@ static ssize_t intel_th_msc_read(struct file *file, char __user *buf, · 229 unmodified lines | ||
| 1531 | 1532 | if (ret >= 0) |
| 1532 | 1533 | *ppos = iter->offset; |
| 1533 | 1534 | } else { |
| 1534 | − ret = -ENOTSUPP; | |
| 1535 | + ret = -EINVAL; | |
| 1535 | 1536 | } |
| 1536 | 1537 | |
| 1537 | 1538 | put_count: |
| @@ -238,6 +238,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { · 237 unmodified lines | ||
| 238 | 238 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), |
| 239 | 239 | .driver_data = (kernel_ulong_t)&intel_th_2x, |
| 240 | 240 | }, |
| 241 | + { | |
| 242 | + /* Elkhart Lake CPU */ | |
| 243 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), | |
| 244 | + .driver_data = (kernel_ulong_t)&intel_th_2x, | |
| 245 | + }, | |
| 241 | 246 | { |
| 242 | 247 | /* Elkhart Lake */ |
| 243 | 248 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), |
| @@ -238,7 +238,7 @@ static struct configfs_attribute *sys_t_policy_attrs[] = { · 237 unmodified lines | ||
| 238 | 238 | static inline bool sys_t_need_ts(struct sys_t_output *op) |
| 239 | 239 | { |
| 240 | 240 | if (op->node.ts_interval && |
| 241 | − time_after(op->ts_jiffies + op->node.ts_interval, jiffies)) { | |
| 241 | + time_after(jiffies, op->ts_jiffies + op->node.ts_interval)) { | |
| 242 | 242 | op->ts_jiffies = jiffies; |
| 243 | 243 | |
| 244 | 244 | return true; |
| @@ -250,8 +250,8 @@ static inline bool sys_t_need_ts(struct sys_t_output *op) · 5 unmodified lines | ||
| 250 | 250 | static bool sys_t_need_clock_sync(struct sys_t_output *op) |
| 251 | 251 | { |
| 252 | 252 | if (op->node.clocksync_interval && |
| 253 | − time_after(op->clocksync_jiffies + op->node.clocksync_interval, | |
| 254 | − jiffies)) { | |
| 253 | + time_after(jiffies, | |
| 254 | + op->clocksync_jiffies + op->node.clocksync_interval)) { | |
| 255 | 255 | op->clocksync_jiffies = jiffies; |
| 256 | 256 | |
| 257 | 257 | return true; |
| @@ -313,6 +313,7 @@ static void i2c_dw_pci_remove(struct pci_dev *pdev) · 312 unmodified lines | ||
| 313 | 313 | pm_runtime_get_noresume(&pdev->dev); |
| 314 | 314 | |
| 315 | 315 | i2c_del_adapter(&dev->adapter); |
| 316 | + devm_free_irq(&pdev->dev, dev->irq, dev); | |
| 316 | 317 | pci_free_irq_vectors(pdev); |
| 317 | 318 | } |
| 318 | 319 | |
| @@ -348,7 +348,7 @@ static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, · 347 unmodified lines | ||
| 348 | 348 | if (ret == -ENOENT) |
| 349 | 349 | retdesc = ERR_PTR(-EPROBE_DEFER); |
| 350 | 350 | |
| 351 | − if (ret != -EPROBE_DEFER) | |
| 351 | + if (PTR_ERR(retdesc) != -EPROBE_DEFER) | |
| 352 | 352 | dev_err(dev, "error trying to get descriptor: %d\n", ret); |
| 353 | 353 | |
| 354 | 354 | return retdesc; |
| @@ -132,11 +132,6 @@ · 131 unmodified lines | ||
| 132 | 132 | #define TCOBASE 0x050 |
| 133 | 133 | #define TCOCTL 0x054 |
| 134 | 134 | |
| 135 | −#define ACPIBASE 0x040 | |
| 136 | −#define ACPIBASE_SMI_OFF 0x030 | |
| 137 | −#define ACPICTRL 0x044 | |
| 138 | −#define ACPICTRL_EN 0x080 | |
| 139 | − | |
| 140 | 135 | #define SBREG_BAR 0x10 |
| 141 | 136 | #define SBREG_SMBCTRL 0xc6000c |
| 142 | 137 | #define SBREG_SMBCTRL_DNV 0xcf000c |
| @@ -1553,7 +1548,7 @@ i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, · 1410 unmodified lines | ||
| 1553 | 1548 | pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); |
| 1554 | 1549 | spin_unlock(&p2sb_spinlock); |
| 1555 | 1550 | |
| 1556 | − res = &tco_res[ICH_RES_MEM_OFF]; | |
| 1551 | + res = &tco_res[1]; | |
| 1557 | 1552 | if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) |
| 1558 | 1553 | res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; |
| 1559 | 1554 | else |
| @@ -1563,7 +1558,7 @@ i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, · 3 unmodified lines | ||
| 1563 | 1558 | res->flags = IORESOURCE_MEM; |
| 1564 | 1559 | |
| 1565 | 1560 | return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, |
| 1566 | − tco_res, 3, &spt_tco_platform_data, | |
| 1561 | + tco_res, 2, &spt_tco_platform_data, | |
| 1567 | 1562 | sizeof(spt_tco_platform_data)); |
| 1568 | 1563 | } |
| 1569 | 1564 | |
| @@ -1576,17 +1571,16 @@ static struct platform_device * · 6 unmodified lines | ||
| 1576 | 1571 | i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, |
| 1577 | 1572 | struct resource *tco_res) |
| 1578 | 1573 | { |
| 1579 | − return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, | |
| 1580 | − tco_res, 2, &cnl_tco_platform_data, | |
| 1581 | − sizeof(cnl_tco_platform_data)); | |
| 1574 | + return platform_device_register_resndata(&pci_dev->dev, | |
| 1575 | + "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, | |
| 1576 | + sizeof(cnl_tco_platform_data)); | |
| 1582 | 1577 | } |
| 1583 | 1578 | |
| 1584 | 1579 | static void i801_add_tco(struct i801_priv *priv) |
| 1585 | 1580 | { |
| 1586 | − u32 base_addr, tco_base, tco_ctl, ctrl_val; | |
| 1587 | 1581 | struct pci_dev *pci_dev = priv->pci_dev; |
| 1588 | − struct resource tco_res[3], *res; | |
| 1589 | − unsigned int devfn; | |
| 1582 | + struct resource tco_res[2], *res; | |
| 1583 | + u32 tco_base, tco_ctl; | |
| 1590 | 1584 | |
| 1591 | 1585 | /* If we have ACPI based watchdog use that instead */ |
| 1592 | 1586 | if (acpi_has_watchdog()) |
| @@ -1601,30 +1595,15 @@ static void i801_add_tco(struct i801_priv *priv) · 8 unmodified lines | ||
| 1601 | 1595 | return; |
| 1602 | 1596 | |
| 1603 | 1597 | memset(tco_res, 0, sizeof(tco_res)); |
| 1604 | − | |
| 1605 | − res = &tco_res[ICH_RES_IO_TCO]; | |
| 1606 | − res->start = tco_base & ~1; | |
| 1607 | − res->end = res->start + 32 - 1; | |
| 1608 | − res->flags = IORESOURCE_IO; | |
| 1609 | − | |
| 1610 | 1598 | /* |
| 1611 | − * Power Management registers. | |
| 1599 | + * Always populate the main iTCO IO resource here. The second entry | |
| 1600 | + * for NO_REBOOT MMIO is filled by the SPT specific function. | |
| 1612 | 1601 | */ |
| 1613 | − devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 2); | |
| 1614 | − pci_bus_read_config_dword(pci_dev->bus, devfn, ACPIBASE, &base_addr); | |
| 1615 | − | |
| 1616 | − res = &tco_res[ICH_RES_IO_SMI]; | |
| 1617 | − res->start = (base_addr & ~1) + ACPIBASE_SMI_OFF; | |
| 1618 | − res->end = res->start + 3; | |
| 1602 | + res = &tco_res[0]; | |
| 1603 | + res->start = tco_base & ~1; | |
| 1604 | + res->end = res->start + 32 - 1; | |
| 1619 | 1605 | res->flags = IORESOURCE_IO; |
| 1620 | 1606 | |
| 1621 | − /* | |
| 1622 | − * Enable the ACPI I/O space. | |
| 1623 | − */ | |
| 1624 | − pci_bus_read_config_dword(pci_dev->bus, devfn, ACPICTRL, &ctrl_val); | |
| 1625 | − ctrl_val |= ACPICTRL_EN; | |
| 1626 | − pci_bus_write_config_dword(pci_dev->bus, devfn, ACPICTRL, ctrl_val); | |
| 1627 | − | |
| 1628 | 1607 | if (priv->features & FEATURE_TCO_CNL) |
| 1629 | 1608 | priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); |
| 1630 | 1609 | else |
| @@ -394,9 +394,17 @@ EXPORT_SYMBOL_GPL(i2c_acpi_find_adapter_by_handle); · 393 unmodified lines | ||
| 394 | 394 | static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev) |
| 395 | 395 | { |
| 396 | 396 | struct device *dev; |
| 397 | + struct i2c_client *client; | |
| 397 | 398 | |
| 398 | 399 | dev = bus_find_device_by_acpi_dev(&i2c_bus_type, adev); |
| 399 | − return dev ? i2c_verify_client(dev) : NULL; | |
| 400 | + if (!dev) | |
| 401 | + return NULL; | |
| 402 | + | |
| 403 | + client = i2c_verify_client(dev); | |
| 404 | + if (!client) | |
| 405 | + put_device(dev); | |
| 406 | + | |
| 407 | + return client; | |
| 400 | 408 | } |
| 401 | 409 | |
| 402 | 410 | static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value, |
| @@ -237,6 +237,7 @@ static const struct adxl372_axis_lookup adxl372_axis_lookup_table[] = { · 236 unmodified lines | ||
| 237 | 237 | .realbits = 12, \ |
| 238 | 238 | .storagebits = 16, \ |
| 239 | 239 | .shift = 4, \ |
| 240 | + .endianness = IIO_BE, \ | |
| 240 | 241 | }, \ |
| 241 | 242 | } |
| 242 | 243 | |
| @@ -110,7 +110,7 @@ MODULE_DEVICE_TABLE(of, st_accel_of_match); · 109 unmodified lines | ||
| 110 | 110 | |
| 111 | 111 | #ifdef CONFIG_ACPI |
| 112 | 112 | static const struct acpi_device_id st_accel_acpi_match[] = { |
| 113 | − {"SMO8840", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME}, | |
| 113 | + {"SMO8840", (kernel_ulong_t)LIS2DH12_ACCEL_DEV_NAME}, | |
| 114 | 114 | {"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME}, |
| 115 | 115 | { }, |
| 116 | 116 | }; |
| @@ -723,6 +723,7 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) · 722 unmodified lines | ||
| 723 | 723 | |
| 724 | 724 | for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { |
| 725 | 725 | struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); |
| 726 | + u32 cor; | |
| 726 | 727 | |
| 727 | 728 | if (!chan) |
| 728 | 729 | continue; |
| @@ -731,6 +732,20 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) · 2 unmodified lines | ||
| 731 | 732 | chan->type == IIO_PRESSURE) |
| 732 | 733 | continue; |
| 733 | 734 | |
| 735 | + if (state) { | |
| 736 | + cor = at91_adc_readl(st, AT91_SAMA5D2_COR); | |
| 737 | + | |
| 738 | + if (chan->differential) | |
| 739 | + cor |= (BIT(chan->channel) | | |
| 740 | + BIT(chan->channel2)) << | |
| 741 | + AT91_SAMA5D2_COR_DIFF_OFFSET; | |
| 742 | + else | |
| 743 | + cor &= ~(BIT(chan->channel) << | |
| 744 | + AT91_SAMA5D2_COR_DIFF_OFFSET); | |
| 745 | + | |
| 746 | + at91_adc_writel(st, AT91_SAMA5D2_COR, cor); | |
| 747 | + } | |
| 748 | + | |
| 734 | 749 | if (state) { |
| 735 | 750 | at91_adc_writel(st, AT91_SAMA5D2_CHER, |
| 736 | 751 | BIT(chan->channel)); |
| @@ -842,31 +842,6 @@ static inline void stm32_dfsdm_process_data(struct stm32_dfsdm_adc *adc, · 841 unmodified lines | ||
| 842 | 842 | } |
| 843 | 843 | } |
| 844 | 844 | |
| 845 | −static irqreturn_t stm32_dfsdm_adc_trigger_handler(int irq, void *p) | |
| 846 | −{ | |
| 847 | − struct iio_poll_func *pf = p; | |
| 848 | − struct iio_dev *indio_dev = pf->indio_dev; | |
| 849 | − struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); | |
| 850 | − int available = stm32_dfsdm_adc_dma_residue(adc); | |
| 851 | − | |
| 852 | − while (available >= indio_dev->scan_bytes) { | |
| 853 | − s32 *buffer = (s32 *)&adc->rx_buf[adc->bufi]; | |
| 854 | − | |
| 855 | − stm32_dfsdm_process_data(adc, buffer); | |
| 856 | − | |
| 857 | − iio_push_to_buffers_with_timestamp(indio_dev, buffer, | |
| 858 | − pf->timestamp); | |
| 859 | − available -= indio_dev->scan_bytes; | |
| 860 | − adc->bufi += indio_dev->scan_bytes; | |
| 861 | − if (adc->bufi >= adc->buf_sz) | |
| 862 | − adc->bufi = 0; | |
| 863 | − } | |
| 864 | − | |
| 865 | − iio_trigger_notify_done(indio_dev->trig); | |
| 866 | − | |
| 867 | − return IRQ_HANDLED; | |
| 868 | −} | |
| 869 | − | |
| 870 | 845 | static void stm32_dfsdm_dma_buffer_done(void *data) |
| 871 | 846 | { |
| 872 | 847 | struct iio_dev *indio_dev = data; |
| @@ -874,11 +849,6 @@ static void stm32_dfsdm_dma_buffer_done(void *data) · 1 unmodified line | ||
| 874 | 849 | int available = stm32_dfsdm_adc_dma_residue(adc); |
| 875 | 850 | size_t old_pos; |
| 876 | 851 | |
| 877 | − if (indio_dev->currentmode & INDIO_BUFFER_TRIGGERED) { | |
| 878 | − iio_trigger_poll_chained(indio_dev->trig); | |
| 879 | − return; | |
| 880 | − } | |
| 881 | − | |
| 882 | 852 | /* |
| 883 | 853 | * FIXME: In Kernel interface does not support cyclic DMA buffer,and |
| 884 | 854 | * offers only an interface to push data samples per samples. |
| @@ -906,7 +876,15 @@ static void stm32_dfsdm_dma_buffer_done(void *data) · 21 unmodified lines | ||
| 906 | 876 | adc->bufi = 0; |
| 907 | 877 | old_pos = 0; |
| 908 | 878 | } |
| 909 | − /* regular iio buffer without trigger */ | |
| 879 | + /* | |
| 880 | + * In DMA mode the trigger services of IIO are not used | |
| 881 | + * (e.g. no call to iio_trigger_poll). | |
| 882 | + * Calling irq handler associated to the hardware trigger is not | |
| 883 | + * relevant as the conversions have already been done. Data | |
| 884 | + * transfers are performed directly in DMA callback instead. | |
| 885 | + * This implementation avoids to call trigger irq handler that | |
| 886 | + * may sleep, in an atomic context (DMA irq handler context). | |
| 887 | + */ | |
| 910 | 888 | if (adc->dev_data->type == DFSDM_IIO) |
| 911 | 889 | iio_push_to_buffers(indio_dev, buffer); |
| 912 | 890 | } |
| @@ -1536,8 +1514,7 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev) · 623 unmodified lines | ||
| 1536 | 1514 | } |
| 1537 | 1515 | |
| 1538 | 1516 | ret = iio_triggered_buffer_setup(indio_dev, |
| 1539 | − &iio_pollfunc_store_time, | |
| 1540 | − &stm32_dfsdm_adc_trigger_handler, | |
| 1517 | + &iio_pollfunc_store_time, NULL, | |
| 1541 | 1518 | &stm32_dfsdm_buffer_setup_ops); |
| 1542 | 1519 | if (ret) { |
| 1543 | 1520 | stm32_dfsdm_dma_release(indio_dev); |
| @@ -91,6 +91,8 @@ config SPS30 · 90 unmodified lines | ||
| 91 | 91 | tristate "SPS30 particulate matter sensor" |
| 92 | 92 | depends on I2C |
| 93 | 93 | select CRC8 |
| 94 | + select IIO_BUFFER | |
| 95 | + select IIO_TRIGGERED_BUFFER | |
| 94 | 96 | help |
| 95 | 97 | Say Y here to build support for the Sensirion SPS30 particulate |
| 96 | 98 | matter sensor. |
| @@ -167,16 +167,17 @@ static int vcnl4200_init(struct vcnl4000_data *data) · 166 unmodified lines | ||
| 167 | 167 | data->vcnl4200_ps.reg = VCNL4200_PS_DATA; |
| 168 | 168 | switch (id) { |
| 169 | 169 | case VCNL4200_PROD_ID: |
| 170 | − /* Integration time is 50ms, but the experiments */ | |
| 171 | − /* show 54ms in total. */ | |
| 172 | − data->vcnl4200_al.sampling_rate = ktime_set(0, 54000 * 1000); | |
| 173 | − data->vcnl4200_ps.sampling_rate = ktime_set(0, 4200 * 1000); | |
| 170 | + /* Default wait time is 50ms, add 20% tolerance. */ | |
| 171 | + data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000); | |
| 172 | + /* Default wait time is 4.8ms, add 20% tolerance. */ | |
| 173 | + data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000); | |
| 174 | 174 | data->al_scale = 24000; |
| 175 | 175 | break; |
| 176 | 176 | case VCNL4040_PROD_ID: |
| 177 | − /* Integration time is 80ms, add 10ms. */ | |
| 178 | − data->vcnl4200_al.sampling_rate = ktime_set(0, 100000 * 1000); | |
| 179 | − data->vcnl4200_ps.sampling_rate = ktime_set(0, 100000 * 1000); | |
| 177 | + /* Default wait time is 80ms, add 20% tolerance. */ | |
| 178 | + data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000); | |
| 179 | + /* Default wait time is 5ms, add 20% tolerance. */ | |
| 180 | + data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000); | |
| 180 | 181 | data->al_scale = 120000; |
| 181 | 182 | break; |
| 182 | 183 | } |
| @@ -564,7 +564,7 @@ static int ak8974_read_raw(struct iio_dev *indio_dev, · 563 unmodified lines | ||
| 564 | 564 | * We read all axes and discard all but one, for optimized |
| 565 | 565 | * reading, use the triggered buffer. |
| 566 | 566 | */ |
| 567 | − *val = le16_to_cpu(hw_values[chan->address]); | |
| 567 | + *val = (s16)le16_to_cpu(hw_values[chan->address]); | |
| 568 | 568 | |
| 569 | 569 | ret = IIO_VAL_INT; |
| 570 | 570 | } |
| @@ -269,7 +269,7 @@ static const struct iio_chan_spec ping_chan_spec[] = { · 268 unmodified lines | ||
| 269 | 269 | |
| 270 | 270 | static const struct of_device_id of_ping_match[] = { |
| 271 | 271 | { .compatible = "parallax,ping", .data = &pa_ping_cfg}, |
| 272 | − { .compatible = "parallax,laserping", .data = &pa_ping_cfg}, | |
| 272 | + { .compatible = "parallax,laserping", .data = &pa_laser_ping_cfg}, | |
| 273 | 273 | {}, |
| 274 | 274 | }; |
| 275 | 275 | |
| @@ -161,7 +161,8 @@ static int stm32_timer_start(struct stm32_timer_trigger *priv, · 160 unmodified lines | ||
| 161 | 161 | return 0; |
| 162 | 162 | } |
| 163 | 163 | |
| 164 | −static void stm32_timer_stop(struct stm32_timer_trigger *priv) | |
| 164 | +static void stm32_timer_stop(struct stm32_timer_trigger *priv, | |
| 165 | + struct iio_trigger *trig) | |
| 165 | 166 | { |
| 166 | 167 | u32 ccer, cr1; |
| 167 | 168 | |
| @@ -179,6 +180,12 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv) · 11 unmodified lines | ||
| 179 | 180 | regmap_write(priv->regmap, TIM_PSC, 0); |
| 180 | 181 | regmap_write(priv->regmap, TIM_ARR, 0); |
| 181 | 182 | |
| 183 | + /* Force disable master mode */ | |
| 184 | + if (stm32_timer_is_trgo2_name(trig->name)) | |
| 185 | + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0); | |
| 186 | + else | |
| 187 | + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0); | |
| 188 | + | |
| 182 | 189 | /* Make sure that registers are updated */ |
| 183 | 190 | regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); |
| 184 | 191 | } |
| @@ -197,7 +204,7 @@ static ssize_t stm32_tt_store_frequency(struct device *dev, · 12 unmodified lines | ||
| 197 | 204 | return ret; |
| 198 | 205 | |
| 199 | 206 | if (freq == 0) { |
| 200 | − stm32_timer_stop(priv); | |
| 207 | + stm32_timer_stop(priv, trig); | |
| 201 | 208 | } else { |
| 202 | 209 | ret = stm32_timer_start(priv, trig, freq); |
| 203 | 210 | if (ret) |
| @@ -3826,7 +3826,7 @@ int amd_iommu_activate_guest_mode(void *data) · 3825 unmodified lines | ||
| 3826 | 3826 | entry->lo.fields_vapic.ga_tag = ir_data->ga_tag; |
| 3827 | 3827 | |
| 3828 | 3828 | return modify_irte_ga(ir_data->irq_2_irte.devid, |
| 3829 | − ir_data->irq_2_irte.index, entry, NULL); | |
| 3829 | + ir_data->irq_2_irte.index, entry, ir_data); | |
| 3830 | 3830 | } |
| 3831 | 3831 | EXPORT_SYMBOL(amd_iommu_activate_guest_mode); |
| 3832 | 3832 | |
| @@ -3852,7 +3852,7 @@ int amd_iommu_deactivate_guest_mode(void *data) · 19 unmodified lines | ||
| 3852 | 3852 | APICID_TO_IRTE_DEST_HI(cfg->dest_apicid); |
| 3853 | 3853 | |
| 3854 | 3854 | return modify_irte_ga(ir_data->irq_2_irte.devid, |
| 3855 | − ir_data->irq_2_irte.index, entry, NULL); | |
| 3855 | + ir_data->irq_2_irte.index, entry, ir_data); | |
| 3856 | 3856 | } |
| 3857 | 3857 | EXPORT_SYMBOL(amd_iommu_deactivate_guest_mode); |
| 3858 | 3858 | |
| @@ -177,15 +177,15 @@ static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie, · 176 unmodified lines | ||
| 177 | 177 | start -= iova_offset(iovad, start); |
| 178 | 178 | num_pages = iova_align(iovad, end - start) >> iova_shift(iovad); |
| 179 | 179 | |
| 180 | − msi_page = kcalloc(num_pages, sizeof(*msi_page), GFP_KERNEL); | |
| 181 | − if (!msi_page) | |
| 182 | − return -ENOMEM; | |
| 183 | − | |
| 184 | 180 | for (i = 0; i < num_pages; i++) { |
| 185 | − msi_page[i].phys = start; | |
| 186 | − msi_page[i].iova = start; | |
| 187 | − INIT_LIST_HEAD(&msi_page[i].list); | |
| 188 | − list_add(&msi_page[i].list, &cookie->msi_page_list); | |
| 181 | + msi_page = kmalloc(sizeof(*msi_page), GFP_KERNEL); | |
| 182 | + if (!msi_page) | |
| 183 | + return -ENOMEM; | |
| 184 | + | |
| 185 | + msi_page->phys = start; | |
| 186 | + msi_page->iova = start; | |
| 187 | + INIT_LIST_HEAD(&msi_page->list); | |
| 188 | + list_add(&msi_page->list, &cookie->msi_page_list); | |
| 189 | 189 | start += iovad->granule; |
| 190 | 190 | } |
| 191 | 191 | |
| @@ -28,6 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | #include <linux/slab.h> |
| 29 | 29 | #include <linux/iommu.h> |
| 30 | 30 | #include <linux/numa.h> |
| 31 | +#include <linux/limits.h> | |
| 31 | 32 | #include <asm/irq_remapping.h> |
| 32 | 33 | #include <asm/iommu_table.h> |
| 33 | 34 | |
| @@ -128,6 +129,13 @@ dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event) · 94 unmodified lines | ||
| 128 | 129 | |
| 129 | 130 | BUG_ON(dev->is_virtfn); |
| 130 | 131 | |
| 132 | + /* | |
| 133 | + * Ignore devices that have a domain number higher than what can | |
| 134 | + * be looked up in DMAR, e.g. VMD subdevices with domain 0x10000 | |
| 135 | + */ | |
| 136 | + if (pci_domain_nr(dev->bus) > U16_MAX) | |
| 137 | + return NULL; | |
| 138 | + | |
| 131 | 139 | /* Only generate path[] for device addition event */ |
| 132 | 140 | if (event == BUS_NOTIFY_ADD_DEVICE) |
| 133 | 141 | for (tmp = dev; tmp; tmp = tmp->bus->self) |
| @@ -363,7 +371,8 @@ dmar_find_dmaru(struct acpi_dmar_hardware_unit *drhd) · 229 unmodified lines | ||
| 363 | 371 | { |
| 364 | 372 | struct dmar_drhd_unit *dmaru; |
| 365 | 373 | |
| 366 | − list_for_each_entry_rcu(dmaru, &dmar_drhd_units, list) | |
| 374 | + list_for_each_entry_rcu(dmaru, &dmar_drhd_units, list, | |
| 375 | + dmar_rcu_check()) | |
| 367 | 376 | if (dmaru->segment == drhd->segment && |
| 368 | 377 | dmaru->reg_base_addr == drhd->address) |
| 369 | 378 | return dmaru; |
| @@ -440,12 +449,13 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header, · 70 unmodified lines | ||
| 440 | 449 | |
| 441 | 450 | /* Check for NUL termination within the designated length */ |
| 442 | 451 | if (strnlen(andd->device_name, header->length - 8) == header->length - 8) { |
| 443 | − WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, | |
| 452 | + pr_warn(FW_BUG | |
| 444 | 453 | "Your BIOS is broken; ANDD object name is not NUL-terminated\n" |
| 445 | 454 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 446 | 455 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 447 | 456 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 448 | 457 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 458 | + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | |
| 449 | 459 | return -EINVAL; |
| 450 | 460 | } |
| 451 | 461 | pr_info("ANDD device: %x name: %s\n", andd->device_number, |
| @@ -471,14 +481,14 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg) · 19 unmodified lines | ||
| 471 | 481 | return 0; |
| 472 | 482 | } |
| 473 | 483 | } |
| 474 | − WARN_TAINT( | |
| 475 | − 1, TAINT_FIRMWARE_WORKAROUND, | |
| 484 | + pr_warn(FW_BUG | |
| 476 | 485 | "Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n" |
| 477 | 486 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 478 | − drhd->reg_base_addr, | |
| 487 | + rhsa->base_address, | |
| 479 | 488 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 480 | 489 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 481 | 490 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 491 | + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | |
| 482 | 492 | |
| 483 | 493 | return 0; |
| 484 | 494 | } |
| @@ -827,14 +837,14 @@ int __init dmar_table_init(void) · 342 unmodified lines | ||
| 827 | 837 | |
| 828 | 838 | static void warn_invalid_dmar(u64 addr, const char *message) |
| 829 | 839 | { |
| 830 | − WARN_TAINT_ONCE( | |
| 831 | − 1, TAINT_FIRMWARE_WORKAROUND, | |
| 840 | + pr_warn_once(FW_BUG | |
| 832 | 841 | "Your BIOS is broken; DMAR reported at address %llx%s!\n" |
| 833 | 842 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 834 | 843 | addr, message, |
| 835 | 844 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 836 | 845 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 837 | 846 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 847 | + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | |
| 838 | 848 | } |
| 839 | 849 | |
| 840 | 850 | static int __ref |
| @@ -33,38 +33,42 @@ struct iommu_regset { · 32 unmodified lines | ||
| 33 | 33 | |
| 34 | 34 | #define IOMMU_REGSET_ENTRY(_reg_) \ |
| 35 | 35 | { DMAR_##_reg_##_REG, __stringify(_reg_) } |
| 36 | −static const struct iommu_regset iommu_regs[] = { | |
| 36 | + | |
| 37 | +static const struct iommu_regset iommu_regs_32[] = { | |
| 37 | 38 | IOMMU_REGSET_ENTRY(VER), |
| 38 | − IOMMU_REGSET_ENTRY(CAP), | |
| 39 | − IOMMU_REGSET_ENTRY(ECAP), | |
| 40 | 39 | IOMMU_REGSET_ENTRY(GCMD), |
| 41 | 40 | IOMMU_REGSET_ENTRY(GSTS), |
| 42 | − IOMMU_REGSET_ENTRY(RTADDR), | |
| 43 | − IOMMU_REGSET_ENTRY(CCMD), | |
| 44 | 41 | IOMMU_REGSET_ENTRY(FSTS), |
| 45 | 42 | IOMMU_REGSET_ENTRY(FECTL), |
| 46 | 43 | IOMMU_REGSET_ENTRY(FEDATA), |
| 47 | 44 | IOMMU_REGSET_ENTRY(FEADDR), |
| 48 | 45 | IOMMU_REGSET_ENTRY(FEUADDR), |
| 49 | − IOMMU_REGSET_ENTRY(AFLOG), | |
| 50 | 46 | IOMMU_REGSET_ENTRY(PMEN), |
| 51 | 47 | IOMMU_REGSET_ENTRY(PLMBASE), |
| 52 | 48 | IOMMU_REGSET_ENTRY(PLMLIMIT), |
| 49 | + IOMMU_REGSET_ENTRY(ICS), | |
| 50 | + IOMMU_REGSET_ENTRY(PRS), | |
| 51 | + IOMMU_REGSET_ENTRY(PECTL), | |
| 52 | + IOMMU_REGSET_ENTRY(PEDATA), | |
| 53 | + IOMMU_REGSET_ENTRY(PEADDR), | |
| 54 | + IOMMU_REGSET_ENTRY(PEUADDR), | |
| 55 | +}; | |
| 56 | + | |
| 57 | +static const struct iommu_regset iommu_regs_64[] = { | |
| 58 | + IOMMU_REGSET_ENTRY(CAP), | |
| 59 | + IOMMU_REGSET_ENTRY(ECAP), | |
| 60 | + IOMMU_REGSET_ENTRY(RTADDR), | |
| 61 | + IOMMU_REGSET_ENTRY(CCMD), | |
| 62 | + IOMMU_REGSET_ENTRY(AFLOG), | |
| 53 | 63 | IOMMU_REGSET_ENTRY(PHMBASE), |
| 54 | 64 | IOMMU_REGSET_ENTRY(PHMLIMIT), |
| 55 | 65 | IOMMU_REGSET_ENTRY(IQH), |
| 56 | 66 | IOMMU_REGSET_ENTRY(IQT), |
| 57 | 67 | IOMMU_REGSET_ENTRY(IQA), |
| 58 | − IOMMU_REGSET_ENTRY(ICS), | |
| 59 | 68 | IOMMU_REGSET_ENTRY(IRTA), |
| 60 | 69 | IOMMU_REGSET_ENTRY(PQH), |
| 61 | 70 | IOMMU_REGSET_ENTRY(PQT), |
| 62 | 71 | IOMMU_REGSET_ENTRY(PQA), |
| 63 | − IOMMU_REGSET_ENTRY(PRS), | |
| 64 | − IOMMU_REGSET_ENTRY(PECTL), | |
| 65 | − IOMMU_REGSET_ENTRY(PEDATA), | |
| 66 | − IOMMU_REGSET_ENTRY(PEADDR), | |
| 67 | − IOMMU_REGSET_ENTRY(PEUADDR), | |
| 68 | 72 | IOMMU_REGSET_ENTRY(MTRRCAP), |
| 69 | 73 | IOMMU_REGSET_ENTRY(MTRRDEF), |
| 70 | 74 | IOMMU_REGSET_ENTRY(MTRR_FIX64K_00000), |
| @@ -127,10 +131,16 @@ static int iommu_regset_show(struct seq_file *m, void *unused) · 56 unmodified lines | ||
| 127 | 131 | * by adding the offset to the pointer (virtual address). |
| 128 | 132 | */ |
| 129 | 133 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
| 130 | − for (i = 0 ; i < ARRAY_SIZE(iommu_regs); i++) { | |
| 131 | − value = dmar_readq(iommu->reg + iommu_regs[i].offset); | |
| 134 | + for (i = 0 ; i < ARRAY_SIZE(iommu_regs_32); i++) { | |
| 135 | + value = dmar_readl(iommu->reg + iommu_regs_32[i].offset); | |
| 136 | + seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n", | |
| 137 | + iommu_regs_32[i].regs, iommu_regs_32[i].offset, | |
| 138 | + value); | |
| 139 | + } | |
| 140 | + for (i = 0 ; i < ARRAY_SIZE(iommu_regs_64); i++) { | |
| 141 | + value = dmar_readq(iommu->reg + iommu_regs_64[i].offset); | |
| 132 | 142 | seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n", |
| 133 | − iommu_regs[i].regs, iommu_regs[i].offset, | |
| 143 | + iommu_regs_64[i].regs, iommu_regs_64[i].offset, | |
| 134 | 144 | value); |
| 135 | 145 | } |
| 136 | 146 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
| @@ -272,9 +282,16 @@ static int dmar_translation_struct_show(struct seq_file *m, void *unused) · 135 unmodified lines | ||
| 272 | 282 | { |
| 273 | 283 | struct dmar_drhd_unit *drhd; |
| 274 | 284 | struct intel_iommu *iommu; |
| 285 | + u32 sts; | |
| 275 | 286 | |
| 276 | 287 | rcu_read_lock(); |
| 277 | 288 | for_each_active_iommu(iommu, drhd) { |
| 289 | + sts = dmar_readl(iommu->reg + DMAR_GSTS_REG); | |
| 290 | + if (!(sts & DMA_GSTS_TES)) { | |
| 291 | + seq_printf(m, "DMA Remapping is not enabled on %s\n", | |
| 292 | + iommu->name); | |
| 293 | + continue; | |
| 294 | + } | |
| 278 | 295 | root_tbl_walk(m, iommu); |
| 279 | 296 | seq_putc(m, '\n'); |
| 280 | 297 | } |
| @@ -415,6 +432,7 @@ static int ir_translation_struct_show(struct seq_file *m, void *unused) · 134 unmodified lines | ||
| 415 | 432 | struct dmar_drhd_unit *drhd; |
| 416 | 433 | struct intel_iommu *iommu; |
| 417 | 434 | u64 irta; |
| 435 | + u32 sts; | |
| 418 | 436 | |
| 419 | 437 | rcu_read_lock(); |
| 420 | 438 | for_each_active_iommu(iommu, drhd) { |
| @@ -424,7 +442,8 @@ static int ir_translation_struct_show(struct seq_file *m, void *unused) · 3 unmodified lines | ||
| 424 | 442 | seq_printf(m, "Remapped Interrupt supported on IOMMU: %s\n", |
| 425 | 443 | iommu->name); |
| 426 | 444 | |
| 427 | − if (iommu->ir_table) { | |
| 445 | + sts = dmar_readl(iommu->reg + DMAR_GSTS_REG); | |
| 446 | + if (iommu->ir_table && (sts & DMA_GSTS_IRES)) { | |
| 428 | 447 | irta = virt_to_phys(iommu->ir_table->base); |
| 429 | 448 | seq_printf(m, " IR table address:%llx\n", irta); |
| 430 | 449 | ir_tbl_remap_entry_show(m, iommu); |
| @@ -4261,10 +4261,11 @@ static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) · 4260 unmodified lines | ||
| 4261 | 4261 | |
| 4262 | 4262 | /* we know that the this iommu should be at offset 0xa000 from vtbar */ |
| 4263 | 4263 | drhd = dmar_find_matched_drhd_unit(pdev); |
| 4264 | − if (WARN_TAINT_ONCE(!drhd || drhd->reg_base_addr - vtbar != 0xa000, | |
| 4265 | − TAINT_FIRMWARE_WORKAROUND, | |
| 4266 | − "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n")) | |
| 4264 | + if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) { | |
| 4265 | + pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"); | |
| 4266 | + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | |
| 4267 | 4267 | pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; |
| 4268 | + } | |
| 4268 | 4269 | } |
| 4269 | 4270 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu); |
| 4270 | 4271 | |
| @@ -4460,14 +4461,16 @@ int __init dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg) · 189 unmodified lines | ||
| 4460 | 4461 | struct dmar_rmrr_unit *rmrru; |
| 4461 | 4462 | |
| 4462 | 4463 | rmrr = (struct acpi_dmar_reserved_memory *)header; |
| 4463 | − if (rmrr_sanity_check(rmrr)) | |
| 4464 | − WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, | |
| 4464 | + if (rmrr_sanity_check(rmrr)) { | |
| 4465 | + pr_warn(FW_BUG | |
| 4465 | 4466 | "Your BIOS is broken; bad RMRR [%#018Lx-%#018Lx]\n" |
| 4466 | 4467 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 4467 | 4468 | rmrr->base_address, rmrr->end_address, |
| 4468 | 4469 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 4469 | 4470 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 4470 | 4471 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 4472 | + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | |
| 4473 | + } | |
| 4471 | 4474 | |
| 4472 | 4475 | rmrru = kzalloc(sizeof(*rmrru), GFP_KERNEL); |
| 4473 | 4476 | if (!rmrru) |
| @@ -5130,6 +5133,9 @@ int __init intel_iommu_init(void) · 656 unmodified lines | ||
| 5130 | 5133 | |
| 5131 | 5134 | down_write(&dmar_global_lock); |
| 5132 | 5135 | |
| 5136 | + if (!no_iommu) | |
| 5137 | + intel_iommu_debugfs_init(); | |
| 5138 | + | |
| 5133 | 5139 | if (no_iommu || dmar_disabled) { |
| 5134 | 5140 | /* |
| 5135 | 5141 | * We exit the function here to ensure IOMMU's remapping and |
| @@ -5193,6 +5199,7 @@ int __init intel_iommu_init(void) · 57 unmodified lines | ||
| 5193 | 5199 | |
| 5194 | 5200 | init_iommu_pm_ops(); |
| 5195 | 5201 | |
| 5202 | + down_read(&dmar_global_lock); | |
| 5196 | 5203 | for_each_active_iommu(iommu, drhd) { |
| 5197 | 5204 | iommu_device_sysfs_add(&iommu->iommu, NULL, |
| 5198 | 5205 | intel_iommu_groups, |
| @@ -5200,6 +5207,7 @@ int __init intel_iommu_init(void) · 1 unmodified line | ||
| 5200 | 5207 | iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops); |
| 5201 | 5208 | iommu_device_register(&iommu->iommu); |
| 5202 | 5209 | } |
| 5210 | + up_read(&dmar_global_lock); | |
| 5203 | 5211 | |
| 5204 | 5212 | bus_set_iommu(&pci_bus_type, &intel_iommu_ops); |
| 5205 | 5213 | if (si_domain && !hw_pass_through) |
| @@ -5210,7 +5218,6 @@ int __init intel_iommu_init(void) · 4 unmodified lines | ||
| 5210 | 5218 | down_read(&dmar_global_lock); |
| 5211 | 5219 | if (probe_acpi_namespace_devices()) |
| 5212 | 5220 | pr_warn("ACPI name space devices didn't probe correctly\n"); |
| 5213 | − up_read(&dmar_global_lock); | |
| 5214 | 5221 | |
| 5215 | 5222 | /* Finally, we enable the DMA remapping hardware. */ |
| 5216 | 5223 | for_each_iommu(iommu, drhd) { |
| @@ -5219,10 +5226,11 @@ int __init intel_iommu_init(void) · 2 unmodified lines | ||
| 5219 | 5226 | |
| 5220 | 5227 | iommu_disable_protect_mem_regions(iommu); |
| 5221 | 5228 | } |
| 5229 | + up_read(&dmar_global_lock); | |
| 5230 | + | |
| 5222 | 5231 | pr_info("Intel(R) Virtualization Technology for Directed I/O\n"); |
| 5223 | 5232 | |
| 5224 | 5233 | intel_iommu_enabled = 1; |
| 5225 | − intel_iommu_debugfs_init(); | |
| 5226 | 5234 | |
| 5227 | 5235 | return 0; |
| 5228 | 5236 | |
| @@ -5700,8 +5708,10 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, · 471 unmodified lines | ||
| 5700 | 5708 | u64 phys = 0; |
| 5701 | 5709 | |
| 5702 | 5710 | pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); |
| 5703 | − if (pte) | |
| 5704 | − phys = dma_pte_addr(pte); | |
| 5711 | + if (pte && dma_pte_present(pte)) | |
| 5712 | + phys = dma_pte_addr(pte) + | |
| 5713 | + (iova & (BIT_MASK(level_to_offset_bits(level) + | |
| 5714 | + VTD_PAGE_SHIFT) - 1)); | |
| 5705 | 5715 | |
| 5706 | 5716 | return phys; |
| 5707 | 5717 | } |
| @@ -468,7 +468,7 @@ static int arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova, · 467 unmodified lines | ||
| 468 | 468 | arm_lpae_iopte *ptep = data->pgd; |
| 469 | 469 | int ret, lvl = data->start_level; |
| 470 | 470 | arm_lpae_iopte prot; |
| 471 | − long iaext = (long)iova >> cfg->ias; | |
| 471 | + long iaext = (s64)iova >> cfg->ias; | |
| 472 | 472 | |
| 473 | 473 | /* If no access, then nothing to do */ |
| 474 | 474 | if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE))) |
| @@ -645,7 +645,7 @@ static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova, · 170 unmodified lines | ||
| 645 | 645 | struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); |
| 646 | 646 | struct io_pgtable_cfg *cfg = &data->iop.cfg; |
| 647 | 647 | arm_lpae_iopte *ptep = data->pgd; |
| 648 | − long iaext = (long)iova >> cfg->ias; | |
| 648 | + long iaext = (s64)iova >> cfg->ias; | |
| 649 | 649 | |
| 650 | 650 | if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size)) |
| 651 | 651 | return 0; |
| @@ -34,6 +34,7 @@ · 33 unmodified lines | ||
| 34 | 34 | #define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) |
| 35 | 35 | |
| 36 | 36 | #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0) |
| 37 | +#define FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539 (1ULL << 1) | |
| 37 | 38 | |
| 38 | 39 | struct redist_region { |
| 39 | 40 | void __iomem *redist_base; |
| @@ -1464,6 +1465,15 @@ static bool gic_enable_quirk_msm8996(void *data) · 1424 unmodified lines | ||
| 1464 | 1465 | return true; |
| 1465 | 1466 | } |
| 1466 | 1467 | |
| 1468 | +static bool gic_enable_quirk_cavium_38539(void *data) | |
| 1469 | +{ | |
| 1470 | + struct gic_chip_data *d = data; | |
| 1471 | + | |
| 1472 | + d->flags |= FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539; | |
| 1473 | + | |
| 1474 | + return true; | |
| 1475 | +} | |
| 1476 | + | |
| 1467 | 1477 | static bool gic_enable_quirk_hip06_07(void *data) |
| 1468 | 1478 | { |
| 1469 | 1479 | struct gic_chip_data *d = data; |
| @@ -1502,6 +1512,19 @@ static const struct gic_quirk gic_quirks[] = { · 32 unmodified lines | ||
| 1502 | 1512 | .mask = 0xffffffff, |
| 1503 | 1513 | .init = gic_enable_quirk_hip06_07, |
| 1504 | 1514 | }, |
| 1515 | + { | |
| 1516 | + /* | |
| 1517 | + * Reserved register accesses generate a Synchronous | |
| 1518 | + * External Abort. This erratum applies to: | |
| 1519 | + * - ThunderX: CN88xx | |
| 1520 | + * - OCTEON TX: CN83xx, CN81xx | |
| 1521 | + * - OCTEON TX2: CN93xx, CN96xx, CN98xx, CNF95xx* | |
| 1522 | + */ | |
| 1523 | + .desc = "GICv3: Cavium erratum 38539", | |
| 1524 | + .iidr = 0xa000034c, | |
| 1525 | + .mask = 0xe8f00fff, | |
| 1526 | + .init = gic_enable_quirk_cavium_38539, | |
| 1527 | + }, | |
| 1505 | 1528 | { |
| 1506 | 1529 | } |
| 1507 | 1530 | }; |
| @@ -1577,7 +1600,12 @@ static int __init gic_init_bases(void __iomem *dist_base, · 69 unmodified lines | ||
| 1577 | 1600 | pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32); |
| 1578 | 1601 | pr_info("%d Extended SPIs implemented\n", GIC_ESPI_NR); |
| 1579 | 1602 | |
| 1580 | − gic_data.rdists.gicd_typer2 = readl_relaxed(gic_data.dist_base + GICD_TYPER2); | |
| 1603 | + /* | |
| 1604 | + * ThunderX1 explodes on reading GICD_TYPER2, in violation of the | |
| 1605 | + * architecture spec (which says that reserved registers are RES0). | |
| 1606 | + */ | |
| 1607 | + if (!(gic_data.flags & FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539)) | |
| 1608 | + gic_data.rdists.gicd_typer2 = readl_relaxed(gic_data.dist_base + GICD_TYPER2); | |
| 1581 | 1609 | |
| 1582 | 1610 | gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops, |
| 1583 | 1611 | &gic_data); |
| @@ -312,9 +312,16 @@ static const struct i2c_device_id wf_ad7417_id[] = { · 311 unmodified lines | ||
| 312 | 312 | }; |
| 313 | 313 | MODULE_DEVICE_TABLE(i2c, wf_ad7417_id); |
| 314 | 314 | |
| 315 | +static const struct of_device_id wf_ad7417_of_id[] = { | |
| 316 | + { .compatible = "ad7417", }, | |
| 317 | + { } | |
| 318 | +}; | |
| 319 | +MODULE_DEVICE_TABLE(of, wf_ad7417_of_id); | |
| 320 | + | |
| 315 | 321 | static struct i2c_driver wf_ad7417_driver = { |
| 316 | 322 | .driver = { |
| 317 | 323 | .name = "wf_ad7417", |
| 324 | + .of_match_table = wf_ad7417_of_id, | |
| 318 | 325 | }, |
| 319 | 326 | .probe = wf_ad7417_probe, |
| 320 | 327 | .remove = wf_ad7417_remove, |
| @@ -580,9 +580,16 @@ static const struct i2c_device_id wf_fcu_id[] = { · 579 unmodified lines | ||
| 580 | 580 | }; |
| 581 | 581 | MODULE_DEVICE_TABLE(i2c, wf_fcu_id); |
| 582 | 582 | |
| 583 | +static const struct of_device_id wf_fcu_of_id[] = { | |
| 584 | + { .compatible = "fcu", }, | |
| 585 | + { } | |
| 586 | +}; | |
| 587 | +MODULE_DEVICE_TABLE(of, wf_fcu_of_id); | |
| 588 | + | |
| 583 | 589 | static struct i2c_driver wf_fcu_driver = { |
| 584 | 590 | .driver = { |
| 585 | 591 | .name = "wf_fcu", |
| 592 | + .of_match_table = wf_fcu_of_id, | |
| 586 | 593 | }, |
| 587 | 594 | .probe = wf_fcu_probe, |
| 588 | 595 | .remove = wf_fcu_remove, |
| @@ -14,6 +14,7 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/init.h> |
| 15 | 15 | #include <linux/wait.h> |
| 16 | 16 | #include <linux/i2c.h> |
| 17 | +#include <linux/of_device.h> | |
| 17 | 18 | #include <asm/prom.h> |
| 18 | 19 | #include <asm/machdep.h> |
| 19 | 20 | #include <asm/io.h> |
| @@ -91,9 +92,14 @@ static int wf_lm75_probe(struct i2c_client *client, · 71 unmodified lines | ||
| 91 | 92 | const struct i2c_device_id *id) |
| 92 | 93 | { |
| 93 | 94 | struct wf_lm75_sensor *lm; |
| 94 | − int rc, ds1775 = id->driver_data; | |
| 95 | + int rc, ds1775; | |
| 95 | 96 | const char *name, *loc; |
| 96 | 97 | |
| 98 | + if (id) | |
| 99 | + ds1775 = id->driver_data; | |
| 100 | + else | |
| 101 | + ds1775 = !!of_device_get_match_data(&client->dev); | |
| 102 | + | |
| 97 | 103 | DBG("wf_lm75: creating %s device at address 0x%02x\n", |
| 98 | 104 | ds1775 ? "ds1775" : "lm75", client->addr); |
| 99 | 105 | |
| @@ -164,9 +170,17 @@ static const struct i2c_device_id wf_lm75_id[] = { · 64 unmodified lines | ||
| 164 | 170 | }; |
| 165 | 171 | MODULE_DEVICE_TABLE(i2c, wf_lm75_id); |
| 166 | 172 | |
| 173 | +static const struct of_device_id wf_lm75_of_id[] = { | |
| 174 | + { .compatible = "lm75", .data = (void *)0}, | |
| 175 | + { .compatible = "ds1775", .data = (void *)1 }, | |
| 176 | + { } | |
| 177 | +}; | |
| 178 | +MODULE_DEVICE_TABLE(of, wf_lm75_of_id); | |
| 179 | + | |
| 167 | 180 | static struct i2c_driver wf_lm75_driver = { |
| 168 | 181 | .driver = { |
| 169 | 182 | .name = "wf_lm75", |
| 183 | + .of_match_table = wf_lm75_of_id, | |
| 170 | 184 | }, |
| 171 | 185 | .probe = wf_lm75_probe, |
| 172 | 186 | .remove = wf_lm75_remove, |
| @@ -166,9 +166,16 @@ static const struct i2c_device_id wf_lm87_id[] = { · 165 unmodified lines | ||
| 166 | 166 | }; |
| 167 | 167 | MODULE_DEVICE_TABLE(i2c, wf_lm87_id); |
| 168 | 168 | |
| 169 | +static const struct of_device_id wf_lm87_of_id[] = { | |
| 170 | + { .compatible = "lm87cimt", }, | |
| 171 | + { } | |
| 172 | +}; | |
| 173 | +MODULE_DEVICE_TABLE(of, wf_lm87_of_id); | |
| 174 | + | |
| 169 | 175 | static struct i2c_driver wf_lm87_driver = { |
| 170 | 176 | .driver = { |
| 171 | 177 | .name = "wf_lm87", |
| 178 | + .of_match_table = wf_lm87_of_id, | |
| 172 | 179 | }, |
| 173 | 180 | .probe = wf_lm87_probe, |
| 174 | 181 | .remove = wf_lm87_remove, |
| @@ -120,9 +120,16 @@ static const struct i2c_device_id wf_max6690_id[] = { · 119 unmodified lines | ||
| 120 | 120 | }; |
| 121 | 121 | MODULE_DEVICE_TABLE(i2c, wf_max6690_id); |
| 122 | 122 | |
| 123 | +static const struct of_device_id wf_max6690_of_id[] = { | |
| 124 | + { .compatible = "max6690", }, | |
| 125 | + { } | |
| 126 | +}; | |
| 127 | +MODULE_DEVICE_TABLE(of, wf_max6690_of_id); | |
| 128 | + | |
| 123 | 129 | static struct i2c_driver wf_max6690_driver = { |
| 124 | 130 | .driver = { |
| 125 | 131 | .name = "wf_max6690", |
| 132 | + .of_match_table = wf_max6690_of_id, | |
| 126 | 133 | }, |
| 127 | 134 | .probe = wf_max6690_probe, |
| 128 | 135 | .remove = wf_max6690_remove, |
| @@ -341,9 +341,16 @@ static const struct i2c_device_id wf_sat_id[] = { · 340 unmodified lines | ||
| 341 | 341 | }; |
| 342 | 342 | MODULE_DEVICE_TABLE(i2c, wf_sat_id); |
| 343 | 343 | |
| 344 | +static const struct of_device_id wf_sat_of_id[] = { | |
| 345 | + { .compatible = "smu-sat", }, | |
| 346 | + { } | |
| 347 | +}; | |
| 348 | +MODULE_DEVICE_TABLE(of, wf_sat_of_id); | |
| 349 | + | |
| 344 | 350 | static struct i2c_driver wf_sat_driver = { |
| 345 | 351 | .driver = { |
| 346 | 352 | .name = "wf_smu_sat", |
| 353 | + .of_match_table = wf_sat_of_id, | |
| 347 | 354 | }, |
| 348 | 355 | .probe = wf_sat_probe, |
| 349 | 356 | .remove = wf_sat_remove, |
| @@ -394,7 +394,7 @@ static const struct pcr_ops rts522a_pcr_ops = { · 393 unmodified lines | ||
| 394 | 394 | void rts522a_init_params(struct rtsx_pcr *pcr) |
| 395 | 395 | { |
| 396 | 396 | rts5227_init_params(pcr); |
| 397 | − | |
| 397 | + pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11); | |
| 398 | 398 | pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3; |
| 399 | 399 | |
| 400 | 400 | pcr->option.ocp_en = 1; |
| @@ -618,6 +618,7 @@ static const struct pcr_ops rts524a_pcr_ops = { · 617 unmodified lines | ||
| 618 | 618 | void rts524a_init_params(struct rtsx_pcr *pcr) |
| 619 | 619 | { |
| 620 | 620 | rts5249_init_params(pcr); |
| 621 | + pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11); | |
| 621 | 622 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; |
| 622 | 623 | pcr->option.ltr_l1off_snooze_sspwrgate = |
| 623 | 624 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; |
| @@ -733,6 +734,7 @@ static const struct pcr_ops rts525a_pcr_ops = { · 109 unmodified lines | ||
| 733 | 734 | void rts525a_init_params(struct rtsx_pcr *pcr) |
| 734 | 735 | { |
| 735 | 736 | rts5249_init_params(pcr); |
| 737 | + pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11); | |
| 736 | 738 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; |
| 737 | 739 | pcr->option.ltr_l1off_snooze_sspwrgate = |
| 738 | 740 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; |
| @@ -662,7 +662,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr) · 661 unmodified lines | ||
| 662 | 662 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; |
| 663 | 663 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
| 664 | 664 | pcr->aspm_en = ASPM_L1_EN; |
| 665 | − pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16); | |
| 665 | + pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11); | |
| 666 | 666 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); |
| 667 | 667 | |
| 668 | 668 | pcr->ic_version = rts5260_get_ic_version(pcr); |
| @@ -764,7 +764,7 @@ void rts5261_init_params(struct rtsx_pcr *pcr) · 763 unmodified lines | ||
| 764 | 764 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; |
| 765 | 765 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
| 766 | 766 | pcr->aspm_en = ASPM_L1_EN; |
| 767 | − pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 27, 16); | |
| 767 | + pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 11); | |
| 768 | 768 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); |
| 769 | 769 | |
| 770 | 770 | pcr->ic_version = rts5261_get_ic_version(pcr); |
| @@ -712,13 +712,14 @@ static int at24_probe(struct i2c_client *client) · 711 unmodified lines | ||
| 712 | 712 | * chip is functional. |
| 713 | 713 | */ |
| 714 | 714 | err = at24_read(at24, 0, &test_byte, 1); |
| 715 | − pm_runtime_idle(dev); | |
| 716 | 715 | if (err) { |
| 717 | 716 | pm_runtime_disable(dev); |
| 718 | 717 | regulator_disable(at24->vcc_reg); |
| 719 | 718 | return -ENODEV; |
| 720 | 719 | } |
| 721 | 720 | |
| 721 | + pm_runtime_idle(dev); | |
| 722 | + | |
| 722 | 723 | if (writable) |
| 723 | 724 | dev_info(dev, "%u byte %s EEPROM, writable, %u bytes/write\n", |
| 724 | 725 | byte_len, client->name, at24->write_max); |
| @@ -1732,8 +1732,11 @@ static int mmc_do_erase(struct mmc_card *card, unsigned int from, · 1731 unmodified lines | ||
| 1732 | 1732 | * the erase operation does not exceed the max_busy_timeout, we should |
| 1733 | 1733 | * use R1B response. Or we need to prevent the host from doing hw busy |
| 1734 | 1734 | * detection, which is done by converting to a R1 response instead. |
| 1735 | + * Note, some hosts requires R1B, which also means they are on their own | |
| 1736 | + * when it comes to deal with the busy timeout. | |
| 1735 | 1737 | */ |
| 1736 | − if (card->host->max_busy_timeout && | |
| 1738 | + if (!(card->host->caps & MMC_CAP_NEED_RSP_BUSY) && | |
| 1739 | + card->host->max_busy_timeout && | |
| 1737 | 1740 | busy_timeout > card->host->max_busy_timeout) { |
| 1738 | 1741 | cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; |
| 1739 | 1742 | } else { |
| @@ -1910,9 +1910,12 @@ static int mmc_sleep(struct mmc_host *host) · 1909 unmodified lines | ||
| 1910 | 1910 | * If the max_busy_timeout of the host is specified, validate it against |
| 1911 | 1911 | * the sleep cmd timeout. A failure means we need to prevent the host |
| 1912 | 1912 | * from doing hw busy detection, which is done by converting to a R1 |
| 1913 | − * response instead of a R1B. | |
| 1913 | + * response instead of a R1B. Note, some hosts requires R1B, which also | |
| 1914 | + * means they are on their own when it comes to deal with the busy | |
| 1915 | + * timeout. | |
| 1914 | 1916 | */ |
| 1915 | − if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) { | |
| 1917 | + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && host->max_busy_timeout && | |
| 1918 | + (timeout_ms > host->max_busy_timeout)) { | |
| 1916 | 1919 | cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; |
| 1917 | 1920 | } else { |
| 1918 | 1921 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; |
| @@ -542,9 +542,11 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, · 541 unmodified lines | ||
| 542 | 542 | * If the max_busy_timeout of the host is specified, make sure it's |
| 543 | 543 | * enough to fit the used timeout_ms. In case it's not, let's instruct |
| 544 | 544 | * the host to avoid HW busy detection, by converting to a R1 response |
| 545 | − * instead of a R1B. | |
| 545 | + * instead of a R1B. Note, some hosts requires R1B, which also means | |
| 546 | + * they are on their own when it comes to deal with the busy timeout. | |
| 546 | 547 | */ |
| 547 | − if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) | |
| 548 | + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && host->max_busy_timeout && | |
| 549 | + (timeout_ms > host->max_busy_timeout)) | |
| 548 | 550 | use_r1b_resp = false; |
| 549 | 551 | |
| 550 | 552 | cmd.opcode = MMC_SWITCH; |
| @@ -606,19 +606,22 @@ static int sd_change_phase(struct realtek_pci_sdmmc *host, · 605 unmodified lines | ||
| 606 | 606 | u8 sample_point, bool rx) |
| 607 | 607 | { |
| 608 | 608 | struct rtsx_pcr *pcr = host->pcr; |
| 609 | − | |
| 609 | + u16 SD_VP_CTL = 0; | |
| 610 | 610 | dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n", |
| 611 | 611 | __func__, rx ? "RX" : "TX", sample_point); |
| 612 | 612 | |
| 613 | 613 | rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, CHANGE_CLK); |
| 614 | − if (rx) | |
| 614 | + if (rx) { | |
| 615 | + SD_VP_CTL = SD_VPRX_CTL; | |
| 615 | 616 | rtsx_pci_write_register(pcr, SD_VPRX_CTL, |
| 616 | 617 | PHASE_SELECT_MASK, sample_point); |
| 617 | − else | |
| 618 | + } else { | |
| 619 | + SD_VP_CTL = SD_VPTX_CTL; | |
| 618 | 620 | rtsx_pci_write_register(pcr, SD_VPTX_CTL, |
| 619 | 621 | PHASE_SELECT_MASK, sample_point); |
| 620 | − rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0); | |
| 621 | − rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, | |
| 622 | + } | |
| 623 | + rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET, 0); | |
| 624 | + rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET, | |
| 622 | 625 | PHASE_NOT_RESET); |
| 623 | 626 | rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, 0); |
| 624 | 627 | rtsx_pci_write_register(pcr, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0); |
| @@ -23,6 +23,7 @@ · 22 unmodified lines | ||
| 23 | 23 | #include <linux/pm.h> |
| 24 | 24 | #include <linux/pm_runtime.h> |
| 25 | 25 | #include <linux/delay.h> |
| 26 | +#include <linux/dmi.h> | |
| 26 | 27 | |
| 27 | 28 | #include <linux/mmc/host.h> |
| 28 | 29 | #include <linux/mmc/pm.h> |
| @@ -72,9 +73,16 @@ struct sdhci_acpi_host { · 43 unmodified lines | ||
| 72 | 73 | const struct sdhci_acpi_slot *slot; |
| 73 | 74 | struct platform_device *pdev; |
| 74 | 75 | bool use_runtime_pm; |
| 76 | + bool is_intel; | |
| 77 | + bool reset_signal_volt_on_suspend; | |
| 75 | 78 | unsigned long private[0] ____cacheline_aligned; |
| 76 | 79 | }; |
| 77 | 80 | |
| 81 | +enum { | |
| 82 | + DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP = BIT(0), | |
| 83 | + DMI_QUIRK_SD_NO_WRITE_PROTECT = BIT(1), | |
| 84 | +}; | |
| 85 | + | |
| 78 | 86 | static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c) |
| 79 | 87 | { |
| 80 | 88 | return (void *)c->private; |
| @@ -391,6 +399,8 @@ static int intel_probe_slot(struct platform_device *pdev, struct acpi_device *ad · 310 unmodified lines | ||
| 391 | 399 | host->mmc_host_ops.start_signal_voltage_switch = |
| 392 | 400 | intel_start_signal_voltage_switch; |
| 393 | 401 | |
| 402 | + c->is_intel = true; | |
| 403 | + | |
| 394 | 404 | return 0; |
| 395 | 405 | } |
| 396 | 406 | |
| @@ -647,6 +657,36 @@ static const struct acpi_device_id sdhci_acpi_ids[] = { · 250 unmodified lines | ||
| 647 | 657 | }; |
| 648 | 658 | MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids); |
| 649 | 659 | |
| 660 | +static const struct dmi_system_id sdhci_acpi_quirks[] = { | |
| 661 | + { | |
| 662 | + /* | |
| 663 | + * The Lenovo Miix 320-10ICR has a bug in the _PS0 method of | |
| 664 | + * the SHC1 ACPI device, this bug causes it to reprogram the | |
| 665 | + * wrong LDO (DLDO3) to 1.8V if 1.8V modes are used and the | |
| 666 | + * card is (runtime) suspended + resumed. DLDO3 is used for | |
| 667 | + * the LCD and setting it to 1.8V causes the LCD to go black. | |
| 668 | + */ | |
| 669 | + .matches = { | |
| 670 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | |
| 671 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"), | |
| 672 | + }, | |
| 673 | + .driver_data = (void *)DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP, | |
| 674 | + }, | |
| 675 | + { | |
| 676 | + /* | |
| 677 | + * The Acer Aspire Switch 10 (SW5-012) microSD slot always | |
| 678 | + * reports the card being write-protected even though microSD | |
| 679 | + * cards do not have a write-protect switch at all. | |
| 680 | + */ | |
| 681 | + .matches = { | |
| 682 | + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | |
| 683 | + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"), | |
| 684 | + }, | |
| 685 | + .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT, | |
| 686 | + }, | |
| 687 | + {} /* Terminating entry */ | |
| 688 | +}; | |
| 689 | + | |
| 650 | 690 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(struct acpi_device *adev) |
| 651 | 691 | { |
| 652 | 692 | const struct sdhci_acpi_uid_slot *u; |
| @@ -663,17 +703,23 @@ static int sdhci_acpi_probe(struct platform_device *pdev) · 10 unmodified lines | ||
| 663 | 703 | struct device *dev = &pdev->dev; |
| 664 | 704 | const struct sdhci_acpi_slot *slot; |
| 665 | 705 | struct acpi_device *device, *child; |
| 706 | + const struct dmi_system_id *id; | |
| 666 | 707 | struct sdhci_acpi_host *c; |
| 667 | 708 | struct sdhci_host *host; |
| 668 | 709 | struct resource *iomem; |
| 669 | 710 | resource_size_t len; |
| 670 | 711 | size_t priv_size; |
| 712 | + int quirks = 0; | |
| 671 | 713 | int err; |
| 672 | 714 | |
| 673 | 715 | device = ACPI_COMPANION(dev); |
| 674 | 716 | if (!device) |
| 675 | 717 | return -ENODEV; |
| 676 | 718 | |
| 719 | + id = dmi_first_match(sdhci_acpi_quirks); | |
| 720 | + if (id) | |
| 721 | + quirks = (long)id->driver_data; | |
| 722 | + | |
| 677 | 723 | slot = sdhci_acpi_get_slot(device); |
| 678 | 724 | |
| 679 | 725 | /* Power on the SDHCI controller and its children */ |
| @@ -759,6 +805,12 @@ static int sdhci_acpi_probe(struct platform_device *pdev) · 79 unmodified lines | ||
| 759 | 805 | dev_warn(dev, "failed to setup card detect gpio\n"); |
| 760 | 806 | c->use_runtime_pm = false; |
| 761 | 807 | } |
| 808 | + | |
| 809 | + if (quirks & DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP) | |
| 810 | + c->reset_signal_volt_on_suspend = true; | |
| 811 | + | |
| 812 | + if (quirks & DMI_QUIRK_SD_NO_WRITE_PROTECT) | |
| 813 | + host->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT; | |
| 762 | 814 | } |
| 763 | 815 | |
| 764 | 816 | err = sdhci_setup_host(host); |
| @@ -823,17 +875,39 @@ static int sdhci_acpi_remove(struct platform_device *pdev) · 58 unmodified lines | ||
| 823 | 875 | return 0; |
| 824 | 876 | } |
| 825 | 877 | |
| 878 | +static void __maybe_unused sdhci_acpi_reset_signal_voltage_if_needed( | |
| 879 | + struct device *dev) | |
| 880 | +{ | |
| 881 | + struct sdhci_acpi_host *c = dev_get_drvdata(dev); | |
| 882 | + struct sdhci_host *host = c->host; | |
| 883 | + | |
| 884 | + if (c->is_intel && c->reset_signal_volt_on_suspend && | |
| 885 | + host->mmc->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_330) { | |
| 886 | + struct intel_host *intel_host = sdhci_acpi_priv(c); | |
| 887 | + unsigned int fn = INTEL_DSM_V33_SWITCH; | |
| 888 | + u32 result = 0; | |
| 889 | + | |
| 890 | + intel_dsm(intel_host, dev, fn, &result); | |
| 891 | + } | |
| 892 | +} | |
| 893 | + | |
| 826 | 894 | #ifdef CONFIG_PM_SLEEP |
| 827 | 895 | |
| 828 | 896 | static int sdhci_acpi_suspend(struct device *dev) |
| 829 | 897 | { |
| 830 | 898 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); |
| 831 | 899 | struct sdhci_host *host = c->host; |
| 900 | + int ret; | |
| 832 | 901 | |
| 833 | 902 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) |
| 834 | 903 | mmc_retune_needed(host->mmc); |
| 835 | 904 | |
| 836 | − return sdhci_suspend_host(host); | |
| 905 | + ret = sdhci_suspend_host(host); | |
| 906 | + if (ret) | |
| 907 | + return ret; | |
| 908 | + | |
| 909 | + sdhci_acpi_reset_signal_voltage_if_needed(dev); | |
| 910 | + return 0; | |
| 837 | 911 | } |
| 838 | 912 | |
| 839 | 913 | static int sdhci_acpi_resume(struct device *dev) |
| @@ -853,11 +927,17 @@ static int sdhci_acpi_runtime_suspend(struct device *dev) · 13 unmodified lines | ||
| 853 | 927 | { |
| 854 | 928 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); |
| 855 | 929 | struct sdhci_host *host = c->host; |
| 930 | + int ret; | |
| 856 | 931 | |
| 857 | 932 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) |
| 858 | 933 | mmc_retune_needed(host->mmc); |
| 859 | 934 | |
| 860 | − return sdhci_runtime_suspend_host(host); | |
| 935 | + ret = sdhci_runtime_suspend_host(host); | |
| 936 | + if (ret) | |
| 937 | + return ret; | |
| 938 | + | |
| 939 | + sdhci_acpi_reset_signal_voltage_if_needed(dev); | |
| 940 | + return 0; | |
| 861 | 941 | } |
| 862 | 942 | |
| 863 | 943 | static int sdhci_acpi_runtime_resume(struct device *dev) |
| @@ -11,6 +11,7 @@ · 10 unmodified lines | ||
| 11 | 11 | #include <linux/mmc/host.h> |
| 12 | 12 | #include <linux/mmc/mmc.h> |
| 13 | 13 | #include <linux/of.h> |
| 14 | +#include <linux/of_device.h> | |
| 14 | 15 | |
| 15 | 16 | #include "sdhci-pltfm.h" |
| 16 | 17 | |
| @@ -235,6 +236,11 @@ static const struct sdhci_ops sdhci_cdns_ops = { · 218 unmodified lines | ||
| 235 | 236 | .set_uhs_signaling = sdhci_cdns_set_uhs_signaling, |
| 236 | 237 | }; |
| 237 | 238 | |
| 239 | +static const struct sdhci_pltfm_data sdhci_cdns_uniphier_pltfm_data = { | |
| 240 | + .ops = &sdhci_cdns_ops, | |
| 241 | + .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, | |
| 242 | +}; | |
| 243 | + | |
| 238 | 244 | static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = { |
| 239 | 245 | .ops = &sdhci_cdns_ops, |
| 240 | 246 | }; |
| @@ -334,6 +340,7 @@ static void sdhci_cdns_hs400_enhanced_strobe(struct mmc_host *mmc, · 93 unmodified lines | ||
| 334 | 340 | static int sdhci_cdns_probe(struct platform_device *pdev) |
| 335 | 341 | { |
| 336 | 342 | struct sdhci_host *host; |
| 343 | + const struct sdhci_pltfm_data *data; | |
| 337 | 344 | struct sdhci_pltfm_host *pltfm_host; |
| 338 | 345 | struct sdhci_cdns_priv *priv; |
| 339 | 346 | struct clk *clk; |
| @@ -350,8 +357,12 @@ static int sdhci_cdns_probe(struct platform_device *pdev) · 10 unmodified lines | ||
| 350 | 357 | if (ret) |
| 351 | 358 | return ret; |
| 352 | 359 | |
| 360 | + data = of_device_get_match_data(dev); | |
| 361 | + if (!data) | |
| 362 | + data = &sdhci_cdns_pltfm_data; | |
| 363 | + | |
| 353 | 364 | nr_phy_params = sdhci_cdns_phy_param_count(dev->of_node); |
| 354 | − host = sdhci_pltfm_init(pdev, &sdhci_cdns_pltfm_data, | |
| 365 | + host = sdhci_pltfm_init(pdev, data, | |
| 355 | 366 | struct_size(priv, phy_params, nr_phy_params)); |
| 356 | 367 | if (IS_ERR(host)) { |
| 357 | 368 | ret = PTR_ERR(host); |
| @@ -431,7 +442,10 @@ static const struct dev_pm_ops sdhci_cdns_pm_ops = { · 73 unmodified lines | ||
| 431 | 442 | }; |
| 432 | 443 | |
| 433 | 444 | static const struct of_device_id sdhci_cdns_match[] = { |
| 434 | − { .compatible = "socionext,uniphier-sd4hc" }, | |
| 445 | + { | |
| 446 | + .compatible = "socionext,uniphier-sd4hc", | |
| 447 | + .data = &sdhci_cdns_uniphier_pltfm_data, | |
| 448 | + }, | |
| 435 | 449 | { .compatible = "cdns,sd4hc" }, |
| 436 | 450 | { /* sentinel */ } |
| 437 | 451 | }; |
| @@ -1590,7 +1590,7 @@ static u32 sdhci_msm_cqe_irq(struct sdhci_host *host, u32 intmask) · 1589 unmodified lines | ||
| 1590 | 1590 | return 0; |
| 1591 | 1591 | } |
| 1592 | 1592 | |
| 1593 | −void sdhci_msm_cqe_disable(struct mmc_host *mmc, bool recovery) | |
| 1593 | +static void sdhci_msm_cqe_disable(struct mmc_host *mmc, bool recovery) | |
| 1594 | 1594 | { |
| 1595 | 1595 | struct sdhci_host *host = mmc_priv(mmc); |
| 1596 | 1596 | unsigned long flags; |
| @@ -132,7 +132,8 @@ static void sdhci_at91_reset(struct sdhci_host *host, u8 mask) · 131 unmodified lines | ||
| 132 | 132 | |
| 133 | 133 | sdhci_reset(host, mask); |
| 134 | 134 | |
| 135 | − if (host->mmc->caps & MMC_CAP_NONREMOVABLE) | |
| 135 | + if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) | |
| 136 | + || mmc_gpio_get_cd(host->mmc) >= 0) | |
| 136 | 137 | sdhci_at91_set_force_card_detect(host); |
| 137 | 138 | |
| 138 | 139 | if (priv->cal_always_on && (mask & SDHCI_RESET_ALL)) |
| @@ -427,8 +428,11 @@ static int sdhci_at91_probe(struct platform_device *pdev) · 288 unmodified lines | ||
| 427 | 428 | * detection procedure using the SDMCC_CD signal is bypassed. |
| 428 | 429 | * This bit is reset when a software reset for all command is performed |
| 429 | 430 | * so we need to implement our own reset function to set back this bit. |
| 431 | + * | |
| 432 | + * WA: SAMA5D2 doesn't drive CMD if using CD GPIO line. | |
| 430 | 433 | */ |
| 431 | − if (host->mmc->caps & MMC_CAP_NONREMOVABLE) | |
| 434 | + if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) | |
| 435 | + || mmc_gpio_get_cd(host->mmc) >= 0) | |
| 432 | 436 | sdhci_at91_set_force_card_detect(host); |
| 433 | 437 | |
| 434 | 438 | pm_runtime_put_autosuspend(&pdev->dev); |
| @@ -1192,6 +1192,9 @@ static int sdhci_omap_probe(struct platform_device *pdev) · 1191 unmodified lines | ||
| 1192 | 1192 | if (of_find_property(dev->of_node, "dmas", NULL)) |
| 1193 | 1193 | sdhci_switch_external_dma(host, true); |
| 1194 | 1194 | |
| 1195 | + /* R1B responses is required to properly manage HW busy detection. */ | |
| 1196 | + mmc->caps |= MMC_CAP_NEED_RSP_BUSY; | |
| 1197 | + | |
| 1195 | 1198 | ret = sdhci_setup_host(host); |
| 1196 | 1199 | if (ret) |
| 1197 | 1200 | goto err_put_sync; |
| @@ -262,10 +262,26 @@ static int gl9750_execute_tuning(struct sdhci_host *host, u32 opcode) · 261 unmodified lines | ||
| 262 | 262 | return 0; |
| 263 | 263 | } |
| 264 | 264 | |
| 265 | +static void gli_pcie_enable_msi(struct sdhci_pci_slot *slot) | |
| 266 | +{ | |
| 267 | + int ret; | |
| 268 | + | |
| 269 | + ret = pci_alloc_irq_vectors(slot->chip->pdev, 1, 1, | |
| 270 | + PCI_IRQ_MSI | PCI_IRQ_MSIX); | |
| 271 | + if (ret < 0) { | |
| 272 | + pr_warn("%s: enable PCI MSI failed, error=%d\n", | |
| 273 | + mmc_hostname(slot->host->mmc), ret); | |
| 274 | + return; | |
| 275 | + } | |
| 276 | + | |
| 277 | + slot->host->irq = pci_irq_vector(slot->chip->pdev, 0); | |
| 278 | +} | |
| 279 | + | |
| 265 | 280 | static int gli_probe_slot_gl9750(struct sdhci_pci_slot *slot) |
| 266 | 281 | { |
| 267 | 282 | struct sdhci_host *host = slot->host; |
| 268 | 283 | |
| 284 | + gli_pcie_enable_msi(slot); | |
| 269 | 285 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; |
| 270 | 286 | sdhci_enable_v4_mode(host); |
| 271 | 287 | |
| @@ -276,6 +292,7 @@ static int gli_probe_slot_gl9755(struct sdhci_pci_slot *slot) · 4 unmodified lines | ||
| 276 | 292 | { |
| 277 | 293 | struct sdhci_host *host = slot->host; |
| 278 | 294 | |
| 295 | + gli_pcie_enable_msi(slot); | |
| 279 | 296 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; |
| 280 | 297 | sdhci_enable_v4_mode(host); |
| 281 | 298 | |
| @@ -1552,6 +1552,9 @@ static int sdhci_tegra_probe(struct platform_device *pdev) · 1551 unmodified lines | ||
| 1552 | 1552 | if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50) |
| 1553 | 1553 | host->mmc->caps |= MMC_CAP_1_8V_DDR; |
| 1554 | 1554 | |
| 1555 | + /* R1B responses is required to properly manage HW busy detection. */ | |
| 1556 | + host->mmc->caps |= MMC_CAP_NEED_RSP_BUSY; | |
| 1557 | + | |
| 1555 | 1558 | tegra_sdhci_parse_dt(host); |
| 1556 | 1559 | |
| 1557 | 1560 | tegra_host->power_gpio = devm_gpiod_get_optional(&pdev->dev, "power", |
| @@ -50,11 +50,6 @@ struct arp_pkt { · 49 unmodified lines | ||
| 50 | 50 | }; |
| 51 | 51 | #pragma pack() |
| 52 | 52 | |
| 53 | −static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb) | |
| 54 | −{ | |
| 55 | − return (struct arp_pkt *)skb_network_header(skb); | |
| 56 | −} | |
| 57 | − | |
| 58 | 53 | /* Forward declaration */ |
| 59 | 54 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], |
| 60 | 55 | bool strict_match); |
| @@ -553,10 +548,11 @@ static void rlb_req_update_subnet_clients(struct bonding *bond, __be32 src_ip) · 492 unmodified lines | ||
| 553 | 548 | spin_unlock(&bond->mode_lock); |
| 554 | 549 | } |
| 555 | 550 | |
| 556 | −static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bond) | |
| 551 | +static struct slave *rlb_choose_channel(struct sk_buff *skb, | |
| 552 | + struct bonding *bond, | |
| 553 | + const struct arp_pkt *arp) | |
| 557 | 554 | { |
| 558 | 555 | struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); |
| 559 | − struct arp_pkt *arp = arp_pkt(skb); | |
| 560 | 556 | struct slave *assigned_slave, *curr_active_slave; |
| 561 | 557 | struct rlb_client_info *client_info; |
| 562 | 558 | u32 hash_index = 0; |
| @@ -653,8 +649,12 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon · 90 unmodified lines | ||
| 653 | 649 | */ |
| 654 | 650 | static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) |
| 655 | 651 | { |
| 656 | − struct arp_pkt *arp = arp_pkt(skb); | |
| 657 | 652 | struct slave *tx_slave = NULL; |
| 653 | + struct arp_pkt *arp; | |
| 654 | + | |
| 655 | + if (!pskb_network_may_pull(skb, sizeof(*arp))) | |
| 656 | + return NULL; | |
| 657 | + arp = (struct arp_pkt *)skb_network_header(skb); | |
| 658 | 658 | |
| 659 | 659 | /* Don't modify or load balance ARPs that do not originate locally |
| 660 | 660 | * (e.g.,arrive via a bridge). |
| @@ -664,7 +664,7 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) · 3 unmodified lines | ||
| 664 | 664 | |
| 665 | 665 | if (arp->op_code == htons(ARPOP_REPLY)) { |
| 666 | 666 | /* the arp must be sent on the selected rx channel */ |
| 667 | − tx_slave = rlb_choose_channel(skb, bond); | |
| 667 | + tx_slave = rlb_choose_channel(skb, bond, arp); | |
| 668 | 668 | if (tx_slave) |
| 669 | 669 | bond_hw_addr_copy(arp->mac_src, tx_slave->dev->dev_addr, |
| 670 | 670 | tx_slave->dev->addr_len); |
| @@ -676,7 +676,7 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) · 5 unmodified lines | ||
| 676 | 676 | * When the arp reply is received the entry will be updated |
| 677 | 677 | * with the correct unicast address of the client. |
| 678 | 678 | */ |
| 679 | − tx_slave = rlb_choose_channel(skb, bond); | |
| 679 | + tx_slave = rlb_choose_channel(skb, bond, arp); | |
| 680 | 680 | |
| 681 | 681 | /* The ARP reply packets must be delayed so that |
| 682 | 682 | * they can cancel out the influence of the ARP request. |
| @@ -883,6 +883,7 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = { · 882 unmodified lines | ||
| 883 | 883 | = { .len = sizeof(struct can_bittiming) }, |
| 884 | 884 | [IFLA_CAN_DATA_BITTIMING_CONST] |
| 885 | 885 | = { .len = sizeof(struct can_bittiming_const) }, |
| 886 | + [IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, | |
| 886 | 887 | }; |
| 887 | 888 | |
| 888 | 889 | static int can_validate(struct nlattr *tb[], struct nlattr *data[], |
| @@ -2769,6 +2769,8 @@ static u64 mv88e6xxx_devlink_atu_bin_get(struct mv88e6xxx_chip *chip, · 2768 unmodified lines | ||
| 2769 | 2769 | goto unlock; |
| 2770 | 2770 | } |
| 2771 | 2771 | |
| 2772 | + occupancy &= MV88E6XXX_G2_ATU_STATS_MASK; | |
| 2773 | + | |
| 2772 | 2774 | unlock: |
| 2773 | 2775 | mv88e6xxx_reg_unlock(chip); |
| 2774 | 2776 | |
| @@ -1099,6 +1099,13 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip) · 1098 unmodified lines | ||
| 1099 | 1099 | { |
| 1100 | 1100 | int err, irq, virq; |
| 1101 | 1101 | |
| 1102 | + chip->g2_irq.masked = ~0; | |
| 1103 | + mv88e6xxx_reg_lock(chip); | |
| 1104 | + err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked); | |
| 1105 | + mv88e6xxx_reg_unlock(chip); | |
| 1106 | + if (err) | |
| 1107 | + return err; | |
| 1108 | + | |
| 1102 | 1109 | chip->g2_irq.domain = irq_domain_add_simple( |
| 1103 | 1110 | chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip); |
| 1104 | 1111 | if (!chip->g2_irq.domain) |
| @@ -1108,7 +1115,6 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip) · 3 unmodified lines | ||
| 1108 | 1115 | irq_create_mapping(chip->g2_irq.domain, irq); |
| 1109 | 1116 | |
| 1110 | 1117 | chip->g2_irq.chip = mv88e6xxx_g2_irq_chip; |
| 1111 | − chip->g2_irq.masked = ~0; | |
| 1112 | 1118 | |
| 1113 | 1119 | chip->device_irq = irq_find_mapping(chip->g1_irq.domain, |
| 1114 | 1120 | MV88E6XXX_G1_STS_IRQ_DEVICE); |
| @@ -1741,7 +1741,8 @@ static void sja1105_teardown(struct dsa_switch *ds) · 1740 unmodified lines | ||
| 1741 | 1741 | if (!dsa_is_user_port(ds, port)) |
| 1742 | 1742 | continue; |
| 1743 | 1743 | |
| 1744 | − kthread_destroy_worker(sp->xmit_worker); | |
| 1744 | + if (sp->xmit_worker) | |
| 1745 | + kthread_destroy_worker(sp->xmit_worker); | |
| 1745 | 1746 | } |
| 1746 | 1747 | |
| 1747 | 1748 | sja1105_tas_teardown(ds); |
| @@ -2135,7 +2135,7 @@ static int bcm_sysport_rule_set(struct bcm_sysport_priv *priv, · 2134 unmodified lines | ||
| 2135 | 2135 | return -ENOSPC; |
| 2136 | 2136 | |
| 2137 | 2137 | index = find_first_zero_bit(priv->filters, RXCHK_BRCM_TAG_MAX); |
| 2138 | − if (index > RXCHK_BRCM_TAG_MAX) | |
| 2138 | + if (index >= RXCHK_BRCM_TAG_MAX) | |
| 2139 | 2139 | return -ENOSPC; |
| 2140 | 2140 | |
| 2141 | 2141 | /* Location is the classification ID, and index is the position |
| @@ -10982,13 +10982,13 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu) · 10981 unmodified lines | ||
| 10982 | 10982 | struct bnxt *bp = netdev_priv(dev); |
| 10983 | 10983 | |
| 10984 | 10984 | if (netif_running(dev)) |
| 10985 | − bnxt_close_nic(bp, false, false); | |
| 10985 | + bnxt_close_nic(bp, true, false); | |
| 10986 | 10986 | |
| 10987 | 10987 | dev->mtu = new_mtu; |
| 10988 | 10988 | bnxt_set_ring_params(bp); |
| 10989 | 10989 | |
| 10990 | 10990 | if (netif_running(dev)) |
| 10991 | − return bnxt_open_nic(bp, false, false); | |
| 10991 | + return bnxt_open_nic(bp, true, false); | |
| 10992 | 10992 | |
| 10993 | 10993 | return 0; |
| 10994 | 10994 | } |
| @@ -2007,8 +2007,8 @@ int bnxt_flash_package_from_file(struct net_device *dev, const char *filename, · 2006 unmodified lines | ||
| 2007 | 2007 | struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr; |
| 2008 | 2008 | struct hwrm_nvm_install_update_input install = {0}; |
| 2009 | 2009 | const struct firmware *fw; |
| 2010 | − int rc, hwrm_err = 0; | |
| 2011 | 2010 | u32 item_len; |
| 2011 | + int rc = 0; | |
| 2012 | 2012 | u16 index; |
| 2013 | 2013 | |
| 2014 | 2014 | bnxt_hwrm_fw_set_time(bp); |
| @@ -2052,15 +2052,14 @@ int bnxt_flash_package_from_file(struct net_device *dev, const char *filename, · 37 unmodified lines | ||
| 2052 | 2052 | memcpy(kmem, fw->data, fw->size); |
| 2053 | 2053 | modify.host_src_addr = cpu_to_le64(dma_handle); |
| 2054 | 2054 | |
| 2055 | − hwrm_err = hwrm_send_message(bp, &modify, | |
| 2056 | − sizeof(modify), | |
| 2057 | − FLASH_PACKAGE_TIMEOUT); | |
| 2055 | + rc = hwrm_send_message(bp, &modify, sizeof(modify), | |
| 2056 | + FLASH_PACKAGE_TIMEOUT); | |
| 2058 | 2057 | dma_free_coherent(&bp->pdev->dev, fw->size, kmem, |
| 2059 | 2058 | dma_handle); |
| 2060 | 2059 | } |
| 2061 | 2060 | } |
| 2062 | 2061 | release_firmware(fw); |
| 2063 | − if (rc || hwrm_err) | |
| 2062 | + if (rc) | |
| 2064 | 2063 | goto err_exit; |
| 2065 | 2064 | |
| 2066 | 2065 | if ((install_type & 0xffff) == 0) |
| @@ -2069,20 +2068,19 @@ int bnxt_flash_package_from_file(struct net_device *dev, const char *filename, · 2 unmodified lines | ||
| 2069 | 2068 | install.install_type = cpu_to_le32(install_type); |
| 2070 | 2069 | |
| 2071 | 2070 | mutex_lock(&bp->hwrm_cmd_lock); |
| 2072 | − hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), | |
| 2073 | − INSTALL_PACKAGE_TIMEOUT); | |
| 2074 | − if (hwrm_err) { | |
| 2071 | + rc = _hwrm_send_message(bp, &install, sizeof(install), | |
| 2072 | + INSTALL_PACKAGE_TIMEOUT); | |
| 2073 | + if (rc) { | |
| 2075 | 2074 | u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; |
| 2076 | 2075 | |
| 2077 | 2076 | if (resp->error_code && error_code == |
| 2078 | 2077 | NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { |
| 2079 | 2078 | install.flags |= cpu_to_le16( |
| 2080 | 2079 | NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); |
| 2081 | − hwrm_err = _hwrm_send_message(bp, &install, | |
| 2082 | − sizeof(install), | |
| 2083 | − INSTALL_PACKAGE_TIMEOUT); | |
| 2080 | + rc = _hwrm_send_message(bp, &install, sizeof(install), | |
| 2081 | + INSTALL_PACKAGE_TIMEOUT); | |
| 2084 | 2082 | } |
| 2085 | − if (hwrm_err) | |
| 2083 | + if (rc) | |
| 2086 | 2084 | goto flash_pkg_exit; |
| 2087 | 2085 | } |
| 2088 | 2086 | |
| @@ -2094,7 +2092,7 @@ int bnxt_flash_package_from_file(struct net_device *dev, const char *filename, · 5 unmodified lines | ||
| 2094 | 2092 | flash_pkg_exit: |
| 2095 | 2093 | mutex_unlock(&bp->hwrm_cmd_lock); |
| 2096 | 2094 | err_exit: |
| 2097 | − if (hwrm_err == -EACCES) | |
| 2095 | + if (rc == -EACCES) | |
| 2098 | 2096 | bnxt_print_admin_err(bp); |
| 2099 | 2097 | return rc; |
| 2100 | 2098 | } |
| @@ -5381,12 +5381,11 @@ static inline bool is_x_10g_port(const struct link_config *lc) · 5380 unmodified lines | ||
| 5381 | 5381 | static int cfg_queues(struct adapter *adap) |
| 5382 | 5382 | { |
| 5383 | 5383 | u32 avail_qsets, avail_eth_qsets, avail_uld_qsets; |
| 5384 | + u32 i, n10g = 0, qidx = 0, n1g = 0; | |
| 5385 | + u32 ncpus = num_online_cpus(); | |
| 5384 | 5386 | u32 niqflint, neq, num_ulds; |
| 5385 | 5387 | struct sge *s = &adap->sge; |
| 5386 | − u32 i, n10g = 0, qidx = 0; | |
| 5387 | −#ifndef CONFIG_CHELSIO_T4_DCB | |
| 5388 | − int q10g = 0; | |
| 5389 | −#endif | |
| 5388 | + u32 q10g = 0, q1g; | |
| 5390 | 5389 | |
| 5391 | 5390 | /* Reduce memory usage in kdump environment, disable all offload. */ |
| 5392 | 5391 | if (is_kdump_kernel() || (is_uld(adap) && t4_uld_mem_alloc(adap))) { |
| @@ -5424,44 +5423,50 @@ static int cfg_queues(struct adapter *adap) · 31 unmodified lines | ||
| 5424 | 5423 | n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); |
| 5425 | 5424 | |
| 5426 | 5425 | avail_eth_qsets = min_t(u32, avail_qsets, MAX_ETH_QSETS); |
| 5426 | + | |
| 5427 | + /* We default to 1 queue per non-10G port and up to # of cores queues | |
| 5428 | + * per 10G port. | |
| 5429 | + */ | |
| 5430 | + if (n10g) | |
| 5431 | + q10g = (avail_eth_qsets - (adap->params.nports - n10g)) / n10g; | |
| 5432 | + | |
| 5433 | + n1g = adap->params.nports - n10g; | |
| 5427 | 5434 | #ifdef CONFIG_CHELSIO_T4_DCB |
| 5428 | 5435 | /* For Data Center Bridging support we need to be able to support up |
| 5429 | 5436 | * to 8 Traffic Priorities; each of which will be assigned to its |
| 5430 | 5437 | * own TX Queue in order to prevent Head-Of-Line Blocking. |
| 5431 | 5438 | */ |
| 5439 | + q1g = 8; | |
| 5432 | 5440 | if (adap->params.nports * 8 > avail_eth_qsets) { |
| 5433 | 5441 | dev_err(adap->pdev_dev, "DCB avail_eth_qsets=%d < %d!\n", |
| 5434 | 5442 | avail_eth_qsets, adap->params.nports * 8); |
| 5435 | 5443 | return -ENOMEM; |
| 5436 | 5444 | } |
| 5437 | 5445 | |
| 5438 | − for_each_port(adap, i) { | |
| 5439 | − struct port_info *pi = adap2pinfo(adap, i); | |
| 5446 | + if (adap->params.nports * ncpus < avail_eth_qsets) | |
| 5447 | + q10g = max(8U, ncpus); | |
| 5448 | + else | |
| 5449 | + q10g = max(8U, q10g); | |
| 5440 | 5450 | |
| 5441 | − pi->first_qset = qidx; | |
| 5442 | − pi->nqsets = is_kdump_kernel() ? 1 : 8; | |
| 5443 | − qidx += pi->nqsets; | |
| 5444 | − } | |
| 5445 | −#else /* !CONFIG_CHELSIO_T4_DCB */ | |
| 5446 | − /* We default to 1 queue per non-10G port and up to # of cores queues | |
| 5447 | − * per 10G port. | |
| 5448 | − */ | |
| 5449 | − if (n10g) | |
| 5450 | − q10g = (avail_eth_qsets - (adap->params.nports - n10g)) / n10g; | |
| 5451 | − if (q10g > netif_get_num_default_rss_queues()) | |
| 5452 | − q10g = netif_get_num_default_rss_queues(); | |
| 5451 | + while ((q10g * n10g) > (avail_eth_qsets - n1g * q1g)) | |
| 5452 | + q10g--; | |
| 5453 | 5453 | |
| 5454 | − if (is_kdump_kernel()) | |
| 5454 | +#else /* !CONFIG_CHELSIO_T4_DCB */ | |
| 5455 | + q1g = 1; | |
| 5456 | + q10g = min(q10g, ncpus); | |
| 5457 | +#endif /* !CONFIG_CHELSIO_T4_DCB */ | |
| 5458 | + if (is_kdump_kernel()) { | |
| 5455 | 5459 | q10g = 1; |
| 5460 | + q1g = 1; | |
| 5461 | + } | |
| 5456 | 5462 | |
| 5457 | 5463 | for_each_port(adap, i) { |
| 5458 | 5464 | struct port_info *pi = adap2pinfo(adap, i); |
| 5459 | 5465 | |
| 5460 | 5466 | pi->first_qset = qidx; |
| 5461 | − pi->nqsets = is_x_10g_port(&pi->link_cfg) ? q10g : 1; | |
| 5467 | + pi->nqsets = is_x_10g_port(&pi->link_cfg) ? q10g : q1g; | |
| 5462 | 5468 | qidx += pi->nqsets; |
| 5463 | 5469 | } |
| 5464 | −#endif /* !CONFIG_CHELSIO_T4_DCB */ | |
| 5465 | 5470 | |
| 5466 | 5471 | s->ethqsets = qidx; |
| 5467 | 5472 | s->max_ethqsets = qidx; /* MSI-X may lower it later */ |
| @@ -5473,7 +5478,7 @@ static int cfg_queues(struct adapter *adap) · 5 unmodified lines | ||
| 5473 | 5478 | * capped by the number of available cores. |
| 5474 | 5479 | */ |
| 5475 | 5480 | num_ulds = adap->num_uld + adap->num_ofld_uld; |
| 5476 | − i = min_t(u32, MAX_OFLD_QSETS, num_online_cpus()); | |
| 5481 | + i = min_t(u32, MAX_OFLD_QSETS, ncpus); | |
| 5477 | 5482 | avail_uld_qsets = roundup(i, adap->params.nports); |
| 5478 | 5483 | if (avail_qsets < num_ulds * adap->params.nports) { |
| 5479 | 5484 | adap->params.offload = 0; |
| @@ -1,4 +1,5 @@ | ||
| 1 | 1 | /* Copyright 2008 - 2016 Freescale Semiconductor Inc. |
| 2 | + * Copyright 2020 NXP | |
| 2 | 3 | * |
| 3 | 4 | * Redistribution and use in source and binary forms, with or without |
| 4 | 5 | * modification, are permitted provided that the following conditions are met: |
| @@ -123,7 +124,22 @@ MODULE_PARM_DESC(tx_timeout, "The Tx timeout in ms"); · 118 unmodified lines | ||
| 123 | 124 | #define FSL_QMAN_MAX_OAL 127 |
| 124 | 125 | |
| 125 | 126 | /* Default alignment for start of data in an Rx FD */ |
| 127 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 128 | +/* aligning data start to 64 avoids DMA transaction splits, unless the buffer | |
| 129 | + * is crossing a 4k page boundary | |
| 130 | + */ | |
| 131 | +#define DPAA_FD_DATA_ALIGNMENT (fman_has_errata_a050385() ? 64 : 16) | |
| 132 | +/* aligning to 256 avoids DMA transaction splits caused by 4k page boundary | |
| 133 | + * crossings; also, all SG fragments except the last must have a size multiple | |
| 134 | + * of 256 to avoid DMA transaction splits | |
| 135 | + */ | |
| 136 | +#define DPAA_A050385_ALIGN 256 | |
| 137 | +#define DPAA_FD_RX_DATA_ALIGNMENT (fman_has_errata_a050385() ? \ | |
| 138 | + DPAA_A050385_ALIGN : 16) | |
| 139 | +#else | |
| 126 | 140 | #define DPAA_FD_DATA_ALIGNMENT 16 |
| 141 | +#define DPAA_FD_RX_DATA_ALIGNMENT DPAA_FD_DATA_ALIGNMENT | |
| 142 | +#endif | |
| 127 | 143 | |
| 128 | 144 | /* The DPAA requires 256 bytes reserved and mapped for the SGT */ |
| 129 | 145 | #define DPAA_SGT_SIZE 256 |
| @@ -158,8 +174,13 @@ MODULE_PARM_DESC(tx_timeout, "The Tx timeout in ms"); · 28 unmodified lines | ||
| 158 | 174 | #define DPAA_PARSE_RESULTS_SIZE sizeof(struct fman_prs_result) |
| 159 | 175 | #define DPAA_TIME_STAMP_SIZE 8 |
| 160 | 176 | #define DPAA_HASH_RESULTS_SIZE 8 |
| 177 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 178 | +#define DPAA_RX_PRIV_DATA_SIZE (DPAA_A050385_ALIGN - (DPAA_PARSE_RESULTS_SIZE\ | |
| 179 | + + DPAA_TIME_STAMP_SIZE + DPAA_HASH_RESULTS_SIZE)) | |
| 180 | +#else | |
| 161 | 181 | #define DPAA_RX_PRIV_DATA_SIZE (u16)(DPAA_TX_PRIV_DATA_SIZE + \ |
| 162 | 182 | dpaa_rx_extra_headroom) |
| 183 | +#endif | |
| 163 | 184 | |
| 164 | 185 | #define DPAA_ETH_PCD_RXQ_NUM 128 |
| 165 | 186 | |
| @@ -180,7 +201,12 @@ static struct dpaa_bp *dpaa_bp_array[BM_MAX_NUM_OF_POOLS]; · 14 unmodified lines | ||
| 180 | 201 | |
| 181 | 202 | #define DPAA_BP_RAW_SIZE 4096 |
| 182 | 203 | |
| 204 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 205 | +#define dpaa_bp_size(raw_size) (SKB_WITH_OVERHEAD(raw_size) & \ | |
| 206 | + ~(DPAA_A050385_ALIGN - 1)) | |
| 207 | +#else | |
| 183 | 208 | #define dpaa_bp_size(raw_size) SKB_WITH_OVERHEAD(raw_size) |
| 209 | +#endif | |
| 184 | 210 | |
| 185 | 211 | static int dpaa_max_frm; |
| 186 | 212 | |
| @@ -1192,7 +1218,7 @@ static int dpaa_eth_init_rx_port(struct fman_port *port, struct dpaa_bp *bp, · 1005 unmodified lines | ||
| 1192 | 1218 | buf_prefix_content.pass_prs_result = true; |
| 1193 | 1219 | buf_prefix_content.pass_hash_result = true; |
| 1194 | 1220 | buf_prefix_content.pass_time_stamp = true; |
| 1195 | − buf_prefix_content.data_align = DPAA_FD_DATA_ALIGNMENT; | |
| 1221 | + buf_prefix_content.data_align = DPAA_FD_RX_DATA_ALIGNMENT; | |
| 1196 | 1222 | |
| 1197 | 1223 | rx_p = ¶ms.specific_params.rx_params; |
| 1198 | 1224 | rx_p->err_fqid = errq->fqid; |
| @@ -1662,6 +1688,8 @@ static u8 rx_csum_offload(const struct dpaa_priv *priv, const struct qm_fd *fd) · 463 unmodified lines | ||
| 1662 | 1688 | return CHECKSUM_NONE; |
| 1663 | 1689 | } |
| 1664 | 1690 | |
| 1691 | +#define PTR_IS_ALIGNED(x, a) (IS_ALIGNED((unsigned long)(x), (a))) | |
| 1692 | + | |
| 1665 | 1693 | /* Build a linear skb around the received buffer. |
| 1666 | 1694 | * We are guaranteed there is enough room at the end of the data buffer to |
| 1667 | 1695 | * accommodate the shared info area of the skb. |
| @@ -1733,8 +1761,7 @@ static struct sk_buff *sg_fd_to_skb(const struct dpaa_priv *priv, · 65 unmodified lines | ||
| 1733 | 1761 | |
| 1734 | 1762 | sg_addr = qm_sg_addr(&sgt[i]); |
| 1735 | 1763 | sg_vaddr = phys_to_virt(sg_addr); |
| 1736 | − WARN_ON(!IS_ALIGNED((unsigned long)sg_vaddr, | |
| 1737 | − SMP_CACHE_BYTES)); | |
| 1764 | + WARN_ON(!PTR_IS_ALIGNED(sg_vaddr, SMP_CACHE_BYTES)); | |
| 1738 | 1765 | |
| 1739 | 1766 | dma_unmap_page(priv->rx_dma_dev, sg_addr, |
| 1740 | 1767 | DPAA_BP_RAW_SIZE, DMA_FROM_DEVICE); |
| @@ -2022,6 +2049,75 @@ static inline int dpaa_xmit(struct dpaa_priv *priv, · 281 unmodified lines | ||
| 2022 | 2049 | return 0; |
| 2023 | 2050 | } |
| 2024 | 2051 | |
| 2052 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 2053 | +int dpaa_a050385_wa(struct net_device *net_dev, struct sk_buff **s) | |
| 2054 | +{ | |
| 2055 | + struct dpaa_priv *priv = netdev_priv(net_dev); | |
| 2056 | + struct sk_buff *new_skb, *skb = *s; | |
| 2057 | + unsigned char *start, i; | |
| 2058 | + | |
| 2059 | + /* check linear buffer alignment */ | |
| 2060 | + if (!PTR_IS_ALIGNED(skb->data, DPAA_A050385_ALIGN)) | |
| 2061 | + goto workaround; | |
| 2062 | + | |
| 2063 | + /* linear buffers just need to have an aligned start */ | |
| 2064 | + if (!skb_is_nonlinear(skb)) | |
| 2065 | + return 0; | |
| 2066 | + | |
| 2067 | + /* linear data size for nonlinear skbs needs to be aligned */ | |
| 2068 | + if (!IS_ALIGNED(skb_headlen(skb), DPAA_A050385_ALIGN)) | |
| 2069 | + goto workaround; | |
| 2070 | + | |
| 2071 | + for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | |
| 2072 | + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | |
| 2073 | + | |
| 2074 | + /* all fragments need to have aligned start addresses */ | |
| 2075 | + if (!IS_ALIGNED(skb_frag_off(frag), DPAA_A050385_ALIGN)) | |
| 2076 | + goto workaround; | |
| 2077 | + | |
| 2078 | + /* all but last fragment need to have aligned sizes */ | |
| 2079 | + if (!IS_ALIGNED(skb_frag_size(frag), DPAA_A050385_ALIGN) && | |
| 2080 | + (i < skb_shinfo(skb)->nr_frags - 1)) | |
| 2081 | + goto workaround; | |
| 2082 | + } | |
| 2083 | + | |
| 2084 | + return 0; | |
| 2085 | + | |
| 2086 | +workaround: | |
| 2087 | + /* copy all the skb content into a new linear buffer */ | |
| 2088 | + new_skb = netdev_alloc_skb(net_dev, skb->len + DPAA_A050385_ALIGN - 1 + | |
| 2089 | + priv->tx_headroom); | |
| 2090 | + if (!new_skb) | |
| 2091 | + return -ENOMEM; | |
| 2092 | + | |
| 2093 | + /* NET_SKB_PAD bytes already reserved, adding up to tx_headroom */ | |
| 2094 | + skb_reserve(new_skb, priv->tx_headroom - NET_SKB_PAD); | |
| 2095 | + | |
| 2096 | + /* Workaround for DPAA_A050385 requires data start to be aligned */ | |
| 2097 | + start = PTR_ALIGN(new_skb->data, DPAA_A050385_ALIGN); | |
| 2098 | + if (start - new_skb->data != 0) | |
| 2099 | + skb_reserve(new_skb, start - new_skb->data); | |
| 2100 | + | |
| 2101 | + skb_put(new_skb, skb->len); | |
| 2102 | + skb_copy_bits(skb, 0, new_skb->data, skb->len); | |
| 2103 | + skb_copy_header(new_skb, skb); | |
| 2104 | + new_skb->dev = skb->dev; | |
| 2105 | + | |
| 2106 | + /* We move the headroom when we align it so we have to reset the | |
| 2107 | + * network and transport header offsets relative to the new data | |
| 2108 | + * pointer. The checksum offload relies on these offsets. | |
| 2109 | + */ | |
| 2110 | + skb_set_network_header(new_skb, skb_network_offset(skb)); | |
| 2111 | + skb_set_transport_header(new_skb, skb_transport_offset(skb)); | |
| 2112 | + | |
| 2113 | + /* TODO: does timestamping need the result in the old skb? */ | |
| 2114 | + dev_kfree_skb(skb); | |
| 2115 | + *s = new_skb; | |
| 2116 | + | |
| 2117 | + return 0; | |
| 2118 | +} | |
| 2119 | +#endif | |
| 2120 | + | |
| 2025 | 2121 | static netdev_tx_t |
| 2026 | 2122 | dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) |
| 2027 | 2123 | { |
| @@ -2068,6 +2164,14 @@ dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) · 40 unmodified lines | ||
| 2068 | 2164 | nonlinear = skb_is_nonlinear(skb); |
| 2069 | 2165 | } |
| 2070 | 2166 | |
| 2167 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 2168 | + if (unlikely(fman_has_errata_a050385())) { | |
| 2169 | + if (dpaa_a050385_wa(net_dev, &skb)) | |
| 2170 | + goto enomem; | |
| 2171 | + nonlinear = skb_is_nonlinear(skb); | |
| 2172 | + } | |
| 2173 | +#endif | |
| 2174 | + | |
| 2071 | 2175 | if (nonlinear) { |
| 2072 | 2176 | /* Just create a S/G fd based on the skb */ |
| 2073 | 2177 | err = skb_to_sg_fd(priv, skb, &fd); |
| @@ -2741,9 +2845,7 @@ static inline u16 dpaa_get_headroom(struct dpaa_buffer_layout *bl) · 667 unmodified lines | ||
| 2741 | 2845 | headroom = (u16)(bl->priv_data_size + DPAA_PARSE_RESULTS_SIZE + |
| 2742 | 2846 | DPAA_TIME_STAMP_SIZE + DPAA_HASH_RESULTS_SIZE); |
| 2743 | 2847 | |
| 2744 | − return DPAA_FD_DATA_ALIGNMENT ? ALIGN(headroom, | |
| 2745 | − DPAA_FD_DATA_ALIGNMENT) : | |
| 2746 | − headroom; | |
| 2848 | + return ALIGN(headroom, DPAA_FD_DATA_ALIGNMENT); | |
| 2747 | 2849 | } |
| 2748 | 2850 | |
| 2749 | 2851 | static int dpaa_eth_probe(struct platform_device *pdev) |
| @@ -2529,15 +2529,15 @@ fec_enet_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec) · 2528 unmodified lines | ||
| 2529 | 2529 | return -EINVAL; |
| 2530 | 2530 | } |
| 2531 | 2531 | |
| 2532 | − cycle = fec_enet_us_to_itr_clock(ndev, fep->rx_time_itr); | |
| 2532 | + cycle = fec_enet_us_to_itr_clock(ndev, ec->rx_coalesce_usecs); | |
| 2533 | 2533 | if (cycle > 0xFFFF) { |
| 2534 | 2534 | dev_err(dev, "Rx coalesced usec exceed hardware limitation\n"); |
| 2535 | 2535 | return -EINVAL; |
| 2536 | 2536 | } |
| 2537 | 2537 | |
| 2538 | − cycle = fec_enet_us_to_itr_clock(ndev, fep->tx_time_itr); | |
| 2538 | + cycle = fec_enet_us_to_itr_clock(ndev, ec->tx_coalesce_usecs); | |
| 2539 | 2539 | if (cycle > 0xFFFF) { |
| 2540 | − dev_err(dev, "Rx coalesced usec exceed hardware limitation\n"); | |
| 2540 | + dev_err(dev, "Tx coalesced usec exceed hardware limitation\n"); | |
| 2541 | 2541 | return -EINVAL; |
| 2542 | 2542 | } |
| 2543 | 2543 | |
| @@ -8,3 +8,31 @@ config FSL_FMAN · 7 unmodified lines | ||
| 8 | 8 | help |
| 9 | 9 | Freescale Data-Path Acceleration Architecture Frame Manager |
| 10 | 10 | (FMan) support |
| 11 | + | |
| 12 | +config DPAA_ERRATUM_A050385 | |
| 13 | + bool | |
| 14 | + depends on ARM64 && FSL_DPAA | |
| 15 | + default y | |
| 16 | + help | |
| 17 | + DPAA FMan erratum A050385 software workaround implementation: | |
| 18 | + align buffers, data start, SG fragment length to avoid FMan DMA | |
| 19 | + splits. | |
| 20 | + FMAN DMA read or writes under heavy traffic load may cause FMAN | |
| 21 | + internal resource leak thus stopping further packet processing. | |
| 22 | + The FMAN internal queue can overflow when FMAN splits single | |
| 23 | + read or write transactions into multiple smaller transactions | |
| 24 | + such that more than 17 AXI transactions are in flight from FMAN | |
| 25 | + to interconnect. When the FMAN internal queue overflows, it can | |
| 26 | + stall further packet processing. The issue can occur with any | |
| 27 | + one of the following three conditions: | |
| 28 | + 1. FMAN AXI transaction crosses 4K address boundary (Errata | |
| 29 | + A010022) | |
| 30 | + 2. FMAN DMA address for an AXI transaction is not 16 byte | |
| 31 | + aligned, i.e. the last 4 bits of an address are non-zero | |
| 32 | + 3. Scatter Gather (SG) frames have more than one SG buffer in | |
| 33 | + the SG list and any one of the buffers, except the last | |
| 34 | + buffer in the SG list has data size that is not a multiple | |
| 35 | + of 16 bytes, i.e., other than 16, 32, 48, 64, etc. | |
| 36 | + With any one of the above three conditions present, there is | |
| 37 | + likelihood of stalled FMAN packet processing, especially under | |
| 38 | + stress with multiple ports injecting line-rate traffic. | |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright 2008-2015 Freescale Semiconductor Inc. |
| 3 | + * Copyright 2020 NXP | |
| 3 | 4 | * |
| 4 | 5 | * Redistribution and use in source and binary forms, with or without |
| 5 | 6 | * modification, are permitted provided that the following conditions are met: |
| @@ -566,6 +567,10 @@ struct fman_cfg { · 560 unmodified lines | ||
| 566 | 567 | u32 qmi_def_tnums_thresh; |
| 567 | 568 | }; |
| 568 | 569 | |
| 570 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 571 | +static bool fman_has_err_a050385; | |
| 572 | +#endif | |
| 573 | + | |
| 569 | 574 | static irqreturn_t fman_exceptions(struct fman *fman, |
| 570 | 575 | enum fman_exceptions exception) |
| 571 | 576 | { |
| @@ -2518,6 +2523,14 @@ struct fman *fman_bind(struct device *fm_dev) · 1946 unmodified lines | ||
| 2518 | 2523 | } |
| 2519 | 2524 | EXPORT_SYMBOL(fman_bind); |
| 2520 | 2525 | |
| 2526 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 2527 | +bool fman_has_errata_a050385(void) | |
| 2528 | +{ | |
| 2529 | + return fman_has_err_a050385; | |
| 2530 | +} | |
| 2531 | +EXPORT_SYMBOL(fman_has_errata_a050385); | |
| 2532 | +#endif | |
| 2533 | + | |
| 2521 | 2534 | static irqreturn_t fman_err_irq(int irq, void *handle) |
| 2522 | 2535 | { |
| 2523 | 2536 | struct fman *fman = (struct fman *)handle; |
| @@ -2845,6 +2858,11 @@ static struct fman *read_dts_node(struct platform_device *of_dev) · 321 unmodified lines | ||
| 2845 | 2858 | goto fman_free; |
| 2846 | 2859 | } |
| 2847 | 2860 | |
| 2861 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 2862 | + fman_has_err_a050385 = | |
| 2863 | + of_property_read_bool(fm_node, "fsl,erratum-a050385"); | |
| 2864 | +#endif | |
| 2865 | + | |
| 2848 | 2866 | return fman; |
| 2849 | 2867 | |
| 2850 | 2868 | fman_node_put: |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * Copyright 2008-2015 Freescale Semiconductor Inc. |
| 3 | + * Copyright 2020 NXP | |
| 3 | 4 | * |
| 4 | 5 | * Redistribution and use in source and binary forms, with or without |
| 5 | 6 | * modification, are permitted provided that the following conditions are met: |
| @@ -398,6 +399,10 @@ u16 fman_get_max_frm(void); · 392 unmodified lines | ||
| 398 | 399 | |
| 399 | 400 | int fman_get_rx_extra_headroom(void); |
| 400 | 401 | |
| 402 | +#ifdef CONFIG_DPAA_ERRATUM_A050385 | |
| 403 | +bool fman_has_errata_a050385(void); | |
| 404 | +#endif | |
| 405 | + | |
| 401 | 406 | struct fman *fman_bind(struct device *dev); |
| 402 | 407 | |
| 403 | 408 | #endif /* __FM_H */ |
| @@ -46,6 +46,7 @@ enum HCLGE_MBX_OPCODE { · 45 unmodified lines | ||
| 46 | 46 | HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */ |
| 47 | 47 | HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */ |
| 48 | 48 | HCLGE_MBX_PUSH_PROMISC_INFO, /* (PF -> VF) push vf promisc info */ |
| 49 | + HCLGE_MBX_VF_UNINIT, /* (VF -> PF) vf is unintializing */ | |
| 49 | 50 | |
| 50 | 51 | HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */ |
| 51 | 52 | HCLGE_MBX_PUSH_LINK_STATUS, /* (M7 -> PF) get port link status */ |
| @@ -1711,7 +1711,7 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) · 1710 unmodified lines | ||
| 1711 | 1711 | netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc); |
| 1712 | 1712 | |
| 1713 | 1713 | return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? |
| 1714 | − kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP; | |
| 1714 | + kinfo->dcb_ops->setup_tc(h, tc ? tc : 1, prio_tc) : -EOPNOTSUPP; | |
| 1715 | 1715 | } |
| 1716 | 1716 | |
| 1717 | 1717 | static int hns3_nic_setup_tc(struct net_device *dev, enum tc_setup_type type, |
| @@ -2446,10 +2446,12 @@ static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed, · 2445 unmodified lines | ||
| 2446 | 2446 | |
| 2447 | 2447 | int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex) |
| 2448 | 2448 | { |
| 2449 | + struct hclge_mac *mac = &hdev->hw.mac; | |
| 2449 | 2450 | int ret; |
| 2450 | 2451 | |
| 2451 | 2452 | duplex = hclge_check_speed_dup(duplex, speed); |
| 2452 | − if (hdev->hw.mac.speed == speed && hdev->hw.mac.duplex == duplex) | |
| 2453 | + if (!mac->support_autoneg && mac->speed == speed && | |
| 2454 | + mac->duplex == duplex) | |
| 2453 | 2455 | return 0; |
| 2454 | 2456 | |
| 2455 | 2457 | ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex); |
| @@ -7743,16 +7745,27 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type, · 5287 unmodified lines | ||
| 7743 | 7745 | struct hclge_desc desc; |
| 7744 | 7746 | int ret; |
| 7745 | 7747 | |
| 7746 | − hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, false); | |
| 7747 | − | |
| 7748 | + /* read current vlan filter parameter */ | |
| 7749 | + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, true); | |
| 7748 | 7750 | req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data; |
| 7749 | 7751 | req->vlan_type = vlan_type; |
| 7750 | − req->vlan_fe = filter_en ? fe_type : 0; | |
| 7751 | 7752 | req->vf_id = vf_id; |
| 7752 | 7753 | |
| 7754 | + ret = hclge_cmd_send(&hdev->hw, &desc, 1); | |
| 7755 | + if (ret) { | |
| 7756 | + dev_err(&hdev->pdev->dev, | |
| 7757 | + "failed to get vlan filter config, ret = %d.\n", ret); | |
| 7758 | + return ret; | |
| 7759 | + } | |
| 7760 | + | |
| 7761 | + /* modify and write new config parameter */ | |
| 7762 | + hclge_cmd_reuse_desc(&desc, false); | |
| 7763 | + req->vlan_fe = filter_en ? | |
| 7764 | + (req->vlan_fe | fe_type) : (req->vlan_fe & ~fe_type); | |
| 7765 | + | |
| 7753 | 7766 | ret = hclge_cmd_send(&hdev->hw, &desc, 1); |
| 7754 | 7767 | if (ret) |
| 7755 | − dev_err(&hdev->pdev->dev, "set vlan filter fail, ret =%d.\n", | |
| 7768 | + dev_err(&hdev->pdev->dev, "failed to set vlan filter, ret = %d.\n", | |
| 7756 | 7769 | ret); |
| 7757 | 7770 | |
| 7758 | 7771 | return ret; |
| @@ -8270,6 +8283,7 @@ void hclge_rm_vport_all_vlan_table(struct hclge_vport *vport, bool is_del_list) · 511 unmodified lines | ||
| 8270 | 8283 | kfree(vlan); |
| 8271 | 8284 | } |
| 8272 | 8285 | } |
| 8286 | + clear_bit(vport->vport_id, hdev->vf_vlan_full); | |
| 8273 | 8287 | } |
| 8274 | 8288 | |
| 8275 | 8289 | void hclge_uninit_vport_vlan_table(struct hclge_dev *hdev) |
| @@ -8486,6 +8500,28 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid, · 210 unmodified lines | ||
| 8486 | 8500 | } |
| 8487 | 8501 | } |
| 8488 | 8502 | |
| 8503 | +static void hclge_clear_vf_vlan(struct hclge_dev *hdev) | |
| 8504 | +{ | |
| 8505 | + struct hclge_vlan_info *vlan_info; | |
| 8506 | + struct hclge_vport *vport; | |
| 8507 | + int ret; | |
| 8508 | + int vf; | |
| 8509 | + | |
| 8510 | + /* clear port base vlan for all vf */ | |
| 8511 | + for (vf = HCLGE_VF_VPORT_START_NUM; vf < hdev->num_alloc_vport; vf++) { | |
| 8512 | + vport = &hdev->vport[vf]; | |
| 8513 | + vlan_info = &vport->port_base_vlan_cfg.vlan_info; | |
| 8514 | + | |
| 8515 | + ret = hclge_set_vlan_filter_hw(hdev, htons(ETH_P_8021Q), | |
| 8516 | + vport->vport_id, | |
| 8517 | + vlan_info->vlan_tag, true); | |
| 8518 | + if (ret) | |
| 8519 | + dev_err(&hdev->pdev->dev, | |
| 8520 | + "failed to clear vf vlan for vf%d, ret = %d\n", | |
| 8521 | + vf - HCLGE_VF_VPORT_START_NUM, ret); | |
| 8522 | + } | |
| 8523 | +} | |
| 8524 | + | |
| 8489 | 8525 | int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, |
| 8490 | 8526 | u16 vlan_id, bool is_kill) |
| 8491 | 8527 | { |
| @@ -9895,6 +9931,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev) · 1403 unmodified lines | ||
| 9895 | 9931 | struct hclge_mac *mac = &hdev->hw.mac; |
| 9896 | 9932 | |
| 9897 | 9933 | hclge_reset_vf_rate(hdev); |
| 9934 | + hclge_clear_vf_vlan(hdev); | |
| 9898 | 9935 | hclge_misc_affinity_teardown(hdev); |
| 9899 | 9936 | hclge_state_uninit(hdev); |
| 9900 | 9937 | |
| @@ -799,6 +799,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 798 unmodified lines | ||
| 799 | 799 | hclge_get_link_mode(vport, req); |
| 800 | 800 | break; |
| 801 | 801 | case HCLGE_MBX_GET_VF_FLR_STATUS: |
| 802 | + case HCLGE_MBX_VF_UNINIT: | |
| 802 | 803 | hclge_rm_vport_all_mac_table(vport, true, |
| 803 | 804 | HCLGE_MAC_ADDR_UC); |
| 804 | 805 | hclge_rm_vport_all_mac_table(vport, true, |
| @@ -2803,6 +2803,9 @@ static void hclgevf_uninit_hdev(struct hclgevf_dev *hdev) · 2802 unmodified lines | ||
| 2803 | 2803 | { |
| 2804 | 2804 | hclgevf_state_uninit(hdev); |
| 2805 | 2805 | |
| 2806 | + hclgevf_send_mbx_msg(hdev, HCLGE_MBX_VF_UNINIT, 0, NULL, 0, | |
| 2807 | + false, NULL, 0); | |
| 2808 | + | |
| 2806 | 2809 | if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) { |
| 2807 | 2810 | hclgevf_misc_irq_uninit(hdev); |
| 2808 | 2811 | hclgevf_uninit_msi(hdev); |
| @@ -2142,6 +2142,8 @@ static void __ibmvnic_reset(struct work_struct *work) · 2141 unmodified lines | ||
| 2142 | 2142 | { |
| 2143 | 2143 | struct ibmvnic_rwi *rwi; |
| 2144 | 2144 | struct ibmvnic_adapter *adapter; |
| 2145 | + bool saved_state = false; | |
| 2146 | + unsigned long flags; | |
| 2145 | 2147 | u32 reset_state; |
| 2146 | 2148 | int rc = 0; |
| 2147 | 2149 | |
| @@ -2153,17 +2155,25 @@ static void __ibmvnic_reset(struct work_struct *work) · 5 unmodified lines | ||
| 2153 | 2155 | return; |
| 2154 | 2156 | } |
| 2155 | 2157 | |
| 2156 | − reset_state = adapter->state; | |
| 2157 | − | |
| 2158 | 2158 | rwi = get_next_rwi(adapter); |
| 2159 | 2159 | while (rwi) { |
| 2160 | + spin_lock_irqsave(&adapter->state_lock, flags); | |
| 2161 | + | |
| 2160 | 2162 | if (adapter->state == VNIC_REMOVING || |
| 2161 | 2163 | adapter->state == VNIC_REMOVED) { |
| 2164 | + spin_unlock_irqrestore(&adapter->state_lock, flags); | |
| 2162 | 2165 | kfree(rwi); |
| 2163 | 2166 | rc = EBUSY; |
| 2164 | 2167 | break; |
| 2165 | 2168 | } |
| 2166 | 2169 | |
| 2170 | + if (!saved_state) { | |
| 2171 | + reset_state = adapter->state; | |
| 2172 | + adapter->state = VNIC_RESETTING; | |
| 2173 | + saved_state = true; | |
| 2174 | + } | |
| 2175 | + spin_unlock_irqrestore(&adapter->state_lock, flags); | |
| 2176 | + | |
| 2167 | 2177 | if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) { |
| 2168 | 2178 | /* CHANGE_PARAM requestor holds rtnl_lock */ |
| 2169 | 2179 | rc = do_change_param_reset(adapter, rwi, reset_state); |
| @@ -5091,6 +5101,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) · 2921 unmodified lines | ||
| 5091 | 5101 | __ibmvnic_delayed_reset); |
| 5092 | 5102 | INIT_LIST_HEAD(&adapter->rwi_list); |
| 5093 | 5103 | spin_lock_init(&adapter->rwi_lock); |
| 5104 | + spin_lock_init(&adapter->state_lock); | |
| 5094 | 5105 | mutex_init(&adapter->fw_lock); |
| 5095 | 5106 | init_completion(&adapter->init_done); |
| 5096 | 5107 | init_completion(&adapter->fw_done); |
| @@ -5163,8 +5174,17 @@ static int ibmvnic_remove(struct vio_dev *dev) · 66 unmodified lines | ||
| 5163 | 5174 | { |
| 5164 | 5175 | struct net_device *netdev = dev_get_drvdata(&dev->dev); |
| 5165 | 5176 | struct ibmvnic_adapter *adapter = netdev_priv(netdev); |
| 5177 | + unsigned long flags; | |
| 5178 | + | |
| 5179 | + spin_lock_irqsave(&adapter->state_lock, flags); | |
| 5180 | + if (adapter->state == VNIC_RESETTING) { | |
| 5181 | + spin_unlock_irqrestore(&adapter->state_lock, flags); | |
| 5182 | + return -EBUSY; | |
| 5183 | + } | |
| 5166 | 5184 | |
| 5167 | 5185 | adapter->state = VNIC_REMOVING; |
| 5186 | + spin_unlock_irqrestore(&adapter->state_lock, flags); | |
| 5187 | + | |
| 5168 | 5188 | rtnl_lock(); |
| 5169 | 5189 | unregister_netdevice(netdev); |
| 5170 | 5190 | |
| @@ -941,7 +941,8 @@ enum vnic_state {VNIC_PROBING = 1, · 940 unmodified lines | ||
| 941 | 941 | VNIC_CLOSING, |
| 942 | 942 | VNIC_CLOSED, |
| 943 | 943 | VNIC_REMOVING, |
| 944 | − VNIC_REMOVED}; | |
| 944 | + VNIC_REMOVED, | |
| 945 | + VNIC_RESETTING}; | |
| 945 | 946 | |
| 946 | 947 | enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1, |
| 947 | 948 | VNIC_RESET_MOBILITY, |
| @@ -1090,4 +1091,7 @@ struct ibmvnic_adapter { · 142 unmodified lines | ||
| 1090 | 1091 | |
| 1091 | 1092 | struct ibmvnic_tunables desired; |
| 1092 | 1093 | struct ibmvnic_tunables fallback; |
| 1094 | + | |
| 1095 | + /* Used for serializatin of state field */ | |
| 1096 | + spinlock_t state_lock; | |
| 1093 | 1097 | }; |
| @@ -347,7 +347,7 @@ static int orion_mdio_probe(struct platform_device *pdev) · 346 unmodified lines | ||
| 347 | 347 | } |
| 348 | 348 | |
| 349 | 349 | |
| 350 | − dev->err_interrupt = platform_get_irq(pdev, 0); | |
| 350 | + dev->err_interrupt = platform_get_irq_optional(pdev, 0); | |
| 351 | 351 | if (dev->err_interrupt > 0 && |
| 352 | 352 | resource_size(r) < MVMDIO_ERR_INT_MASK + 4) { |
| 353 | 353 | dev_err(&pdev->dev, |
| @@ -364,8 +364,8 @@ static int orion_mdio_probe(struct platform_device *pdev) · 10 unmodified lines | ||
| 364 | 364 | writel(MVMDIO_ERR_INT_SMI_DONE, |
| 365 | 365 | dev->regs + MVMDIO_ERR_INT_MASK); |
| 366 | 366 | |
| 367 | − } else if (dev->err_interrupt == -EPROBE_DEFER) { | |
| 368 | − ret = -EPROBE_DEFER; | |
| 367 | + } else if (dev->err_interrupt < 0) { | |
| 368 | + ret = dev->err_interrupt; | |
| 369 | 369 | goto out_mdio; |
| 370 | 370 | } |
| 371 | 371 | |
| @@ -2176,24 +2176,29 @@ static int ocelot_init_timestamp(struct ocelot *ocelot) · 2175 unmodified lines | ||
| 2176 | 2176 | return 0; |
| 2177 | 2177 | } |
| 2178 | 2178 | |
| 2179 | −static void ocelot_port_set_mtu(struct ocelot *ocelot, int port, size_t mtu) | |
| 2179 | +/* Configure the maximum SDU (L2 payload) on RX to the value specified in @sdu. | |
| 2180 | + * The length of VLAN tags is accounted for automatically via DEV_MAC_TAGS_CFG. | |
| 2181 | + */ | |
| 2182 | +static void ocelot_port_set_maxlen(struct ocelot *ocelot, int port, size_t sdu) | |
| 2180 | 2183 | { |
| 2181 | 2184 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 2185 | + int maxlen = sdu + ETH_HLEN + ETH_FCS_LEN; | |
| 2182 | 2186 | int atop_wm; |
| 2183 | 2187 | |
| 2184 | − ocelot_port_writel(ocelot_port, mtu, DEV_MAC_MAXLEN_CFG); | |
| 2188 | + ocelot_port_writel(ocelot_port, maxlen, DEV_MAC_MAXLEN_CFG); | |
| 2185 | 2189 | |
| 2186 | 2190 | /* Set Pause WM hysteresis |
| 2187 | − * 152 = 6 * mtu / OCELOT_BUFFER_CELL_SZ | |
| 2188 | − * 101 = 4 * mtu / OCELOT_BUFFER_CELL_SZ | |
| 2191 | + * 152 = 6 * maxlen / OCELOT_BUFFER_CELL_SZ | |
| 2192 | + * 101 = 4 * maxlen / OCELOT_BUFFER_CELL_SZ | |
| 2189 | 2193 | */ |
| 2190 | 2194 | ocelot_write_rix(ocelot, SYS_PAUSE_CFG_PAUSE_ENA | |
| 2191 | 2195 | SYS_PAUSE_CFG_PAUSE_STOP(101) | |
| 2192 | 2196 | SYS_PAUSE_CFG_PAUSE_START(152), SYS_PAUSE_CFG, port); |
| 2193 | 2197 | |
| 2194 | 2198 | /* Tail dropping watermark */ |
| 2195 | − atop_wm = (ocelot->shared_queue_sz - 9 * mtu) / OCELOT_BUFFER_CELL_SZ; | |
| 2196 | − ocelot_write_rix(ocelot, ocelot_wm_enc(9 * mtu), | |
| 2199 | + atop_wm = (ocelot->shared_queue_sz - 9 * maxlen) / | |
| 2200 | + OCELOT_BUFFER_CELL_SZ; | |
| 2201 | + ocelot_write_rix(ocelot, ocelot_wm_enc(9 * maxlen), | |
| 2197 | 2202 | SYS_ATOP, port); |
| 2198 | 2203 | ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); |
| 2199 | 2204 | } |
| @@ -2222,9 +2227,10 @@ void ocelot_init_port(struct ocelot *ocelot, int port) · 22 unmodified lines | ||
| 2222 | 2227 | DEV_MAC_HDX_CFG); |
| 2223 | 2228 | |
| 2224 | 2229 | /* Set Max Length and maximum tags allowed */ |
| 2225 | − ocelot_port_set_mtu(ocelot, port, VLAN_ETH_FRAME_LEN); | |
| 2230 | + ocelot_port_set_maxlen(ocelot, port, ETH_DATA_LEN); | |
| 2226 | 2231 | ocelot_port_writel(ocelot_port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) | |
| 2227 | 2232 | DEV_MAC_TAGS_CFG_VLAN_AWR_ENA | |
| 2233 | + DEV_MAC_TAGS_CFG_VLAN_DBL_AWR_ENA | | |
| 2228 | 2234 | DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, |
| 2229 | 2235 | DEV_MAC_TAGS_CFG); |
| 2230 | 2236 | |
| @@ -2310,18 +2316,18 @@ void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu, · 79 unmodified lines | ||
| 2310 | 2316 | * Only one port can be an NPI at the same time. |
| 2311 | 2317 | */ |
| 2312 | 2318 | if (cpu < ocelot->num_phys_ports) { |
| 2313 | − int mtu = VLAN_ETH_FRAME_LEN + OCELOT_TAG_LEN; | |
| 2319 | + int sdu = ETH_DATA_LEN + OCELOT_TAG_LEN; | |
| 2314 | 2320 | |
| 2315 | 2321 | ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M | |
| 2316 | 2322 | QSYS_EXT_CPU_CFG_EXT_CPU_PORT(cpu), |
| 2317 | 2323 | QSYS_EXT_CPU_CFG); |
| 2318 | 2324 | |
| 2319 | 2325 | if (injection == OCELOT_TAG_PREFIX_SHORT) |
| 2320 | − mtu += OCELOT_SHORT_PREFIX_LEN; | |
| 2326 | + sdu += OCELOT_SHORT_PREFIX_LEN; | |
| 2321 | 2327 | else if (injection == OCELOT_TAG_PREFIX_LONG) |
| 2322 | − mtu += OCELOT_LONG_PREFIX_LEN; | |
| 2328 | + sdu += OCELOT_LONG_PREFIX_LEN; | |
| 2323 | 2329 | |
| 2324 | − ocelot_port_set_mtu(ocelot, cpu, mtu); | |
| 2330 | + ocelot_port_set_maxlen(ocelot, cpu, sdu); | |
| 2325 | 2331 | } |
| 2326 | 2332 | |
| 2327 | 2333 | /* CPU port Injection/Extraction configuration */ |
| @@ -1688,7 +1688,7 @@ static int ionic_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) · 1687 unmodified lines | ||
| 1688 | 1688 | if (!(is_zero_ether_addr(mac) || is_valid_ether_addr(mac))) |
| 1689 | 1689 | return -EINVAL; |
| 1690 | 1690 | |
| 1691 | − down_read(&ionic->vf_op_lock); | |
| 1691 | + down_write(&ionic->vf_op_lock); | |
| 1692 | 1692 | |
| 1693 | 1693 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { |
| 1694 | 1694 | ret = -EINVAL; |
| @@ -1698,7 +1698,7 @@ static int ionic_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) · 3 unmodified lines | ||
| 1698 | 1698 | ether_addr_copy(ionic->vfs[vf].macaddr, mac); |
| 1699 | 1699 | } |
| 1700 | 1700 | |
| 1701 | − up_read(&ionic->vf_op_lock); | |
| 1701 | + up_write(&ionic->vf_op_lock); | |
| 1702 | 1702 | return ret; |
| 1703 | 1703 | } |
| 1704 | 1704 | |
| @@ -1719,7 +1719,7 @@ static int ionic_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, · 14 unmodified lines | ||
| 1719 | 1719 | if (proto != htons(ETH_P_8021Q)) |
| 1720 | 1720 | return -EPROTONOSUPPORT; |
| 1721 | 1721 | |
| 1722 | − down_read(&ionic->vf_op_lock); | |
| 1722 | + down_write(&ionic->vf_op_lock); | |
| 1723 | 1723 | |
| 1724 | 1724 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { |
| 1725 | 1725 | ret = -EINVAL; |
| @@ -1730,7 +1730,7 @@ static int ionic_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, · 4 unmodified lines | ||
| 1730 | 1730 | ionic->vfs[vf].vlanid = vlan; |
| 1731 | 1731 | } |
| 1732 | 1732 | |
| 1733 | − up_read(&ionic->vf_op_lock); | |
| 1733 | + up_write(&ionic->vf_op_lock); | |
| 1734 | 1734 | return ret; |
| 1735 | 1735 | } |
| 1736 | 1736 | |
| @@ -2277,7 +2277,7 @@ static int __init sxgbe_cmdline_opt(char *str) · 2276 unmodified lines | ||
| 2277 | 2277 | if (!str || !*str) |
| 2278 | 2278 | return -EINVAL; |
| 2279 | 2279 | while ((opt = strsep(&str, ",")) != NULL) { |
| 2280 | − if (!strncmp(opt, "eee_timer:", 6)) { | |
| 2280 | + if (!strncmp(opt, "eee_timer:", 10)) { | |
| 2281 | 2281 | if (kstrtoint(opt + 10, 0, &eee_timer)) |
| 2282 | 2282 | goto err; |
| 2283 | 2283 | } |
| @@ -2853,11 +2853,24 @@ efx_ef10_handle_tx_event(struct efx_channel *channel, efx_qword_t *event) · 2852 unmodified lines | ||
| 2853 | 2853 | } |
| 2854 | 2854 | |
| 2855 | 2855 | /* Transmit timestamps are only available for 8XXX series. They result |
| 2856 | − * in three events per packet. These occur in order, and are: | |
| 2857 | − * - the normal completion event | |
| 2856 | + * in up to three events per packet. These occur in order, and are: | |
| 2857 | + * - the normal completion event (may be omitted) | |
| 2858 | 2858 | * - the low part of the timestamp |
| 2859 | 2859 | * - the high part of the timestamp |
| 2860 | 2860 | * |
| 2861 | + * It's possible for multiple completion events to appear before the | |
| 2862 | + * corresponding timestamps. So we can for example get: | |
| 2863 | + * COMP N | |
| 2864 | + * COMP N+1 | |
| 2865 | + * TS_LO N | |
| 2866 | + * TS_HI N | |
| 2867 | + * TS_LO N+1 | |
| 2868 | + * TS_HI N+1 | |
| 2869 | + * | |
| 2870 | + * In addition it's also possible for the adjacent completions to be | |
| 2871 | + * merged, so we may not see COMP N above. As such, the completion | |
| 2872 | + * events are not very useful here. | |
| 2873 | + * | |
| 2861 | 2874 | * Each part of the timestamp is itself split across two 16 bit |
| 2862 | 2875 | * fields in the event. |
| 2863 | 2876 | */ |
| @@ -2865,17 +2878,7 @@ efx_ef10_handle_tx_event(struct efx_channel *channel, efx_qword_t *event) · 1 unmodified line | ||
| 2865 | 2878 | |
| 2866 | 2879 | switch (tx_ev_type) { |
| 2867 | 2880 | case TX_TIMESTAMP_EVENT_TX_EV_COMPLETION: |
| 2868 | − /* In case of Queue flush or FLR, we might have received | |
| 2869 | − * the previous TX completion event but not the Timestamp | |
| 2870 | − * events. | |
| 2871 | − */ | |
| 2872 | − if (tx_queue->completed_desc_ptr != tx_queue->ptr_mask) | |
| 2873 | − efx_xmit_done(tx_queue, tx_queue->completed_desc_ptr); | |
| 2874 | − | |
| 2875 | − tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, | |
| 2876 | − ESF_DZ_TX_DESCR_INDX); | |
| 2877 | − tx_queue->completed_desc_ptr = | |
| 2878 | − tx_ev_desc_ptr & tx_queue->ptr_mask; | |
| 2881 | + /* Ignore this event - see above. */ | |
| 2879 | 2882 | break; |
| 2880 | 2883 | |
| 2881 | 2884 | case TX_TIMESTAMP_EVENT_TX_EV_TSTAMP_LO: |
| @@ -2887,8 +2890,7 @@ efx_ef10_handle_tx_event(struct efx_channel *channel, efx_qword_t *event) · 5 unmodified lines | ||
| 2887 | 2890 | ts_part = efx_ef10_extract_event_ts(event); |
| 2888 | 2891 | tx_queue->completed_timestamp_major = ts_part; |
| 2889 | 2892 | |
| 2890 | − efx_xmit_done(tx_queue, tx_queue->completed_desc_ptr); | |
| 2891 | − tx_queue->completed_desc_ptr = tx_queue->ptr_mask; | |
| 2893 | + efx_xmit_done_single(tx_queue); | |
| 2892 | 2894 | break; |
| 2893 | 2895 | |
| 2894 | 2896 | default: |
| @@ -20,6 +20,7 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, · 19 unmodified lines | ||
| 20 | 20 | struct net_device *net_dev); |
| 21 | 21 | netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); |
| 22 | 22 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); |
| 23 | +void efx_xmit_done_single(struct efx_tx_queue *tx_queue); | |
| 23 | 24 | int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type, |
| 24 | 25 | void *type_data); |
| 25 | 26 | extern unsigned int efx_piobuf_size; |
| @@ -583,6 +583,7 @@ struct efx_channel *efx_copy_channel(const struct efx_channel *old_channel) · 582 unmodified lines | ||
| 583 | 583 | if (tx_queue->channel) |
| 584 | 584 | tx_queue->channel = channel; |
| 585 | 585 | tx_queue->buffer = NULL; |
| 586 | + tx_queue->cb_page = NULL; | |
| 586 | 587 | memset(&tx_queue->txd, 0, sizeof(tx_queue->txd)); |
| 587 | 588 | } |
| 588 | 589 | |
| @@ -208,8 +208,6 @@ struct efx_tx_buffer { · 207 unmodified lines | ||
| 208 | 208 | * avoid cache-line ping-pong between the xmit path and the |
| 209 | 209 | * completion path. |
| 210 | 210 | * @merge_events: Number of TX merged completion events |
| 211 | − * @completed_desc_ptr: Most recent completed pointer - only used with | |
| 212 | − * timestamping. | |
| 213 | 211 | * @completed_timestamp_major: Top part of the most recent tx timestamp. |
| 214 | 212 | * @completed_timestamp_minor: Low part of the most recent tx timestamp. |
| 215 | 213 | * @insert_count: Current insert pointer |
| @@ -269,7 +267,6 @@ struct efx_tx_queue { · 53 unmodified lines | ||
| 269 | 267 | unsigned int merge_events; |
| 270 | 268 | unsigned int bytes_compl; |
| 271 | 269 | unsigned int pkts_compl; |
| 272 | − unsigned int completed_desc_ptr; | |
| 273 | 270 | u32 completed_timestamp_major; |
| 274 | 271 | u32 completed_timestamp_minor; |
| 275 | 272 | |
| @@ -535,6 +535,44 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, · 534 unmodified lines | ||
| 535 | 535 | return efx_enqueue_skb(tx_queue, skb); |
| 536 | 536 | } |
| 537 | 537 | |
| 538 | +void efx_xmit_done_single(struct efx_tx_queue *tx_queue) | |
| 539 | +{ | |
| 540 | + unsigned int pkts_compl = 0, bytes_compl = 0; | |
| 541 | + unsigned int read_ptr; | |
| 542 | + bool finished = false; | |
| 543 | + | |
| 544 | + read_ptr = tx_queue->read_count & tx_queue->ptr_mask; | |
| 545 | + | |
| 546 | + while (!finished) { | |
| 547 | + struct efx_tx_buffer *buffer = &tx_queue->buffer[read_ptr]; | |
| 548 | + | |
| 549 | + if (!efx_tx_buffer_in_use(buffer)) { | |
| 550 | + struct efx_nic *efx = tx_queue->efx; | |
| 551 | + | |
| 552 | + netif_err(efx, hw, efx->net_dev, | |
| 553 | + "TX queue %d spurious single TX completion\n", | |
| 554 | + tx_queue->queue); | |
| 555 | + efx_schedule_reset(efx, RESET_TYPE_TX_SKIP); | |
| 556 | + return; | |
| 557 | + } | |
| 558 | + | |
| 559 | + /* Need to check the flag before dequeueing. */ | |
| 560 | + if (buffer->flags & EFX_TX_BUF_SKB) | |
| 561 | + finished = true; | |
| 562 | + efx_dequeue_buffer(tx_queue, buffer, &pkts_compl, &bytes_compl); | |
| 563 | + | |
| 564 | + ++tx_queue->read_count; | |
| 565 | + read_ptr = tx_queue->read_count & tx_queue->ptr_mask; | |
| 566 | + } | |
| 567 | + | |
| 568 | + tx_queue->pkts_compl += pkts_compl; | |
| 569 | + tx_queue->bytes_compl += bytes_compl; | |
| 570 | + | |
| 571 | + EFX_WARN_ON_PARANOID(pkts_compl != 1); | |
| 572 | + | |
| 573 | + efx_xmit_done_check_empty(tx_queue); | |
| 574 | +} | |
| 575 | + | |
| 538 | 576 | void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue) |
| 539 | 577 | { |
| 540 | 578 | struct efx_nic *efx = tx_queue->efx; |
| @@ -80,7 +80,6 @@ void efx_init_tx_queue(struct efx_tx_queue *tx_queue) · 79 unmodified lines | ||
| 80 | 80 | tx_queue->xmit_more_available = false; |
| 81 | 81 | tx_queue->timestamping = (efx_ptp_use_mac_tx_timestamps(efx) && |
| 82 | 82 | tx_queue->channel == efx_ptp_channel(efx)); |
| 83 | − tx_queue->completed_desc_ptr = tx_queue->ptr_mask; | |
| 84 | 83 | tx_queue->completed_timestamp_major = 0; |
| 85 | 84 | tx_queue->completed_timestamp_minor = 0; |
| 86 | 85 | |
| @@ -210,10 +209,9 @@ static void efx_dequeue_buffers(struct efx_tx_queue *tx_queue, · 123 unmodified lines | ||
| 210 | 209 | while (read_ptr != stop_index) { |
| 211 | 210 | struct efx_tx_buffer *buffer = &tx_queue->buffer[read_ptr]; |
| 212 | 211 | |
| 213 | − if (!(buffer->flags & EFX_TX_BUF_OPTION) && | |
| 214 | − unlikely(buffer->len == 0)) { | |
| 212 | + if (!efx_tx_buffer_in_use(buffer)) { | |
| 215 | 213 | netif_err(efx, tx_err, efx->net_dev, |
| 216 | − "TX queue %d spurious TX completion id %x\n", | |
| 214 | + "TX queue %d spurious TX completion id %d\n", | |
| 217 | 215 | tx_queue->queue, read_ptr); |
| 218 | 216 | efx_schedule_reset(efx, RESET_TYPE_TX_SKIP); |
| 219 | 217 | return; |
| @@ -226,6 +224,19 @@ static void efx_dequeue_buffers(struct efx_tx_queue *tx_queue, · 6 unmodified lines | ||
| 226 | 224 | } |
| 227 | 225 | } |
| 228 | 226 | |
| 227 | +void efx_xmit_done_check_empty(struct efx_tx_queue *tx_queue) | |
| 228 | +{ | |
| 229 | + if ((int)(tx_queue->read_count - tx_queue->old_write_count) >= 0) { | |
| 230 | + tx_queue->old_write_count = READ_ONCE(tx_queue->write_count); | |
| 231 | + if (tx_queue->read_count == tx_queue->old_write_count) { | |
| 232 | + /* Ensure that read_count is flushed. */ | |
| 233 | + smp_mb(); | |
| 234 | + tx_queue->empty_read_count = | |
| 235 | + tx_queue->read_count | EFX_EMPTY_COUNT_VALID; | |
| 236 | + } | |
| 237 | + } | |
| 238 | +} | |
| 239 | + | |
| 229 | 240 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) |
| 230 | 241 | { |
| 231 | 242 | unsigned int fill_level, pkts_compl = 0, bytes_compl = 0; |
| @@ -256,15 +267,7 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) · 24 unmodified lines | ||
| 256 | 267 | netif_tx_wake_queue(tx_queue->core_txq); |
| 257 | 268 | } |
| 258 | 269 | |
| 259 | − /* Check whether the hardware queue is now empty */ | |
| 260 | − if ((int)(tx_queue->read_count - tx_queue->old_write_count) >= 0) { | |
| 261 | − tx_queue->old_write_count = READ_ONCE(tx_queue->write_count); | |
| 262 | − if (tx_queue->read_count == tx_queue->old_write_count) { | |
| 263 | − smp_mb(); | |
| 264 | − tx_queue->empty_read_count = | |
| 265 | − tx_queue->read_count | EFX_EMPTY_COUNT_VALID; | |
| 266 | − } | |
| 267 | − } | |
| 270 | + efx_xmit_done_check_empty(tx_queue); | |
| 268 | 271 | } |
| 269 | 272 | |
| 270 | 273 | /* Remove buffers put into a tx_queue for the current packet. |
| @@ -21,6 +21,12 @@ void efx_dequeue_buffer(struct efx_tx_queue *tx_queue, · 20 unmodified lines | ||
| 21 | 21 | unsigned int *pkts_compl, |
| 22 | 22 | unsigned int *bytes_compl); |
| 23 | 23 | |
| 24 | +static inline bool efx_tx_buffer_in_use(struct efx_tx_buffer *buffer) | |
| 25 | +{ | |
| 26 | + return buffer->len || (buffer->flags & EFX_TX_BUF_OPTION); | |
| 27 | +} | |
| 28 | + | |
| 29 | +void efx_xmit_done_check_empty(struct efx_tx_queue *tx_queue); | |
| 24 | 30 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); |
| 25 | 31 | |
| 26 | 32 | void efx_enqueue_unwind(struct efx_tx_queue *tx_queue, |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | static void dwmac1000_core_init(struct mac_device_info *hw, |
| 25 | 25 | struct net_device *dev) |
| 26 | 26 | { |
| 27 | + struct stmmac_priv *priv = netdev_priv(dev); | |
| 27 | 28 | void __iomem *ioaddr = hw->pcsr; |
| 28 | 29 | u32 value = readl(ioaddr + GMAC_CONTROL); |
| 29 | 30 | int mtu = dev->mtu; |
| @@ -35,7 +36,7 @@ static void dwmac1000_core_init(struct mac_device_info *hw, · 5 unmodified lines | ||
| 35 | 36 | * Broadcom tags can look like invalid LLC/SNAP packets and cause the |
| 36 | 37 | * hardware to truncate packets on reception. |
| 37 | 38 | */ |
| 38 | − if (netdev_uses_dsa(dev)) | |
| 39 | + if (netdev_uses_dsa(dev) || !priv->plat->enh_desc) | |
| 39 | 40 | value &= ~GMAC_CONTROL_ACS; |
| 40 | 41 | |
| 41 | 42 | if (mtu > 1500) |
| @@ -293,6 +293,7 @@ void ipvlan_process_multicast(struct work_struct *work) · 292 unmodified lines | ||
| 293 | 293 | } |
| 294 | 294 | if (dev) |
| 295 | 295 | dev_put(dev); |
| 296 | + cond_resched(); | |
| 296 | 297 | } |
| 297 | 298 | } |
| 298 | 299 | |
| @@ -498,19 +499,21 @@ static int ipvlan_process_outbound(struct sk_buff *skb) · 199 unmodified lines | ||
| 498 | 499 | struct ethhdr *ethh = eth_hdr(skb); |
| 499 | 500 | int ret = NET_XMIT_DROP; |
| 500 | 501 | |
| 501 | − /* In this mode we dont care about multicast and broadcast traffic */ | |
| 502 | − if (is_multicast_ether_addr(ethh->h_dest)) { | |
| 503 | − pr_debug_ratelimited("Dropped {multi|broad}cast of type=[%x]\n", | |
| 504 | − ntohs(skb->protocol)); | |
| 505 | − kfree_skb(skb); | |
| 506 | − goto out; | |
| 507 | − } | |
| 508 | − | |
| 509 | 502 | /* The ipvlan is a pseudo-L2 device, so the packets that we receive |
| 510 | 503 | * will have L2; which need to discarded and processed further |
| 511 | 504 | * in the net-ns of the main-device. |
| 512 | 505 | */ |
| 513 | 506 | if (skb_mac_header_was_set(skb)) { |
| 507 | + /* In this mode we dont care about | |
| 508 | + * multicast and broadcast traffic */ | |
| 509 | + if (is_multicast_ether_addr(ethh->h_dest)) { | |
| 510 | + pr_debug_ratelimited( | |
| 511 | + "Dropped {multi|broad}cast of type=[%x]\n", | |
| 512 | + ntohs(skb->protocol)); | |
| 513 | + kfree_skb(skb); | |
| 514 | + goto out; | |
| 515 | + } | |
| 516 | + | |
| 514 | 517 | skb_pull(skb, sizeof(*ethh)); |
| 515 | 518 | skb->mac_header = (typeof(skb->mac_header))~0U; |
| 516 | 519 | skb_reset_network_header(skb); |
| @@ -164,7 +164,6 @@ static void ipvlan_uninit(struct net_device *dev) · 163 unmodified lines | ||
| 164 | 164 | static int ipvlan_open(struct net_device *dev) |
| 165 | 165 | { |
| 166 | 166 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 167 | − struct net_device *phy_dev = ipvlan->phy_dev; | |
| 168 | 167 | struct ipvl_addr *addr; |
| 169 | 168 | |
| 170 | 169 | if (ipvlan->port->mode == IPVLAN_MODE_L3 || |
| @@ -178,7 +177,7 @@ static int ipvlan_open(struct net_device *dev) · 7 unmodified lines | ||
| 178 | 177 | ipvlan_ht_addr_add(ipvlan, addr); |
| 179 | 178 | rcu_read_unlock(); |
| 180 | 179 | |
| 181 | − return dev_uc_add(phy_dev, phy_dev->dev_addr); | |
| 180 | + return 0; | |
| 182 | 181 | } |
| 183 | 182 | |
| 184 | 183 | static int ipvlan_stop(struct net_device *dev) |
| @@ -190,8 +189,6 @@ static int ipvlan_stop(struct net_device *dev) · 5 unmodified lines | ||
| 190 | 189 | dev_uc_unsync(phy_dev, dev); |
| 191 | 190 | dev_mc_unsync(phy_dev, dev); |
| 192 | 191 | |
| 193 | − dev_uc_del(phy_dev, phy_dev->dev_addr); | |
| 194 | − | |
| 195 | 192 | rcu_read_lock(); |
| 196 | 193 | list_for_each_entry_rcu(addr, &ipvlan->addrs, anode) |
| 197 | 194 | ipvlan_ht_addr_del(addr); |
| @@ -424,6 +424,11 @@ static struct macsec_eth_header *macsec_ethhdr(struct sk_buff *skb) · 423 unmodified lines | ||
| 424 | 424 | return (struct macsec_eth_header *)skb_mac_header(skb); |
| 425 | 425 | } |
| 426 | 426 | |
| 427 | +static sci_t dev_to_sci(struct net_device *dev, __be16 port) | |
| 428 | +{ | |
| 429 | + return make_sci(dev->dev_addr, port); | |
| 430 | +} | |
| 431 | + | |
| 427 | 432 | static void __macsec_pn_wrapped(struct macsec_secy *secy, |
| 428 | 433 | struct macsec_tx_sa *tx_sa) |
| 429 | 434 | { |
| @@ -3268,6 +3273,20 @@ static int macsec_set_mac_address(struct net_device *dev, void *p) · 2838 unmodified lines | ||
| 3268 | 3273 | |
| 3269 | 3274 | out: |
| 3270 | 3275 | ether_addr_copy(dev->dev_addr, addr->sa_data); |
| 3276 | + macsec->secy.sci = dev_to_sci(dev, MACSEC_PORT_ES); | |
| 3277 | + | |
| 3278 | + /* If h/w offloading is available, propagate to the device */ | |
| 3279 | + if (macsec_is_offloaded(macsec)) { | |
| 3280 | + const struct macsec_ops *ops; | |
| 3281 | + struct macsec_context ctx; | |
| 3282 | + | |
| 3283 | + ops = macsec_get_ops(macsec, &ctx); | |
| 3284 | + if (ops) { | |
| 3285 | + ctx.secy = &macsec->secy; | |
| 3286 | + macsec_offload(ops->mdo_upd_secy, &ctx); | |
| 3287 | + } | |
| 3288 | + } | |
| 3289 | + | |
| 3271 | 3290 | return 0; |
| 3272 | 3291 | } |
| 3273 | 3292 | |
| @@ -3342,6 +3361,7 @@ static const struct device_type macsec_type = { · 68 unmodified lines | ||
| 3342 | 3361 | |
| 3343 | 3362 | static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = { |
| 3344 | 3363 | [IFLA_MACSEC_SCI] = { .type = NLA_U64 }, |
| 3364 | + [IFLA_MACSEC_PORT] = { .type = NLA_U16 }, | |
| 3345 | 3365 | [IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 }, |
| 3346 | 3366 | [IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 }, |
| 3347 | 3367 | [IFLA_MACSEC_WINDOW] = { .type = NLA_U32 }, |
| @@ -3592,11 +3612,6 @@ static bool sci_exists(struct net_device *dev, sci_t sci) · 244 unmodified lines | ||
| 3592 | 3612 | return false; |
| 3593 | 3613 | } |
| 3594 | 3614 | |
| 3595 | −static sci_t dev_to_sci(struct net_device *dev, __be16 port) | |
| 3596 | −{ | |
| 3597 | − return make_sci(dev->dev_addr, port); | |
| 3598 | −} | |
| 3599 | − | |
| 3600 | 3615 | static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len) |
| 3601 | 3616 | { |
| 3602 | 3617 | struct macsec_dev *macsec = macsec_priv(dev); |
| @@ -334,6 +334,8 @@ static void macvlan_process_broadcast(struct work_struct *w) · 333 unmodified lines | ||
| 334 | 334 | if (src) |
| 335 | 335 | dev_put(src->dev); |
| 336 | 336 | consume_skb(skb); |
| 337 | + | |
| 338 | + cond_resched(); | |
| 337 | 339 | } |
| 338 | 340 | } |
| 339 | 341 | |
| @@ -73,6 +73,7 @@ static struct phy_driver bcm63xx_driver[] = { · 72 unmodified lines | ||
| 73 | 73 | /* same phy as above, with just a different OUI */ |
| 74 | 74 | .phy_id = 0x002bdc00, |
| 75 | 75 | .phy_id_mask = 0xfffffc00, |
| 76 | + .name = "Broadcom BCM63XX (2)", | |
| 76 | 77 | /* PHY_BASIC_FEATURES */ |
| 77 | 78 | .flags = PHY_IS_INTERNAL, |
| 78 | 79 | .config_init = bcm63xx_config_init, |
| @@ -727,7 +727,8 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) · 726 unmodified lines | ||
| 727 | 727 | phy_trigger_machine(phydev); |
| 728 | 728 | } |
| 729 | 729 | |
| 730 | − if (phy_clear_interrupt(phydev)) | |
| 730 | + /* did_interrupt() may have cleared the interrupt already */ | |
| 731 | + if (!phydev->drv->did_interrupt && phy_clear_interrupt(phydev)) | |
| 731 | 732 | goto phy_err; |
| 732 | 733 | return IRQ_HANDLED; |
| 733 | 734 | |
| @@ -286,6 +286,8 @@ static int mdio_bus_phy_suspend(struct device *dev) · 285 unmodified lines | ||
| 286 | 286 | if (!mdio_bus_phy_may_suspend(phydev)) |
| 287 | 287 | return 0; |
| 288 | 288 | |
| 289 | + phydev->suspended_by_mdio_bus = 1; | |
| 290 | + | |
| 289 | 291 | return phy_suspend(phydev); |
| 290 | 292 | } |
| 291 | 293 | |
| @@ -294,9 +296,11 @@ static int mdio_bus_phy_resume(struct device *dev) · 2 unmodified lines | ||
| 294 | 296 | struct phy_device *phydev = to_phy_device(dev); |
| 295 | 297 | int ret; |
| 296 | 298 | |
| 297 | − if (!mdio_bus_phy_may_suspend(phydev)) | |
| 299 | + if (!phydev->suspended_by_mdio_bus) | |
| 298 | 300 | goto no_resume; |
| 299 | 301 | |
| 302 | + phydev->suspended_by_mdio_bus = 0; | |
| 303 | + | |
| 300 | 304 | ret = phy_resume(phydev); |
| 301 | 305 | if (ret < 0) |
| 302 | 306 | return ret; |
| @@ -761,8 +761,14 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, · 760 unmodified lines | ||
| 761 | 761 | config.interface = interface; |
| 762 | 762 | |
| 763 | 763 | ret = phylink_validate(pl, supported, &config); |
| 764 | − if (ret) | |
| 764 | + if (ret) { | |
| 765 | + phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %d\n", | |
| 766 | + phy_modes(config.interface), | |
| 767 | + __ETHTOOL_LINK_MODE_MASK_NBITS, phy->supported, | |
| 768 | + __ETHTOOL_LINK_MODE_MASK_NBITS, config.advertising, | |
| 769 | + ret); | |
| 765 | 770 | return ret; |
| 771 | + } | |
| 766 | 772 | |
| 767 | 773 | phy->phylink = pl; |
| 768 | 774 | phy->phy_link_change = phylink_phy_change; |
| @@ -232,7 +232,7 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize, · 231 unmodified lines | ||
| 232 | 232 | struct cstate *cs = lcs->next; |
| 233 | 233 | unsigned long deltaS, deltaA; |
| 234 | 234 | short changes = 0; |
| 235 | − int hlen; | |
| 235 | + int nlen, hlen; | |
| 236 | 236 | unsigned char new_seq[16]; |
| 237 | 237 | unsigned char *cp = new_seq; |
| 238 | 238 | struct iphdr *ip; |
| @@ -248,6 +248,8 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize, · 9 unmodified lines | ||
| 248 | 248 | return isize; |
| 249 | 249 | |
| 250 | 250 | ip = (struct iphdr *) icp; |
| 251 | + if (ip->version != 4 || ip->ihl < 5) | |
| 252 | + return isize; | |
| 251 | 253 | |
| 252 | 254 | /* Bail if this packet isn't TCP, or is an IP fragment */ |
| 253 | 255 | if (ip->protocol != IPPROTO_TCP || (ntohs(ip->frag_off) & 0x3fff)) { |
| @@ -258,10 +260,14 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize, · 4 unmodified lines | ||
| 258 | 260 | comp->sls_o_tcp++; |
| 259 | 261 | return isize; |
| 260 | 262 | } |
| 261 | − /* Extract TCP header */ | |
| 263 | + nlen = ip->ihl * 4; | |
| 264 | + if (isize < nlen + sizeof(*th)) | |
| 265 | + return isize; | |
| 262 | 266 | |
| 263 | − th = (struct tcphdr *)(((unsigned char *)ip) + ip->ihl*4); | |
| 264 | − hlen = ip->ihl*4 + th->doff*4; | |
| 267 | + th = (struct tcphdr *)(icp + nlen); | |
| 268 | + if (th->doff < sizeof(struct tcphdr) / 4) | |
| 269 | + return isize; | |
| 270 | + hlen = nlen + th->doff * 4; | |
| 265 | 271 | |
| 266 | 272 | /* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or |
| 267 | 273 | * some other control bit is set). Also uncompressible if |
| @@ -2240,6 +2240,8 @@ team_nl_option_policy[TEAM_ATTR_OPTION_MAX + 1] = { · 2239 unmodified lines | ||
| 2240 | 2240 | [TEAM_ATTR_OPTION_CHANGED] = { .type = NLA_FLAG }, |
| 2241 | 2241 | [TEAM_ATTR_OPTION_TYPE] = { .type = NLA_U8 }, |
| 2242 | 2242 | [TEAM_ATTR_OPTION_DATA] = { .type = NLA_BINARY }, |
| 2243 | + [TEAM_ATTR_OPTION_PORT_IFINDEX] = { .type = NLA_U32 }, | |
| 2244 | + [TEAM_ATTR_OPTION_ARRAY_INDEX] = { .type = NLA_U32 }, | |
| 2243 | 2245 | }; |
| 2244 | 2246 | |
| 2245 | 2247 | static int team_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info) |
| @@ -3221,6 +3221,8 @@ static u16 r8153_phy_status(struct r8152 *tp, u16 desired) · 3220 unmodified lines | ||
| 3221 | 3221 | } |
| 3222 | 3222 | |
| 3223 | 3223 | msleep(20); |
| 3224 | + if (test_bit(RTL8152_UNPLUG, &tp->flags)) | |
| 3225 | + break; | |
| 3224 | 3226 | } |
| 3225 | 3227 | |
| 3226 | 3228 | return data; |
| @@ -5402,7 +5404,10 @@ static void r8153_init(struct r8152 *tp) · 2175 unmodified lines | ||
| 5402 | 5404 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & |
| 5403 | 5405 | AUTOLOAD_DONE) |
| 5404 | 5406 | break; |
| 5407 | + | |
| 5405 | 5408 | msleep(20); |
| 5409 | + if (test_bit(RTL8152_UNPLUG, &tp->flags)) | |
| 5410 | + break; | |
| 5406 | 5411 | } |
| 5407 | 5412 | |
| 5408 | 5413 | data = r8153_phy_status(tp, 0); |
| @@ -5539,7 +5544,10 @@ static void r8153b_init(struct r8152 *tp) · 130 unmodified lines | ||
| 5539 | 5544 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & |
| 5540 | 5545 | AUTOLOAD_DONE) |
| 5541 | 5546 | break; |
| 5547 | + | |
| 5542 | 5548 | msleep(20); |
| 5549 | + if (test_bit(RTL8152_UNPLUG, &tp->flags)) | |
| 5550 | + break; | |
| 5543 | 5551 | } |
| 5544 | 5552 | |
| 5545 | 5553 | data = r8153_phy_status(tp, 0); |
| @@ -328,7 +328,7 @@ static void veth_get_stats64(struct net_device *dev, · 327 unmodified lines | ||
| 328 | 328 | rcu_read_lock(); |
| 329 | 329 | peer = rcu_dereference(priv->peer); |
| 330 | 330 | if (peer) { |
| 331 | − tot->rx_dropped += veth_stats_tx(peer, &packets, &bytes); | |
| 331 | + veth_stats_tx(peer, &packets, &bytes); | |
| 332 | 332 | tot->rx_bytes += bytes; |
| 333 | 333 | tot->rx_packets += packets; |
| 334 | 334 | |
| @@ -308,7 +308,8 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm) · 307 unmodified lines | ||
| 308 | 308 | } |
| 309 | 309 | |
| 310 | 310 | /* PHY_SKU section is mandatory in B0 */ |
| 311 | − if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { | |
| 311 | + if (mvm->trans->cfg->nvm_type == IWL_NVM_EXT && | |
| 312 | + !mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { | |
| 312 | 313 | IWL_ERR(mvm, |
| 313 | 314 | "Can't parse phy_sku in B0, empty sections\n"); |
| 314 | 315 | return NULL; |
| @@ -447,10 +447,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, · 446 unmodified lines | ||
| 447 | 447 | struct page *page = virt_to_head_page(data); |
| 448 | 448 | int offset = data - page_address(page); |
| 449 | 449 | struct sk_buff *skb = q->rx_head; |
| 450 | + struct skb_shared_info *shinfo = skb_shinfo(skb); | |
| 450 | 451 | |
| 451 | − offset += q->buf_offset; | |
| 452 | − skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len, | |
| 453 | − q->buf_size); | |
| 452 | + if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) { | |
| 453 | + offset += q->buf_offset; | |
| 454 | + skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len, | |
| 455 | + q->buf_size); | |
| 456 | + } | |
| 454 | 457 | |
| 455 | 458 | if (more) |
| 456 | 459 | return; |
| @@ -850,9 +850,11 @@ out_free_tagset: · 849 unmodified lines | ||
| 850 | 850 | if (new) |
| 851 | 851 | blk_mq_free_tag_set(ctrl->ctrl.admin_tagset); |
| 852 | 852 | out_free_async_qe: |
| 853 | − nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, | |
| 854 | − sizeof(struct nvme_command), DMA_TO_DEVICE); | |
| 855 | − ctrl->async_event_sqe.data = NULL; | |
| 853 | + if (ctrl->async_event_sqe.data) { | |
| 854 | + nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, | |
| 855 | + sizeof(struct nvme_command), DMA_TO_DEVICE); | |
| 856 | + ctrl->async_event_sqe.data = NULL; | |
| 857 | + } | |
| 856 | 858 | out_free_queue: |
| 857 | 859 | nvme_rdma_free_queue(&ctrl->queues[0]); |
| 858 | 860 | return error; |
| @@ -515,7 +515,7 @@ static int nvmet_try_send_data_pdu(struct nvmet_tcp_cmd *cmd) · 514 unmodified lines | ||
| 515 | 515 | return 1; |
| 516 | 516 | } |
| 517 | 517 | |
| 518 | −static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd) | |
| 518 | +static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd, bool last_in_batch) | |
| 519 | 519 | { |
| 520 | 520 | struct nvmet_tcp_queue *queue = cmd->queue; |
| 521 | 521 | int ret; |
| @@ -523,9 +523,15 @@ static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd) · 1 unmodified line | ||
| 523 | 523 | while (cmd->cur_sg) { |
| 524 | 524 | struct page *page = sg_page(cmd->cur_sg); |
| 525 | 525 | u32 left = cmd->cur_sg->length - cmd->offset; |
| 526 | + int flags = MSG_DONTWAIT; | |
| 527 | + | |
| 528 | + if ((!last_in_batch && cmd->queue->send_list_len) || | |
| 529 | + cmd->wbytes_done + left < cmd->req.transfer_len || | |
| 530 | + queue->data_digest || !queue->nvme_sq.sqhd_disabled) | |
| 531 | + flags |= MSG_MORE; | |
| 526 | 532 | |
| 527 | 533 | ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset, |
| 528 | − left, MSG_DONTWAIT | MSG_MORE); | |
| 534 | + left, flags); | |
| 529 | 535 | if (ret <= 0) |
| 530 | 536 | return ret; |
| 531 | 537 | |
| @@ -660,7 +666,7 @@ static int nvmet_tcp_try_send_one(struct nvmet_tcp_queue *queue, · 128 unmodified lines | ||
| 660 | 666 | } |
| 661 | 667 | |
| 662 | 668 | if (cmd->state == NVMET_TCP_SEND_DATA) { |
| 663 | − ret = nvmet_try_send_data(cmd); | |
| 669 | + ret = nvmet_try_send_data(cmd, last_in_batch); | |
| 664 | 670 | if (ret <= 0) |
| 665 | 671 | goto done_send; |
| 666 | 672 | } |
| @@ -306,6 +306,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) · 305 unmodified lines | ||
| 306 | 306 | rc = of_mdiobus_register_phy(mdio, child, addr); |
| 307 | 307 | if (rc && rc != -ENODEV) |
| 308 | 308 | goto unregister; |
| 309 | + break; | |
| 309 | 310 | } |
| 310 | 311 | } |
| 311 | 312 | } |
| @@ -1073,13 +1073,26 @@ static int madera_pin_probe(struct platform_device *pdev) · 1072 unmodified lines | ||
| 1073 | 1073 | return ret; |
| 1074 | 1074 | } |
| 1075 | 1075 | |
| 1076 | + platform_set_drvdata(pdev, priv); | |
| 1077 | + | |
| 1076 | 1078 | dev_dbg(priv->dev, "pinctrl probed ok\n"); |
| 1077 | 1079 | |
| 1078 | 1080 | return 0; |
| 1079 | 1081 | } |
| 1080 | 1082 | |
| 1083 | +static int madera_pin_remove(struct platform_device *pdev) | |
| 1084 | +{ | |
| 1085 | + struct madera_pin_private *priv = platform_get_drvdata(pdev); | |
| 1086 | + | |
| 1087 | + if (priv->madera->pdata.gpio_configs) | |
| 1088 | + pinctrl_unregister_mappings(priv->madera->pdata.gpio_configs); | |
| 1089 | + | |
| 1090 | + return 0; | |
| 1091 | +} | |
| 1092 | + | |
| 1081 | 1093 | static struct platform_driver madera_pin_driver = { |
| 1082 | 1094 | .probe = madera_pin_probe, |
| 1095 | + .remove = madera_pin_remove, | |
| 1083 | 1096 | .driver = { |
| 1084 | 1097 | .name = "madera-pinctrl", |
| 1085 | 1098 | }, |
| @@ -2021,7 +2021,6 @@ static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev) · 2020 unmodified lines | ||
| 2021 | 2021 | return PTR_ERR(pctldev->p); |
| 2022 | 2022 | } |
| 2023 | 2023 | |
| 2024 | − kref_get(&pctldev->p->users); | |
| 2025 | 2024 | pctldev->hog_default = |
| 2026 | 2025 | pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); |
| 2027 | 2026 | if (IS_ERR(pctldev->hog_default)) { |
| @@ -23,12 +23,12 @@ struct imx_sc_msg_req_pad_set { · 22 unmodified lines | ||
| 23 | 23 | struct imx_sc_rpc_msg hdr; |
| 24 | 24 | u32 val; |
| 25 | 25 | u16 pad; |
| 26 | −} __packed; | |
| 26 | +} __packed __aligned(4); | |
| 27 | 27 | |
| 28 | 28 | struct imx_sc_msg_req_pad_get { |
| 29 | 29 | struct imx_sc_rpc_msg hdr; |
| 30 | 30 | u16 pad; |
| 31 | −} __packed; | |
| 31 | +} __packed __aligned(4); | |
| 32 | 32 | |
| 33 | 33 | struct imx_sc_msg_resp_pad_get { |
| 34 | 34 | struct imx_sc_rpc_msg hdr; |
| @@ -147,8 +147,8 @@ static const unsigned int sdio_d0_pins[] = { GPIOX_0 }; · 146 unmodified lines | ||
| 147 | 147 | static const unsigned int sdio_d1_pins[] = { GPIOX_1 }; |
| 148 | 148 | static const unsigned int sdio_d2_pins[] = { GPIOX_2 }; |
| 149 | 149 | static const unsigned int sdio_d3_pins[] = { GPIOX_3 }; |
| 150 | −static const unsigned int sdio_cmd_pins[] = { GPIOX_4 }; | |
| 151 | −static const unsigned int sdio_clk_pins[] = { GPIOX_5 }; | |
| 150 | +static const unsigned int sdio_clk_pins[] = { GPIOX_4 }; | |
| 151 | +static const unsigned int sdio_cmd_pins[] = { GPIOX_5 }; | |
| 152 | 152 | static const unsigned int sdio_irq_pins[] = { GPIOX_7 }; |
| 153 | 153 | |
| 154 | 154 | static const unsigned int nand_ce0_pins[] = { BOOT_8 }; |
| @@ -451,7 +451,7 @@ static int pinctrl_falcon_probe(struct platform_device *pdev) · 450 unmodified lines | ||
| 451 | 451 | falcon_info.clk[*bank] = clk_get(&ppdev->dev, NULL); |
| 452 | 452 | if (IS_ERR(falcon_info.clk[*bank])) { |
| 453 | 453 | dev_err(&ppdev->dev, "failed to get clock\n"); |
| 454 | − of_node_put(np) | |
| 454 | + of_node_put(np); | |
| 455 | 455 | return PTR_ERR(falcon_info.clk[*bank]); |
| 456 | 456 | } |
| 457 | 457 | falcon_info.membase[*bank] = devm_ioremap_resource(&pdev->dev, |
| @@ -1104,7 +1104,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) · 1103 unmodified lines | ||
| 1104 | 1104 | pctrl->irq_chip.irq_mask = msm_gpio_irq_mask; |
| 1105 | 1105 | pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask; |
| 1106 | 1106 | pctrl->irq_chip.irq_ack = msm_gpio_irq_ack; |
| 1107 | − pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent; | |
| 1108 | 1107 | pctrl->irq_chip.irq_set_type = msm_gpio_irq_set_type; |
| 1109 | 1108 | pctrl->irq_chip.irq_set_wake = msm_gpio_irq_set_wake; |
| 1110 | 1109 | pctrl->irq_chip.irq_request_resources = msm_gpio_irq_reqres; |
| @@ -1118,7 +1117,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) · 7 unmodified lines | ||
| 1118 | 1117 | if (!chip->irq.parent_domain) |
| 1119 | 1118 | return -EPROBE_DEFER; |
| 1120 | 1119 | chip->irq.child_to_parent_hwirq = msm_gpio_wakeirq; |
| 1121 | − | |
| 1120 | + pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent; | |
| 1122 | 1121 | /* |
| 1123 | 1122 | * Let's skip handling the GPIOs, if the parent irqchip |
| 1124 | 1123 | * is handling the direct connect IRQ of the GPIO. |
| @@ -794,7 +794,7 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev) · 793 unmodified lines | ||
| 794 | 794 | girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node); |
| 795 | 795 | girq->parent_domain = parent_domain; |
| 796 | 796 | girq->child_to_parent_hwirq = pm8xxx_child_to_parent_hwirq; |
| 797 | − girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_fourcell; | |
| 797 | + girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_twocell; | |
| 798 | 798 | girq->child_offset_to_irq = pm8xxx_child_offset_to_irq; |
| 799 | 799 | girq->child_irq_domain_ops.translate = pm8xxx_domain_translate; |
| 800 | 800 | |
| @@ -327,6 +327,7 @@ config RTC_DRV_MAX6900 · 326 unmodified lines | ||
| 327 | 327 | config RTC_DRV_MAX8907 |
| 328 | 328 | tristate "Maxim MAX8907" |
| 329 | 329 | depends on MFD_MAX8907 || COMPILE_TEST |
| 330 | + select REGMAP_IRQ | |
| 330 | 331 | help |
| 331 | 332 | If you say yes here you will get support for the |
| 332 | 333 | RTC of Maxim MAX8907 PMIC. |
| @@ -178,6 +178,8 @@ struct dasd_block *dasd_alloc_block(void) · 177 unmodified lines | ||
| 178 | 178 | (unsigned long) block); |
| 179 | 179 | INIT_LIST_HEAD(&block->ccw_queue); |
| 180 | 180 | spin_lock_init(&block->queue_lock); |
| 181 | + INIT_LIST_HEAD(&block->format_list); | |
| 182 | + spin_lock_init(&block->format_lock); | |
| 181 | 183 | timer_setup(&block->timer, dasd_block_timeout, 0); |
| 182 | 184 | spin_lock_init(&block->profile.lock); |
| 183 | 185 | |
| @@ -1779,20 +1781,26 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, · 1595 unmodified lines | ||
| 1779 | 1781 | |
| 1780 | 1782 | if (dasd_ese_needs_format(cqr->block, irb)) { |
| 1781 | 1783 | if (rq_data_dir((struct request *)cqr->callback_data) == READ) { |
| 1782 | − device->discipline->ese_read(cqr); | |
| 1784 | + device->discipline->ese_read(cqr, irb); | |
| 1783 | 1785 | cqr->status = DASD_CQR_SUCCESS; |
| 1784 | 1786 | cqr->stopclk = now; |
| 1785 | 1787 | dasd_device_clear_timer(device); |
| 1786 | 1788 | dasd_schedule_device_bh(device); |
| 1787 | 1789 | return; |
| 1788 | 1790 | } |
| 1789 | − fcqr = device->discipline->ese_format(device, cqr); | |
| 1791 | + fcqr = device->discipline->ese_format(device, cqr, irb); | |
| 1790 | 1792 | if (IS_ERR(fcqr)) { |
| 1793 | + if (PTR_ERR(fcqr) == -EINVAL) { | |
| 1794 | + cqr->status = DASD_CQR_ERROR; | |
| 1795 | + return; | |
| 1796 | + } | |
| 1791 | 1797 | /* |
| 1792 | 1798 | * If we can't format now, let the request go |
| 1793 | 1799 | * one extra round. Maybe we can format later. |
| 1794 | 1800 | */ |
| 1795 | 1801 | cqr->status = DASD_CQR_QUEUED; |
| 1802 | + dasd_schedule_device_bh(device); | |
| 1803 | + return; | |
| 1796 | 1804 | } else { |
| 1797 | 1805 | fcqr->status = DASD_CQR_QUEUED; |
| 1798 | 1806 | cqr->status = DASD_CQR_QUEUED; |
| @@ -2748,11 +2756,13 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) · 949 unmodified lines | ||
| 2748 | 2756 | { |
| 2749 | 2757 | struct request *req; |
| 2750 | 2758 | blk_status_t error = BLK_STS_OK; |
| 2759 | + unsigned int proc_bytes; | |
| 2751 | 2760 | int status; |
| 2752 | 2761 | |
| 2753 | 2762 | req = (struct request *) cqr->callback_data; |
| 2754 | 2763 | dasd_profile_end(cqr->block, cqr, req); |
| 2755 | 2764 | |
| 2765 | + proc_bytes = cqr->proc_bytes; | |
| 2756 | 2766 | status = cqr->block->base->discipline->free_cp(cqr, req); |
| 2757 | 2767 | if (status < 0) |
| 2758 | 2768 | error = errno_to_blk_status(status); |
| @@ -2783,7 +2793,18 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) · 24 unmodified lines | ||
| 2783 | 2793 | blk_mq_end_request(req, error); |
| 2784 | 2794 | blk_mq_run_hw_queues(req->q, true); |
| 2785 | 2795 | } else { |
| 2786 | − blk_mq_complete_request(req); | |
| 2796 | + /* | |
| 2797 | + * Partial completed requests can happen with ESE devices. | |
| 2798 | + * During read we might have gotten a NRF error and have to | |
| 2799 | + * complete a request partially. | |
| 2800 | + */ | |
| 2801 | + if (proc_bytes) { | |
| 2802 | + blk_update_request(req, BLK_STS_OK, | |
| 2803 | + blk_rq_bytes(req) - proc_bytes); | |
| 2804 | + blk_mq_requeue_request(req, true); | |
| 2805 | + } else { | |
| 2806 | + blk_mq_complete_request(req); | |
| 2807 | + } | |
| 2787 | 2808 | } |
| 2788 | 2809 | } |
| 2789 | 2810 | |
| @@ -207,6 +207,45 @@ static void set_ch_t(struct ch_t *geo, __u32 cyl, __u8 head) · 206 unmodified lines | ||
| 207 | 207 | geo->head |= head; |
| 208 | 208 | } |
| 209 | 209 | |
| 210 | +/* | |
| 211 | + * calculate failing track from sense data depending if | |
| 212 | + * it is an EAV device or not | |
| 213 | + */ | |
| 214 | +static int dasd_eckd_track_from_irb(struct irb *irb, struct dasd_device *device, | |
| 215 | + sector_t *track) | |
| 216 | +{ | |
| 217 | + struct dasd_eckd_private *private = device->private; | |
| 218 | + u8 *sense = NULL; | |
| 219 | + u32 cyl; | |
| 220 | + u8 head; | |
| 221 | + | |
| 222 | + sense = dasd_get_sense(irb); | |
| 223 | + if (!sense) { | |
| 224 | + DBF_DEV_EVENT(DBF_WARNING, device, "%s", | |
| 225 | + "ESE error no sense data\n"); | |
| 226 | + return -EINVAL; | |
| 227 | + } | |
| 228 | + if (!(sense[27] & DASD_SENSE_BIT_2)) { | |
| 229 | + DBF_DEV_EVENT(DBF_WARNING, device, "%s", | |
| 230 | + "ESE error no valid track data\n"); | |
| 231 | + return -EINVAL; | |
| 232 | + } | |
| 233 | + | |
| 234 | + if (sense[27] & DASD_SENSE_BIT_3) { | |
| 235 | + /* enhanced addressing */ | |
| 236 | + cyl = sense[30] << 20; | |
| 237 | + cyl |= (sense[31] & 0xF0) << 12; | |
| 238 | + cyl |= sense[28] << 8; | |
| 239 | + cyl |= sense[29]; | |
| 240 | + } else { | |
| 241 | + cyl = sense[29] << 8; | |
| 242 | + cyl |= sense[30]; | |
| 243 | + } | |
| 244 | + head = sense[31] & 0x0F; | |
| 245 | + *track = cyl * private->rdc_data.trk_per_cyl + head; | |
| 246 | + return 0; | |
| 247 | +} | |
| 248 | + | |
| 210 | 249 | static int set_timestamp(struct ccw1 *ccw, struct DE_eckd_data *data, |
| 211 | 250 | struct dasd_device *device) |
| 212 | 251 | { |
| @@ -2986,6 +3025,37 @@ static int dasd_eckd_format_device(struct dasd_device *base, · 2773 unmodified lines | ||
| 2986 | 3025 | 0, NULL); |
| 2987 | 3026 | } |
| 2988 | 3027 | |
| 3028 | +static bool test_and_set_format_track(struct dasd_format_entry *to_format, | |
| 3029 | + struct dasd_block *block) | |
| 3030 | +{ | |
| 3031 | + struct dasd_format_entry *format; | |
| 3032 | + unsigned long flags; | |
| 3033 | + bool rc = false; | |
| 3034 | + | |
| 3035 | + spin_lock_irqsave(&block->format_lock, flags); | |
| 3036 | + list_for_each_entry(format, &block->format_list, list) { | |
| 3037 | + if (format->track == to_format->track) { | |
| 3038 | + rc = true; | |
| 3039 | + goto out; | |
| 3040 | + } | |
| 3041 | + } | |
| 3042 | + list_add_tail(&to_format->list, &block->format_list); | |
| 3043 | + | |
| 3044 | +out: | |
| 3045 | + spin_unlock_irqrestore(&block->format_lock, flags); | |
| 3046 | + return rc; | |
| 3047 | +} | |
| 3048 | + | |
| 3049 | +static void clear_format_track(struct dasd_format_entry *format, | |
| 3050 | + struct dasd_block *block) | |
| 3051 | +{ | |
| 3052 | + unsigned long flags; | |
| 3053 | + | |
| 3054 | + spin_lock_irqsave(&block->format_lock, flags); | |
| 3055 | + list_del_init(&format->list); | |
| 3056 | + spin_unlock_irqrestore(&block->format_lock, flags); | |
| 3057 | +} | |
| 3058 | + | |
| 2989 | 3059 | /* |
| 2990 | 3060 | * Callback function to free ESE format requests. |
| 2991 | 3061 | */ |
| @@ -2993,15 +3063,19 @@ static void dasd_eckd_ese_format_cb(struct dasd_ccw_req *cqr, void *data) · 1 unmodified line | ||
| 2993 | 3063 | { |
| 2994 | 3064 | struct dasd_device *device = cqr->startdev; |
| 2995 | 3065 | struct dasd_eckd_private *private = device->private; |
| 3066 | + struct dasd_format_entry *format = data; | |
| 2996 | 3067 | |
| 3068 | + clear_format_track(format, cqr->basedev->block); | |
| 2997 | 3069 | private->count--; |
| 2998 | 3070 | dasd_ffree_request(cqr, device); |
| 2999 | 3071 | } |
| 3000 | 3072 | |
| 3001 | 3073 | static struct dasd_ccw_req * |
| 3002 | −dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr) | |
| 3074 | +dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr, | |
| 3075 | + struct irb *irb) | |
| 3003 | 3076 | { |
| 3004 | 3077 | struct dasd_eckd_private *private; |
| 3078 | + struct dasd_format_entry *format; | |
| 3005 | 3079 | struct format_data_t fdata; |
| 3006 | 3080 | unsigned int recs_per_trk; |
| 3007 | 3081 | struct dasd_ccw_req *fcqr; |
| @@ -3011,23 +3085,39 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr) · 3 unmodified lines | ||
| 3011 | 3085 | struct request *req; |
| 3012 | 3086 | sector_t first_trk; |
| 3013 | 3087 | sector_t last_trk; |
| 3088 | + sector_t curr_trk; | |
| 3014 | 3089 | int rc; |
| 3015 | 3090 | |
| 3016 | 3091 | req = cqr->callback_data; |
| 3017 | − base = cqr->block->base; | |
| 3092 | + block = cqr->block; | |
| 3093 | + base = block->base; | |
| 3018 | 3094 | private = base->private; |
| 3019 | − block = base->block; | |
| 3020 | 3095 | blksize = block->bp_block; |
| 3021 | 3096 | recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); |
| 3097 | + format = &startdev->format_entry; | |
| 3022 | 3098 | |
| 3023 | 3099 | first_trk = blk_rq_pos(req) >> block->s2b_shift; |
| 3024 | 3100 | sector_div(first_trk, recs_per_trk); |
| 3025 | 3101 | last_trk = |
| 3026 | 3102 | (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; |
| 3027 | 3103 | sector_div(last_trk, recs_per_trk); |
| 3104 | + rc = dasd_eckd_track_from_irb(irb, base, &curr_trk); | |
| 3105 | + if (rc) | |
| 3106 | + return ERR_PTR(rc); | |
| 3028 | 3107 | |
| 3029 | − fdata.start_unit = first_trk; | |
| 3030 | − fdata.stop_unit = last_trk; | |
| 3108 | + if (curr_trk < first_trk || curr_trk > last_trk) { | |
| 3109 | + DBF_DEV_EVENT(DBF_WARNING, startdev, | |
| 3110 | + "ESE error track %llu not within range %llu - %llu\n", | |
| 3111 | + curr_trk, first_trk, last_trk); | |
| 3112 | + return ERR_PTR(-EINVAL); | |
| 3113 | + } | |
| 3114 | + format->track = curr_trk; | |
| 3115 | + /* test if track is already in formatting by another thread */ | |
| 3116 | + if (test_and_set_format_track(format, block)) | |
| 3117 | + return ERR_PTR(-EEXIST); | |
| 3118 | + | |
| 3119 | + fdata.start_unit = curr_trk; | |
| 3120 | + fdata.stop_unit = curr_trk; | |
| 3031 | 3121 | fdata.blksize = blksize; |
| 3032 | 3122 | fdata.intensity = private->uses_cdl ? DASD_FMT_INT_COMPAT : 0; |
| 3033 | 3123 | |
| @@ -3044,6 +3134,7 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr) · 10 unmodified lines | ||
| 3044 | 3134 | return fcqr; |
| 3045 | 3135 | |
| 3046 | 3136 | fcqr->callback = dasd_eckd_ese_format_cb; |
| 3137 | + fcqr->callback_data = (void *) format; | |
| 3047 | 3138 | |
| 3048 | 3139 | return fcqr; |
| 3049 | 3140 | } |
| @@ -3051,29 +3142,87 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr) · 1 unmodified line | ||
| 3051 | 3142 | /* |
| 3052 | 3143 | * When data is read from an unformatted area of an ESE volume, this function |
| 3053 | 3144 | * returns zeroed data and thereby mimics a read of zero data. |
| 3145 | + * | |
| 3146 | + * The first unformatted track is the one that got the NRF error, the address is | |
| 3147 | + * encoded in the sense data. | |
| 3148 | + * | |
| 3149 | + * All tracks before have returned valid data and should not be touched. | |
| 3150 | + * All tracks after the unformatted track might be formatted or not. This is | |
| 3151 | + * currently not known, remember the processed data and return the remainder of | |
| 3152 | + * the request to the blocklayer in __dasd_cleanup_cqr(). | |
| 3054 | 3153 | */ |
| 3055 | −static void dasd_eckd_ese_read(struct dasd_ccw_req *cqr) | |
| 3154 | +static int dasd_eckd_ese_read(struct dasd_ccw_req *cqr, struct irb *irb) | |
| 3056 | 3155 | { |
| 3156 | + struct dasd_eckd_private *private; | |
| 3157 | + sector_t first_trk, last_trk; | |
| 3158 | + sector_t first_blk, last_blk; | |
| 3057 | 3159 | unsigned int blksize, off; |
| 3160 | + unsigned int recs_per_trk; | |
| 3058 | 3161 | struct dasd_device *base; |
| 3059 | 3162 | struct req_iterator iter; |
| 3163 | + struct dasd_block *block; | |
| 3164 | + unsigned int skip_block; | |
| 3165 | + unsigned int blk_count; | |
| 3060 | 3166 | struct request *req; |
| 3061 | 3167 | struct bio_vec bv; |
| 3168 | + sector_t curr_trk; | |
| 3169 | + sector_t end_blk; | |
| 3062 | 3170 | char *dst; |
| 3171 | + int rc; | |
| 3063 | 3172 | |
| 3064 | 3173 | req = (struct request *) cqr->callback_data; |
| 3065 | 3174 | base = cqr->block->base; |
| 3066 | 3175 | blksize = base->block->bp_block; |
| 3176 | + block = cqr->block; | |
| 3177 | + private = base->private; | |
| 3178 | + skip_block = 0; | |
| 3179 | + blk_count = 0; | |
| 3180 | + | |
| 3181 | + recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); | |
| 3182 | + first_trk = first_blk = blk_rq_pos(req) >> block->s2b_shift; | |
| 3183 | + sector_div(first_trk, recs_per_trk); | |
| 3184 | + last_trk = last_blk = | |
| 3185 | + (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; | |
| 3186 | + sector_div(last_trk, recs_per_trk); | |
| 3187 | + rc = dasd_eckd_track_from_irb(irb, base, &curr_trk); | |
| 3188 | + if (rc) | |
| 3189 | + return rc; | |
| 3190 | + | |
| 3191 | + /* sanity check if the current track from sense data is valid */ | |
| 3192 | + if (curr_trk < first_trk || curr_trk > last_trk) { | |
| 3193 | + DBF_DEV_EVENT(DBF_WARNING, base, | |
| 3194 | + "ESE error track %llu not within range %llu - %llu\n", | |
| 3195 | + curr_trk, first_trk, last_trk); | |
| 3196 | + return -EINVAL; | |
| 3197 | + } | |
| 3198 | + | |
| 3199 | + /* | |
| 3200 | + * if not the first track got the NRF error we have to skip over valid | |
| 3201 | + * blocks | |
| 3202 | + */ | |
| 3203 | + if (curr_trk != first_trk) | |
| 3204 | + skip_block = curr_trk * recs_per_trk - first_blk; | |
| 3205 | + | |
| 3206 | + /* we have no information beyond the current track */ | |
| 3207 | + end_blk = (curr_trk + 1) * recs_per_trk; | |
| 3067 | 3208 | |
| 3068 | 3209 | rq_for_each_segment(bv, req, iter) { |
| 3069 | 3210 | dst = page_address(bv.bv_page) + bv.bv_offset; |
| 3070 | 3211 | for (off = 0; off < bv.bv_len; off += blksize) { |
| 3071 | − if (dst && rq_data_dir(req) == READ) { | |
| 3212 | + if (first_blk + blk_count >= end_blk) { | |
| 3213 | + cqr->proc_bytes = blk_count * blksize; | |
| 3214 | + return 0; | |
| 3215 | + } | |
| 3216 | + if (dst && !skip_block) { | |
| 3072 | 3217 | dst += off; |
| 3073 | 3218 | memset(dst, 0, blksize); |
| 3219 | + } else { | |
| 3220 | + skip_block--; | |
| 3074 | 3221 | } |
| 3222 | + blk_count++; | |
| 3075 | 3223 | } |
| 3076 | 3224 | } |
| 3225 | + return 0; | |
| 3077 | 3226 | } |
| 3078 | 3227 | |
| 3079 | 3228 | /* |
| @@ -187,6 +187,7 @@ struct dasd_ccw_req { · 186 unmodified lines | ||
| 187 | 187 | |
| 188 | 188 | void (*callback)(struct dasd_ccw_req *, void *data); |
| 189 | 189 | void *callback_data; |
| 190 | + unsigned int proc_bytes; /* bytes for partial completion */ | |
| 190 | 191 | }; |
| 191 | 192 | |
| 192 | 193 | /* |
| @@ -387,8 +388,9 @@ struct dasd_discipline { · 194 unmodified lines | ||
| 387 | 388 | int (*ext_pool_warn_thrshld)(struct dasd_device *); |
| 388 | 389 | int (*ext_pool_oos)(struct dasd_device *); |
| 389 | 390 | int (*ext_pool_exhaust)(struct dasd_device *, struct dasd_ccw_req *); |
| 390 | − struct dasd_ccw_req *(*ese_format)(struct dasd_device *, struct dasd_ccw_req *); | |
| 391 | − void (*ese_read)(struct dasd_ccw_req *); | |
| 391 | + struct dasd_ccw_req *(*ese_format)(struct dasd_device *, | |
| 392 | + struct dasd_ccw_req *, struct irb *); | |
| 393 | + int (*ese_read)(struct dasd_ccw_req *, struct irb *); | |
| 392 | 394 | }; |
| 393 | 395 | |
| 394 | 396 | extern struct dasd_discipline *dasd_diag_discipline_pointer; |
| @@ -474,6 +476,11 @@ struct dasd_profile { · 79 unmodified lines | ||
| 474 | 476 | spinlock_t lock; |
| 475 | 477 | }; |
| 476 | 478 | |
| 479 | +struct dasd_format_entry { | |
| 480 | + struct list_head list; | |
| 481 | + sector_t track; | |
| 482 | +}; | |
| 483 | + | |
| 477 | 484 | struct dasd_device { |
| 478 | 485 | /* Block device stuff. */ |
| 479 | 486 | struct dasd_block *block; |
| @@ -539,6 +546,7 @@ struct dasd_device { · 59 unmodified lines | ||
| 539 | 546 | struct dentry *debugfs_dentry; |
| 540 | 547 | struct dentry *hosts_dentry; |
| 541 | 548 | struct dasd_profile profile; |
| 549 | + struct dasd_format_entry format_entry; | |
| 542 | 550 | }; |
| 543 | 551 | |
| 544 | 552 | struct dasd_block { |
| @@ -564,6 +572,9 @@ struct dasd_block { · 19 unmodified lines | ||
| 564 | 572 | |
| 565 | 573 | struct dentry *debugfs_dentry; |
| 566 | 574 | struct dasd_profile profile; |
| 575 | + | |
| 576 | + struct list_head format_list; | |
| 577 | + spinlock_t format_lock; | |
| 567 | 578 | }; |
| 568 | 579 | |
| 569 | 580 | struct dasd_attention_data { |
| @@ -369,7 +369,7 @@ enum qeth_qdio_info_states { · 368 unmodified lines | ||
| 369 | 369 | struct qeth_buffer_pool_entry { |
| 370 | 370 | struct list_head list; |
| 371 | 371 | struct list_head init_list; |
| 372 | − void *elements[QDIO_MAX_ELEMENTS_PER_BUFFER]; | |
| 372 | + struct page *elements[QDIO_MAX_ELEMENTS_PER_BUFFER]; | |
| 373 | 373 | }; |
| 374 | 374 | |
| 375 | 375 | struct qeth_qdio_buffer_pool { |
| @@ -983,7 +983,7 @@ extern const struct attribute_group qeth_device_blkt_group; · 607 unmodified lines | ||
| 983 | 983 | extern const struct device_type qeth_generic_devtype; |
| 984 | 984 | |
| 985 | 985 | const char *qeth_get_cardname_short(struct qeth_card *); |
| 986 | −int qeth_realloc_buffer_pool(struct qeth_card *, int); | |
| 986 | +int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count); | |
| 987 | 987 | int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id); |
| 988 | 988 | void qeth_core_free_discipline(struct qeth_card *); |
| 989 | 989 | |
| @@ -65,7 +65,6 @@ static struct lock_class_key qdio_out_skb_queue_key; · 64 unmodified lines | ||
| 65 | 65 | static void qeth_issue_next_read_cb(struct qeth_card *card, |
| 66 | 66 | struct qeth_cmd_buffer *iob, |
| 67 | 67 | unsigned int data_length); |
| 68 | −static void qeth_free_buffer_pool(struct qeth_card *); | |
| 69 | 68 | static int qeth_qdio_establish(struct qeth_card *); |
| 70 | 69 | static void qeth_free_qdio_queues(struct qeth_card *card); |
| 71 | 70 | static void qeth_notify_skbs(struct qeth_qdio_out_q *queue, |
| @@ -212,49 +211,121 @@ void qeth_clear_working_pool_list(struct qeth_card *card) · 140 unmodified lines | ||
| 212 | 211 | } |
| 213 | 212 | EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list); |
| 214 | 213 | |
| 214 | +static void qeth_free_pool_entry(struct qeth_buffer_pool_entry *entry) | |
| 215 | +{ | |
| 216 | + unsigned int i; | |
| 217 | + | |
| 218 | + for (i = 0; i < ARRAY_SIZE(entry->elements); i++) { | |
| 219 | + if (entry->elements[i]) | |
| 220 | + __free_page(entry->elements[i]); | |
| 221 | + } | |
| 222 | + | |
| 223 | + kfree(entry); | |
| 224 | +} | |
| 225 | + | |
| 226 | +static void qeth_free_buffer_pool(struct qeth_card *card) | |
| 227 | +{ | |
| 228 | + struct qeth_buffer_pool_entry *entry, *tmp; | |
| 229 | + | |
| 230 | + list_for_each_entry_safe(entry, tmp, &card->qdio.init_pool.entry_list, | |
| 231 | + init_list) { | |
| 232 | + list_del(&entry->init_list); | |
| 233 | + qeth_free_pool_entry(entry); | |
| 234 | + } | |
| 235 | +} | |
| 236 | + | |
| 237 | +static struct qeth_buffer_pool_entry *qeth_alloc_pool_entry(unsigned int pages) | |
| 238 | +{ | |
| 239 | + struct qeth_buffer_pool_entry *entry; | |
| 240 | + unsigned int i; | |
| 241 | + | |
| 242 | + entry = kzalloc(sizeof(*entry), GFP_KERNEL); | |
| 243 | + if (!entry) | |
| 244 | + return NULL; | |
| 245 | + | |
| 246 | + for (i = 0; i < pages; i++) { | |
| 247 | + entry->elements[i] = alloc_page(GFP_KERNEL); | |
| 248 | + | |
| 249 | + if (!entry->elements[i]) { | |
| 250 | + qeth_free_pool_entry(entry); | |
| 251 | + return NULL; | |
| 252 | + } | |
| 253 | + } | |
| 254 | + | |
| 255 | + return entry; | |
| 256 | +} | |
| 257 | + | |
| 215 | 258 | static int qeth_alloc_buffer_pool(struct qeth_card *card) |
| 216 | 259 | { |
| 217 | − struct qeth_buffer_pool_entry *pool_entry; | |
| 218 | − void *ptr; | |
| 219 | − int i, j; | |
| 260 | + unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); | |
| 261 | + unsigned int i; | |
| 220 | 262 | |
| 221 | 263 | QETH_CARD_TEXT(card, 5, "alocpool"); |
| 222 | 264 | for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { |
| 223 | − pool_entry = kzalloc(sizeof(*pool_entry), GFP_KERNEL); | |
| 224 | − if (!pool_entry) { | |
| 265 | + struct qeth_buffer_pool_entry *entry; | |
| 266 | + | |
| 267 | + entry = qeth_alloc_pool_entry(buf_elements); | |
| 268 | + if (!entry) { | |
| 225 | 269 | qeth_free_buffer_pool(card); |
| 226 | 270 | return -ENOMEM; |
| 227 | 271 | } |
| 228 | − for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) { | |
| 229 | − ptr = (void *) __get_free_page(GFP_KERNEL); | |
| 230 | − if (!ptr) { | |
| 231 | − while (j > 0) | |
| 232 | − free_page((unsigned long) | |
| 233 | − pool_entry->elements[--j]); | |
| 234 | − kfree(pool_entry); | |
| 235 | − qeth_free_buffer_pool(card); | |
| 236 | − return -ENOMEM; | |
| 237 | − } | |
| 238 | − pool_entry->elements[j] = ptr; | |
| 239 | − } | |
| 240 | − list_add(&pool_entry->init_list, | |
| 241 | − &card->qdio.init_pool.entry_list); | |
| 272 | + | |
| 273 | + list_add(&entry->init_list, &card->qdio.init_pool.entry_list); | |
| 242 | 274 | } |
| 243 | 275 | return 0; |
| 244 | 276 | } |
| 245 | 277 | |
| 246 | −int qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt) | |
| 278 | +int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count) | |
| 247 | 279 | { |
| 280 | + unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); | |
| 281 | + struct qeth_qdio_buffer_pool *pool = &card->qdio.init_pool; | |
| 282 | + struct qeth_buffer_pool_entry *entry, *tmp; | |
| 283 | + int delta = count - pool->buf_count; | |
| 284 | + LIST_HEAD(entries); | |
| 285 | + | |
| 248 | 286 | QETH_CARD_TEXT(card, 2, "realcbp"); |
| 249 | 287 | |
| 250 | − /* TODO: steel/add buffers from/to a running card's buffer pool (?) */ | |
| 251 | − qeth_clear_working_pool_list(card); | |
| 252 | − qeth_free_buffer_pool(card); | |
| 253 | − card->qdio.in_buf_pool.buf_count = bufcnt; | |
| 254 | − card->qdio.init_pool.buf_count = bufcnt; | |
| 255 | − return qeth_alloc_buffer_pool(card); | |
| 288 | + /* Defer until queue is allocated: */ | |
| 289 | + if (!card->qdio.in_q) | |
| 290 | + goto out; | |
| 291 | + | |
| 292 | + /* Remove entries from the pool: */ | |
| 293 | + while (delta < 0) { | |
| 294 | + entry = list_first_entry(&pool->entry_list, | |
| 295 | + struct qeth_buffer_pool_entry, | |
| 296 | + init_list); | |
| 297 | + list_del(&entry->init_list); | |
| 298 | + qeth_free_pool_entry(entry); | |
| 299 | + | |
| 300 | + delta++; | |
| 301 | + } | |
| 302 | + | |
| 303 | + /* Allocate additional entries: */ | |
| 304 | + while (delta > 0) { | |
| 305 | + entry = qeth_alloc_pool_entry(buf_elements); | |
| 306 | + if (!entry) { | |
| 307 | + list_for_each_entry_safe(entry, tmp, &entries, | |
| 308 | + init_list) { | |
| 309 | + list_del(&entry->init_list); | |
| 310 | + qeth_free_pool_entry(entry); | |
| 311 | + } | |
| 312 | + | |
| 313 | + return -ENOMEM; | |
| 314 | + } | |
| 315 | + | |
| 316 | + list_add(&entry->init_list, &entries); | |
| 317 | + | |
| 318 | + delta--; | |
| 319 | + } | |
| 320 | + | |
| 321 | + list_splice(&entries, &pool->entry_list); | |
| 322 | + | |
| 323 | +out: | |
| 324 | + card->qdio.in_buf_pool.buf_count = count; | |
| 325 | + pool->buf_count = count; | |
| 326 | + return 0; | |
| 256 | 327 | } |
| 257 | −EXPORT_SYMBOL_GPL(qeth_realloc_buffer_pool); | |
| 328 | +EXPORT_SYMBOL_GPL(qeth_resize_buffer_pool); | |
| 258 | 329 | |
| 259 | 330 | static void qeth_free_qdio_queue(struct qeth_qdio_q *q) |
| 260 | 331 | { |
| @@ -1170,19 +1241,6 @@ void qeth_drain_output_queues(struct qeth_card *card) · 909 unmodified lines | ||
| 1170 | 1241 | } |
| 1171 | 1242 | EXPORT_SYMBOL_GPL(qeth_drain_output_queues); |
| 1172 | 1243 | |
| 1173 | −static void qeth_free_buffer_pool(struct qeth_card *card) | |
| 1174 | −{ | |
| 1175 | − struct qeth_buffer_pool_entry *pool_entry, *tmp; | |
| 1176 | − int i = 0; | |
| 1177 | − list_for_each_entry_safe(pool_entry, tmp, | |
| 1178 | − &card->qdio.init_pool.entry_list, init_list){ | |
| 1179 | − for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) | |
| 1180 | − free_page((unsigned long)pool_entry->elements[i]); | |
| 1181 | − list_del(&pool_entry->init_list); | |
| 1182 | − kfree(pool_entry); | |
| 1183 | − } | |
| 1184 | −} | |
| 1185 | − | |
| 1186 | 1244 | static int qeth_osa_set_output_queues(struct qeth_card *card, bool single) |
| 1187 | 1245 | { |
| 1188 | 1246 | unsigned int count = single ? 1 : card->dev->num_tx_queues; |
| @@ -1204,7 +1262,6 @@ static int qeth_osa_set_output_queues(struct qeth_card *card, bool single) · 15 unmodified lines | ||
| 1204 | 1262 | if (count == 1) |
| 1205 | 1263 | dev_info(&card->gdev->dev, "Priority Queueing not supported\n"); |
| 1206 | 1264 | |
| 1207 | − card->qdio.default_out_queue = single ? 0 : QETH_DEFAULT_QUEUE; | |
| 1208 | 1265 | card->qdio.no_out_queues = count; |
| 1209 | 1266 | return 0; |
| 1210 | 1267 | } |
| @@ -2393,7 +2450,6 @@ static void qeth_free_qdio_queues(struct qeth_card *card) · 1182 unmodified lines | ||
| 2393 | 2450 | return; |
| 2394 | 2451 | |
| 2395 | 2452 | qeth_free_cq(card); |
| 2396 | − cancel_delayed_work_sync(&card->buffer_reclaim_work); | |
| 2397 | 2453 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { |
| 2398 | 2454 | if (card->qdio.in_q->bufs[j].rx_skb) |
| 2399 | 2455 | dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb); |
| @@ -2575,7 +2631,6 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( · 175 unmodified lines | ||
| 2575 | 2631 | struct list_head *plh; |
| 2576 | 2632 | struct qeth_buffer_pool_entry *entry; |
| 2577 | 2633 | int i, free; |
| 2578 | − struct page *page; | |
| 2579 | 2634 | |
| 2580 | 2635 | if (list_empty(&card->qdio.in_buf_pool.entry_list)) |
| 2581 | 2636 | return NULL; |
| @@ -2584,7 +2639,7 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( · 2 unmodified lines | ||
| 2584 | 2639 | entry = list_entry(plh, struct qeth_buffer_pool_entry, list); |
| 2585 | 2640 | free = 1; |
| 2586 | 2641 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { |
| 2587 | − if (page_count(virt_to_page(entry->elements[i])) > 1) { | |
| 2642 | + if (page_count(entry->elements[i]) > 1) { | |
| 2588 | 2643 | free = 0; |
| 2589 | 2644 | break; |
| 2590 | 2645 | } |
| @@ -2599,15 +2654,15 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( · 8 unmodified lines | ||
| 2599 | 2654 | entry = list_entry(card->qdio.in_buf_pool.entry_list.next, |
| 2600 | 2655 | struct qeth_buffer_pool_entry, list); |
| 2601 | 2656 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { |
| 2602 | − if (page_count(virt_to_page(entry->elements[i])) > 1) { | |
| 2603 | − page = alloc_page(GFP_ATOMIC); | |
| 2604 | − if (!page) { | |
| 2657 | + if (page_count(entry->elements[i]) > 1) { | |
| 2658 | + struct page *page = alloc_page(GFP_ATOMIC); | |
| 2659 | + | |
| 2660 | + if (!page) | |
| 2605 | 2661 | return NULL; |
| 2606 | − } else { | |
| 2607 | − free_page((unsigned long)entry->elements[i]); | |
| 2608 | − entry->elements[i] = page_address(page); | |
| 2609 | − QETH_CARD_STAT_INC(card, rx_sg_alloc_page); | |
| 2610 | − } | |
| 2662 | + | |
| 2663 | + __free_page(entry->elements[i]); | |
| 2664 | + entry->elements[i] = page; | |
| 2665 | + QETH_CARD_STAT_INC(card, rx_sg_alloc_page); | |
| 2611 | 2666 | } |
| 2612 | 2667 | } |
| 2613 | 2668 | list_del_init(&entry->list); |
| @@ -2625,12 +2680,12 @@ static int qeth_init_input_buffer(struct qeth_card *card, · 11 unmodified lines | ||
| 2625 | 2680 | ETH_HLEN + |
| 2626 | 2681 | sizeof(struct ipv6hdr)); |
| 2627 | 2682 | if (!buf->rx_skb) |
| 2628 | − return 1; | |
| 2683 | + return -ENOMEM; | |
| 2629 | 2684 | } |
| 2630 | 2685 | |
| 2631 | 2686 | pool_entry = qeth_find_free_buffer_pool_entry(card); |
| 2632 | 2687 | if (!pool_entry) |
| 2633 | − return 1; | |
| 2688 | + return -ENOBUFS; | |
| 2634 | 2689 | |
| 2635 | 2690 | /* |
| 2636 | 2691 | * since the buffer is accessed only from the input_tasklet |
| @@ -2643,7 +2698,7 @@ static int qeth_init_input_buffer(struct qeth_card *card, · 6 unmodified lines | ||
| 2643 | 2698 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { |
| 2644 | 2699 | buf->buffer->element[i].length = PAGE_SIZE; |
| 2645 | 2700 | buf->buffer->element[i].addr = |
| 2646 | − virt_to_phys(pool_entry->elements[i]); | |
| 2701 | + page_to_phys(pool_entry->elements[i]); | |
| 2647 | 2702 | if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) |
| 2648 | 2703 | buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY; |
| 2649 | 2704 | else |
| @@ -2675,10 +2730,15 @@ static int qeth_init_qdio_queues(struct qeth_card *card) · 25 unmodified lines | ||
| 2675 | 2730 | /* inbound queue */ |
| 2676 | 2731 | qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); |
| 2677 | 2732 | memset(&card->rx, 0, sizeof(struct qeth_rx)); |
| 2733 | + | |
| 2678 | 2734 | qeth_initialize_working_pool_list(card); |
| 2679 | 2735 | /*give only as many buffers to hardware as we have buffer pool entries*/ |
| 2680 | − for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i) | |
| 2681 | − qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); | |
| 2736 | + for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; i++) { | |
| 2737 | + rc = qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); | |
| 2738 | + if (rc) | |
| 2739 | + return rc; | |
| 2740 | + } | |
| 2741 | + | |
| 2682 | 2742 | card->qdio.in_q->next_buf_to_init = |
| 2683 | 2743 | card->qdio.in_buf_pool.buf_count - 1; |
| 2684 | 2744 | rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0, |
| @@ -247,8 +247,8 @@ static ssize_t qeth_dev_bufcnt_store(struct device *dev, · 246 unmodified lines | ||
| 247 | 247 | struct device_attribute *attr, const char *buf, size_t count) |
| 248 | 248 | { |
| 249 | 249 | struct qeth_card *card = dev_get_drvdata(dev); |
| 250 | + unsigned int cnt; | |
| 250 | 251 | char *tmp; |
| 251 | − int cnt, old_cnt; | |
| 252 | 252 | int rc = 0; |
| 253 | 253 | |
| 254 | 254 | mutex_lock(&card->conf_mutex); |
| @@ -257,13 +257,12 @@ static ssize_t qeth_dev_bufcnt_store(struct device *dev, · 2 unmodified lines | ||
| 257 | 257 | goto out; |
| 258 | 258 | } |
| 259 | 259 | |
| 260 | − old_cnt = card->qdio.in_buf_pool.buf_count; | |
| 261 | 260 | cnt = simple_strtoul(buf, &tmp, 10); |
| 262 | 261 | cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN : |
| 263 | 262 | ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt); |
| 264 | − if (old_cnt != cnt) { | |
| 265 | − rc = qeth_realloc_buffer_pool(card, cnt); | |
| 266 | − } | |
| 263 | + | |
| 264 | + rc = qeth_resize_buffer_pool(card, cnt); | |
| 265 | + | |
| 267 | 266 | out: |
| 268 | 267 | mutex_unlock(&card->conf_mutex); |
| 269 | 268 | return rc ? rc : count; |
| @@ -284,6 +284,7 @@ static void qeth_l2_stop_card(struct qeth_card *card) · 283 unmodified lines | ||
| 284 | 284 | if (card->state == CARD_STATE_SOFTSETUP) { |
| 285 | 285 | qeth_clear_ipacmd_list(card); |
| 286 | 286 | qeth_drain_output_queues(card); |
| 287 | + cancel_delayed_work_sync(&card->buffer_reclaim_work); | |
| 287 | 288 | card->state = CARD_STATE_DOWN; |
| 288 | 289 | } |
| 289 | 290 | |
| @@ -1178,6 +1178,7 @@ static void qeth_l3_stop_card(struct qeth_card *card) · 1177 unmodified lines | ||
| 1178 | 1178 | qeth_l3_clear_ip_htable(card, 1); |
| 1179 | 1179 | qeth_clear_ipacmd_list(card); |
| 1180 | 1180 | qeth_drain_output_queues(card); |
| 1181 | + cancel_delayed_work_sync(&card->buffer_reclaim_work); | |
| 1181 | 1182 | card->state = CARD_STATE_DOWN; |
| 1182 | 1183 | } |
| 1183 | 1184 | |
| @@ -206,12 +206,11 @@ static ssize_t qeth_l3_dev_sniffer_store(struct device *dev, · 205 unmodified lines | ||
| 206 | 206 | qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd); |
| 207 | 207 | if (card->ssqd.qdioac2 & CHSC_AC2_SNIFFER_AVAILABLE) { |
| 208 | 208 | card->options.sniffer = i; |
| 209 | − if (card->qdio.init_pool.buf_count != | |
| 210 | − QETH_IN_BUF_COUNT_MAX) | |
| 211 | − qeth_realloc_buffer_pool(card, | |
| 212 | − QETH_IN_BUF_COUNT_MAX); | |
| 213 | − } else | |
| 209 | + qeth_resize_buffer_pool(card, QETH_IN_BUF_COUNT_MAX); | |
| 210 | + } else { | |
| 214 | 211 | rc = -EPERM; |
| 212 | + } | |
| 213 | + | |
| 215 | 214 | break; |
| 216 | 215 | default: |
| 217 | 216 | rc = -EINVAL; |
| @@ -9950,6 +9950,7 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, · 9949 unmodified lines | ||
| 9950 | 9950 | ioa_cfg->max_devs_supported = ipr_max_devs; |
| 9951 | 9951 | |
| 9952 | 9952 | if (ioa_cfg->sis64) { |
| 9953 | + host->max_channel = IPR_MAX_SIS64_BUSES; | |
| 9953 | 9954 | host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; |
| 9954 | 9955 | host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; |
| 9955 | 9956 | if (ipr_max_devs > IPR_MAX_SIS64_DEVS) |
| @@ -9958,6 +9959,7 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, · 2 unmodified lines | ||
| 9958 | 9959 | + ((sizeof(struct ipr_config_table_entry64) |
| 9959 | 9960 | * ioa_cfg->max_devs_supported))); |
| 9960 | 9961 | } else { |
| 9962 | + host->max_channel = IPR_VSET_BUS; | |
| 9961 | 9963 | host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; |
| 9962 | 9964 | host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; |
| 9963 | 9965 | if (ipr_max_devs > IPR_MAX_PHYSICAL_DEVS) |
| @@ -9967,7 +9969,6 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, · 3 unmodified lines | ||
| 9967 | 9969 | * ioa_cfg->max_devs_supported))); |
| 9968 | 9970 | } |
| 9969 | 9971 | |
| 9970 | − host->max_channel = IPR_VSET_BUS; | |
| 9971 | 9972 | host->unique_id = host->host_no; |
| 9972 | 9973 | host->max_cmd_len = IPR_MAX_CDB_LEN; |
| 9973 | 9974 | host->can_queue = ioa_cfg->max_cmds; |
| @@ -1300,6 +1300,7 @@ struct ipr_resource_entry { · 1299 unmodified lines | ||
| 1300 | 1300 | #define IPR_ARRAY_VIRTUAL_BUS 0x1 |
| 1301 | 1301 | #define IPR_VSET_VIRTUAL_BUS 0x2 |
| 1302 | 1302 | #define IPR_IOAFP_VIRTUAL_BUS 0x3 |
| 1303 | +#define IPR_MAX_SIS64_BUSES 0x4 | |
| 1303 | 1304 | |
| 1304 | 1305 | #define IPR_GET_RES_PHYS_LOC(res) \ |
| 1305 | 1306 | (((res)->bus << 24) | ((res)->target << 8) | (res)->lun) |
| @@ -3884,18 +3884,25 @@ EXPORT_SYMBOL_GPL(ufshcd_uic_hibern8_exit); · 3883 unmodified lines | ||
| 3884 | 3884 | void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit) |
| 3885 | 3885 | { |
| 3886 | 3886 | unsigned long flags; |
| 3887 | + bool update = false; | |
| 3887 | 3888 | |
| 3888 | − if (!(hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT)) | |
| 3889 | + if (!ufshcd_is_auto_hibern8_supported(hba)) | |
| 3889 | 3890 | return; |
| 3890 | 3891 | |
| 3891 | 3892 | spin_lock_irqsave(hba->host->host_lock, flags); |
| 3892 | − if (hba->ahit == ahit) | |
| 3893 | − goto out_unlock; | |
| 3894 | − hba->ahit = ahit; | |
| 3895 | − if (!pm_runtime_suspended(hba->dev)) | |
| 3896 | − ufshcd_writel(hba, hba->ahit, REG_AUTO_HIBERNATE_IDLE_TIMER); | |
| 3897 | −out_unlock: | |
| 3893 | + if (hba->ahit != ahit) { | |
| 3894 | + hba->ahit = ahit; | |
| 3895 | + update = true; | |
| 3896 | + } | |
| 3898 | 3897 | spin_unlock_irqrestore(hba->host->host_lock, flags); |
| 3898 | + | |
| 3899 | + if (update && !pm_runtime_suspended(hba->dev)) { | |
| 3900 | + pm_runtime_get_sync(hba->dev); | |
| 3901 | + ufshcd_hold(hba, false); | |
| 3902 | + ufshcd_auto_hibern8_enable(hba); | |
| 3903 | + ufshcd_release(hba); | |
| 3904 | + pm_runtime_put(hba->dev); | |
| 3905 | + } | |
| 3899 | 3906 | } |
| 3900 | 3907 | EXPORT_SYMBOL_GPL(ufshcd_auto_hibern8_update); |
| 3901 | 3908 | |
| @@ -1320,6 +1320,9 @@ static const struct of_device_id qcom_slim_ngd_dt_match[] = { · 1319 unmodified lines | ||
| 1320 | 1320 | { |
| 1321 | 1321 | .compatible = "qcom,slim-ngd-v1.5.0", |
| 1322 | 1322 | .data = &ngd_v1_5_offset_info, |
| 1323 | + },{ | |
| 1324 | + .compatible = "qcom,slim-ngd-v2.1.0", | |
| 1325 | + .data = &ngd_v1_5_offset_info, | |
| 1323 | 1326 | }, |
| 1324 | 1327 | {} |
| 1325 | 1328 | }; |
| @@ -19,6 +19,7 @@ · 18 unmodified lines | ||
| 19 | 19 | #include <signal.h> |
| 20 | 20 | |
| 21 | 21 | #define MAX_NUM_DEVICES 10 |
| 22 | +#define MAX_SYSFS_PREFIX 0x80 | |
| 22 | 23 | #define MAX_SYSFS_PATH 0x200 |
| 23 | 24 | #define CSV_MAX_LINE 0x1000 |
| 24 | 25 | #define SYSFS_MAX_INT 0x20 |
| @@ -67,7 +68,7 @@ struct loopback_results { · 42 unmodified lines | ||
| 67 | 68 | }; |
| 68 | 69 | |
| 69 | 70 | struct loopback_device { |
| 70 | − char name[MAX_SYSFS_PATH]; | |
| 71 | + char name[MAX_STR_LEN]; | |
| 71 | 72 | char sysfs_entry[MAX_SYSFS_PATH]; |
| 72 | 73 | char debugfs_entry[MAX_SYSFS_PATH]; |
| 73 | 74 | struct loopback_results results; |
| @@ -93,8 +94,8 @@ struct loopback_test { · 19 unmodified lines | ||
| 93 | 94 | int stop_all; |
| 94 | 95 | int poll_count; |
| 95 | 96 | char test_name[MAX_STR_LEN]; |
| 96 | − char sysfs_prefix[MAX_SYSFS_PATH]; | |
| 97 | − char debugfs_prefix[MAX_SYSFS_PATH]; | |
| 97 | + char sysfs_prefix[MAX_SYSFS_PREFIX]; | |
| 98 | + char debugfs_prefix[MAX_SYSFS_PREFIX]; | |
| 98 | 99 | struct timespec poll_timeout; |
| 99 | 100 | struct loopback_device devices[MAX_NUM_DEVICES]; |
| 100 | 101 | struct loopback_results aggregate_results; |
| @@ -637,7 +638,7 @@ baddir: · 536 unmodified lines | ||
| 637 | 638 | static int open_poll_files(struct loopback_test *t) |
| 638 | 639 | { |
| 639 | 640 | struct loopback_device *dev; |
| 640 | − char buf[MAX_STR_LEN]; | |
| 641 | + char buf[MAX_SYSFS_PATH + MAX_STR_LEN]; | |
| 641 | 642 | char dummy; |
| 642 | 643 | int fds_idx = 0; |
| 643 | 644 | int i; |
| @@ -655,7 +656,7 @@ static int open_poll_files(struct loopback_test *t) · 11 unmodified lines | ||
| 655 | 656 | goto err; |
| 656 | 657 | } |
| 657 | 658 | read(t->fds[fds_idx].fd, &dummy, 1); |
| 658 | − t->fds[fds_idx].events = EPOLLERR|EPOLLPRI; | |
| 659 | + t->fds[fds_idx].events = POLLERR | POLLPRI; | |
| 659 | 660 | t->fds[fds_idx].revents = 0; |
| 660 | 661 | fds_idx++; |
| 661 | 662 | } |
| @@ -748,7 +749,7 @@ static int wait_for_complete(struct loopback_test *t) · 86 unmodified lines | ||
| 748 | 749 | } |
| 749 | 750 | |
| 750 | 751 | for (i = 0; i < t->poll_count; i++) { |
| 751 | − if (t->fds[i].revents & EPOLLPRI) { | |
| 752 | + if (t->fds[i].revents & POLLPRI) { | |
| 752 | 753 | /* Dummy read to clear the event */ |
| 753 | 754 | read(t->fds[i].fd, &dummy, 1); |
| 754 | 755 | number_of_events++; |
| @@ -907,10 +908,10 @@ int main(int argc, char *argv[]) · 152 unmodified lines | ||
| 907 | 908 | t.iteration_max = atoi(optarg); |
| 908 | 909 | break; |
| 909 | 910 | case 'S': |
| 910 | − snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", optarg); | |
| 911 | + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); | |
| 911 | 912 | break; |
| 912 | 913 | case 'D': |
| 913 | − snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", optarg); | |
| 914 | + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); | |
| 914 | 915 | break; |
| 915 | 916 | case 'm': |
| 916 | 917 | t.mask = atol(optarg); |
| @@ -961,10 +962,10 @@ int main(int argc, char *argv[]) · 44 unmodified lines | ||
| 961 | 962 | } |
| 962 | 963 | |
| 963 | 964 | if (!strcmp(t.sysfs_prefix, "")) |
| 964 | − snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", sysfs_prefix); | |
| 965 | + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", sysfs_prefix); | |
| 965 | 966 | |
| 966 | 967 | if (!strcmp(t.debugfs_prefix, "")) |
| 967 | − snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", debugfs_prefix); | |
| 968 | + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", debugfs_prefix); | |
| 968 | 969 | |
| 969 | 970 | ret = find_loopback_devices(&t); |
| 970 | 971 | if (ret) |
| @@ -38,6 +38,7 @@ static const struct usb_device_id rtw_usb_id_tbl[] = { · 37 unmodified lines | ||
| 38 | 38 | {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ |
| 39 | 39 | {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ |
| 40 | 40 | {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ |
| 41 | + {USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */ | |
| 41 | 42 | {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ |
| 42 | 43 | {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */ |
| 43 | 44 | {} /* Terminating entry */ |
| @@ -561,7 +561,7 @@ static u_long get_word(struct vc_data *vc) · 560 unmodified lines | ||
| 561 | 561 | return 0; |
| 562 | 562 | } else if (tmpx < vc->vc_cols - 2 && |
| 563 | 563 | (ch == SPACE || ch == 0 || (ch < 0x100 && IS_WDLM(ch))) && |
| 564 | − get_char(vc, (u_short *)&tmp_pos + 1, &temp) > SPACE) { | |
| 564 | + get_char(vc, (u_short *)tmp_pos + 1, &temp) > SPACE) { | |
| 565 | 565 | tmp_pos += 2; |
| 566 | 566 | tmpx++; |
| 567 | 567 | } else { |
| @@ -140,6 +140,7 @@ int hif_shutdown(struct wfx_dev *wdev) · 139 unmodified lines | ||
| 140 | 140 | else |
| 141 | 141 | control_reg_write(wdev, 0); |
| 142 | 142 | mutex_unlock(&wdev->hif_cmd.lock); |
| 143 | + mutex_unlock(&wdev->hif_cmd.key_renew_lock); | |
| 143 | 144 | kfree(hif); |
| 144 | 145 | return ret; |
| 145 | 146 | } |
| @@ -289,7 +290,7 @@ int hif_stop_scan(struct wfx_vif *wvif) · 143 unmodified lines | ||
| 289 | 290 | } |
| 290 | 291 | |
| 291 | 292 | int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, |
| 292 | − const struct ieee80211_channel *channel, const u8 *ssidie) | |
| 293 | + struct ieee80211_channel *channel, const u8 *ssid, int ssidlen) | |
| 293 | 294 | { |
| 294 | 295 | int ret; |
| 295 | 296 | struct hif_msg *hif; |
| @@ -307,9 +308,9 @@ int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, · 11 unmodified lines | ||
| 307 | 308 | body->basic_rate_set = |
| 308 | 309 | cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); |
| 309 | 310 | memcpy(body->bssid, conf->bssid, sizeof(body->bssid)); |
| 310 | − if (!conf->ibss_joined && ssidie) { | |
| 311 | − body->ssid_length = cpu_to_le32(ssidie[1]); | |
| 312 | − memcpy(body->ssid, &ssidie[2], ssidie[1]); | |
| 311 | + if (!conf->ibss_joined && ssid) { | |
| 312 | + body->ssid_length = cpu_to_le32(ssidlen); | |
| 313 | + memcpy(body->ssid, ssid, ssidlen); | |
| 313 | 314 | } |
| 314 | 315 | wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body)); |
| 315 | 316 | ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false); |
| @@ -427,9 +428,9 @@ int hif_start(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, · 111 unmodified lines | ||
| 427 | 428 | struct hif_msg *hif; |
| 428 | 429 | struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif); |
| 429 | 430 | |
| 430 | − body->dtim_period = conf->dtim_period, | |
| 431 | − body->short_preamble = conf->use_short_preamble, | |
| 432 | − body->channel_number = cpu_to_le16(channel->hw_value), | |
| 431 | + body->dtim_period = conf->dtim_period; | |
| 432 | + body->short_preamble = conf->use_short_preamble; | |
| 433 | + body->channel_number = cpu_to_le16(channel->hw_value); | |
| 433 | 434 | body->beacon_interval = cpu_to_le32(conf->beacon_int); |
| 434 | 435 | body->basic_rate_set = |
| 435 | 436 | cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); |
| @@ -46,7 +46,7 @@ int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req80211, · 45 unmodified lines | ||
| 46 | 46 | int chan_start, int chan_num); |
| 47 | 47 | int hif_stop_scan(struct wfx_vif *wvif); |
| 48 | 48 | int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, |
| 49 | − const struct ieee80211_channel *channel, const u8 *ssidie); | |
| 49 | + struct ieee80211_channel *channel, const u8 *ssid, int ssidlen); | |
| 50 | 50 | int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout); |
| 51 | 51 | int hif_set_bss_params(struct wfx_vif *wvif, |
| 52 | 52 | const struct hif_req_set_bss_params *arg); |
| @@ -191,10 +191,10 @@ static inline int hif_set_block_ack_policy(struct wfx_vif *wvif, · 190 unmodified lines | ||
| 191 | 191 | } |
| 192 | 192 | |
| 193 | 193 | static inline int hif_set_association_mode(struct wfx_vif *wvif, |
| 194 | − struct ieee80211_bss_conf *info, | |
| 195 | − struct ieee80211_sta_ht_cap *ht_cap) | |
| 194 | + struct ieee80211_bss_conf *info) | |
| 196 | 195 | { |
| 197 | 196 | int basic_rates = wfx_rate_mask_to_hw(wvif->wdev, info->basic_rates); |
| 197 | + struct ieee80211_sta *sta = NULL; | |
| 198 | 198 | struct hif_mib_set_association_mode val = { |
| 199 | 199 | .preambtype_use = 1, |
| 200 | 200 | .mode = 1, |
| @@ -204,12 +204,17 @@ static inline int hif_set_association_mode(struct wfx_vif *wvif, · 3 unmodified lines | ||
| 204 | 204 | .basic_rate_set = cpu_to_le32(basic_rates) |
| 205 | 205 | }; |
| 206 | 206 | |
| 207 | + rcu_read_lock(); // protect sta | |
| 208 | + if (info->bssid && !info->ibss_joined) | |
| 209 | + sta = ieee80211_find_sta(wvif->vif, info->bssid); | |
| 210 | + | |
| 207 | 211 | // FIXME: it is strange to not retrieve all information from bss_info |
| 208 | − if (ht_cap && ht_cap->ht_supported) { | |
| 209 | − val.mpdu_start_spacing = ht_cap->ampdu_density; | |
| 212 | + if (sta && sta->ht_cap.ht_supported) { | |
| 213 | + val.mpdu_start_spacing = sta->ht_cap.ampdu_density; | |
| 210 | 214 | if (!(info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT)) |
| 211 | − val.greenfield = !!(ht_cap->cap & IEEE80211_HT_CAP_GRN_FLD); | |
| 215 | + val.greenfield = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD); | |
| 212 | 216 | } |
| 217 | + rcu_read_unlock(); | |
| 213 | 218 | |
| 214 | 219 | return hif_write_mib(wvif->wdev, wvif->id, |
| 215 | 220 | HIF_MIB_ID_SET_ASSOCIATION_MODE, &val, sizeof(val)); |
| @@ -491,9 +491,11 @@ static void wfx_set_mfp(struct wfx_vif *wvif, · 490 unmodified lines | ||
| 491 | 491 | static void wfx_do_join(struct wfx_vif *wvif) |
| 492 | 492 | { |
| 493 | 493 | int ret; |
| 494 | − const u8 *ssidie; | |
| 495 | 494 | struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf; |
| 496 | 495 | struct cfg80211_bss *bss = NULL; |
| 496 | + u8 ssid[IEEE80211_MAX_SSID_LEN]; | |
| 497 | + const u8 *ssidie = NULL; | |
| 498 | + int ssidlen = 0; | |
| 497 | 499 | |
| 498 | 500 | wfx_tx_lock_flush(wvif->wdev); |
| 499 | 501 | |
| @@ -514,11 +516,14 @@ static void wfx_do_join(struct wfx_vif *wvif) · 14 unmodified lines | ||
| 514 | 516 | if (!wvif->beacon_int) |
| 515 | 517 | wvif->beacon_int = 1; |
| 516 | 518 | |
| 517 | − rcu_read_lock(); | |
| 519 | + rcu_read_lock(); // protect ssidie | |
| 518 | 520 | if (!conf->ibss_joined) |
| 519 | 521 | ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); |
| 520 | − else | |
| 521 | − ssidie = NULL; | |
| 522 | + if (ssidie) { | |
| 523 | + ssidlen = ssidie[1]; | |
| 524 | + memcpy(ssid, &ssidie[2], ssidie[1]); | |
| 525 | + } | |
| 526 | + rcu_read_unlock(); | |
| 522 | 527 | |
| 523 | 528 | wfx_tx_flush(wvif->wdev); |
| 524 | 529 | |
| @@ -527,10 +532,8 @@ static void wfx_do_join(struct wfx_vif *wvif) · 2 unmodified lines | ||
| 527 | 532 | |
| 528 | 533 | wfx_set_mfp(wvif, bss); |
| 529 | 534 | |
| 530 | − /* Perform actual join */ | |
| 531 | 535 | wvif->wdev->tx_burst_idx = -1; |
| 532 | − ret = hif_join(wvif, conf, wvif->channel, ssidie); | |
| 533 | − rcu_read_unlock(); | |
| 536 | + ret = hif_join(wvif, conf, wvif->channel, ssid, ssidlen); | |
| 534 | 537 | if (ret) { |
| 535 | 538 | ieee80211_connection_loss(wvif->vif); |
| 536 | 539 | wvif->join_complete_status = -1; |
| @@ -605,7 +608,9 @@ int wfx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, · 68 unmodified lines | ||
| 605 | 608 | int i; |
| 606 | 609 | |
| 607 | 610 | for (i = 0; i < ARRAY_SIZE(sta_priv->buffered); i++) |
| 608 | − WARN(sta_priv->buffered[i], "release station while Tx is in progress"); | |
| 611 | + if (sta_priv->buffered[i]) | |
| 612 | + dev_warn(wvif->wdev->dev, "release station while %d pending frame on queue %d", | |
| 613 | + sta_priv->buffered[i], i); | |
| 609 | 614 | // FIXME: see note in wfx_sta_add() |
| 610 | 615 | if (vif->type == NL80211_IFTYPE_STATION) |
| 611 | 616 | return 0; |
| @@ -689,6 +694,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif, · 77 unmodified lines | ||
| 689 | 694 | wfx_rate_mask_to_hw(wvif->wdev, sta->supp_rates[wvif->channel->band]); |
| 690 | 695 | else |
| 691 | 696 | wvif->bss_params.operational_rate_set = -1; |
| 697 | + rcu_read_unlock(); | |
| 692 | 698 | if (sta && |
| 693 | 699 | info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) |
| 694 | 700 | hif_dual_cts_protection(wvif, true); |
| @@ -701,8 +707,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif, · 6 unmodified lines | ||
| 701 | 707 | wvif->bss_params.beacon_lost_count = 20; |
| 702 | 708 | wvif->bss_params.aid = info->aid; |
| 703 | 709 | |
| 704 | − hif_set_association_mode(wvif, info, sta ? &sta->ht_cap : NULL); | |
| 705 | − rcu_read_unlock(); | |
| 710 | + hif_set_association_mode(wvif, info); | |
| 706 | 711 | |
| 707 | 712 | if (!info->ibss_joined) { |
| 708 | 713 | hif_keep_alive_period(wvif, 30 /* sec */); |
| @@ -954,7 +954,7 @@ static bool tb_port_is_width_supported(struct tb_port *port, int width) · 953 unmodified lines | ||
| 954 | 954 | ret = tb_port_read(port, &phy, TB_CFG_PORT, |
| 955 | 955 | port->cap_phy + LANE_ADP_CS_0, 1); |
| 956 | 956 | if (ret) |
| 957 | − return ret; | |
| 957 | + return false; | |
| 958 | 958 | |
| 959 | 959 | widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >> |
| 960 | 960 | LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT; |
| @@ -1589,9 +1589,7 @@ void tty_kclose(struct tty_struct *tty) · 1588 unmodified lines | ||
| 1589 | 1589 | tty_debug_hangup(tty, "freeing structure\n"); |
| 1590 | 1590 | /* |
| 1591 | 1591 | * The release_tty function takes care of the details of clearing |
| 1592 | − * the slots and preserving the termios structure. The tty_unlock_pair | |
| 1593 | − * should be safe as we keep a kref while the tty is locked (so the | |
| 1594 | − * unlock never unlocks a freed tty). | |
| 1592 | + * the slots and preserving the termios structure. | |
| 1595 | 1593 | */ |
| 1596 | 1594 | mutex_lock(&tty_mutex); |
| 1597 | 1595 | tty_port_set_kopened(tty->port, 0); |
| @@ -1621,9 +1619,7 @@ void tty_release_struct(struct tty_struct *tty, int idx) · 23 unmodified lines | ||
| 1621 | 1619 | tty_debug_hangup(tty, "freeing structure\n"); |
| 1622 | 1620 | /* |
| 1623 | 1621 | * The release_tty function takes care of the details of clearing |
| 1624 | − * the slots and preserving the termios structure. The tty_unlock_pair | |
| 1625 | − * should be safe as we keep a kref while the tty is locked (so the | |
| 1626 | − * unlock never unlocks a freed tty). | |
| 1622 | + * the slots and preserving the termios structure. | |
| 1627 | 1623 | */ |
| 1628 | 1624 | mutex_lock(&tty_mutex); |
| 1629 | 1625 | release_tty(tty, idx); |
| @@ -2734,9 +2730,11 @@ static int compat_tty_tiocgserial(struct tty_struct *tty, · 1104 unmodified lines | ||
| 2734 | 2730 | struct serial_struct32 v32; |
| 2735 | 2731 | struct serial_struct v; |
| 2736 | 2732 | int err; |
| 2737 | − memset(&v, 0, sizeof(struct serial_struct)); | |
| 2738 | 2733 | |
| 2739 | − if (!tty->ops->set_serial) | |
| 2734 | + memset(&v, 0, sizeof(v)); | |
| 2735 | + memset(&v32, 0, sizeof(v32)); | |
| 2736 | + | |
| 2737 | + if (!tty->ops->get_serial) | |
| 2740 | 2738 | return -ENOTTY; |
| 2741 | 2739 | err = tty->ops->get_serial(tty, &v); |
| 2742 | 2740 | if (!err) { |
| @@ -1530,18 +1530,19 @@ static const struct usb_ep_ops usb_ep_ops = { · 1529 unmodified lines | ||
| 1530 | 1530 | static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active) |
| 1531 | 1531 | { |
| 1532 | 1532 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); |
| 1533 | − unsigned long flags; | |
| 1534 | 1533 | |
| 1535 | 1534 | if (is_active) { |
| 1536 | 1535 | pm_runtime_get_sync(&_gadget->dev); |
| 1537 | 1536 | hw_device_reset(ci); |
| 1538 | − spin_lock_irqsave(&ci->lock, flags); | |
| 1537 | + spin_lock_irq(&ci->lock); | |
| 1539 | 1538 | if (ci->driver) { |
| 1540 | 1539 | hw_device_state(ci, ci->ep0out->qh.dma); |
| 1541 | 1540 | usb_gadget_set_state(_gadget, USB_STATE_POWERED); |
| 1541 | + spin_unlock_irq(&ci->lock); | |
| 1542 | 1542 | usb_udc_vbus_handler(_gadget, true); |
| 1543 | + } else { | |
| 1544 | + spin_unlock_irq(&ci->lock); | |
| 1543 | 1545 | } |
| 1544 | − spin_unlock_irqrestore(&ci->lock, flags); | |
| 1545 | 1546 | } else { |
| 1546 | 1547 | usb_udc_vbus_handler(_gadget, false); |
| 1547 | 1548 | if (ci->driver) |
| @@ -896,10 +896,10 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss) · 895 unmodified lines | ||
| 896 | 896 | |
| 897 | 897 | ss->xmit_fifo_size = acm->writesize; |
| 898 | 898 | ss->baud_base = le32_to_cpu(acm->line.dwDTERate); |
| 899 | − ss->close_delay = acm->port.close_delay / 10; | |
| 899 | + ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; | |
| 900 | 900 | ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
| 901 | 901 | ASYNC_CLOSING_WAIT_NONE : |
| 902 | − acm->port.closing_wait / 10; | |
| 902 | + jiffies_to_msecs(acm->port.closing_wait) / 10; | |
| 903 | 903 | return 0; |
| 904 | 904 | } |
| 905 | 905 | |
| @@ -907,24 +907,32 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss) · 1 unmodified line | ||
| 907 | 907 | { |
| 908 | 908 | struct acm *acm = tty->driver_data; |
| 909 | 909 | unsigned int closing_wait, close_delay; |
| 910 | + unsigned int old_closing_wait, old_close_delay; | |
| 910 | 911 | int retval = 0; |
| 911 | 912 | |
| 912 | − close_delay = ss->close_delay * 10; | |
| 913 | + close_delay = msecs_to_jiffies(ss->close_delay * 10); | |
| 913 | 914 | closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
| 914 | − ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10; | |
| 915 | + ASYNC_CLOSING_WAIT_NONE : | |
| 916 | + msecs_to_jiffies(ss->closing_wait * 10); | |
| 917 | + | |
| 918 | + /* we must redo the rounding here, so that the values match */ | |
| 919 | + old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; | |
| 920 | + old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? | |
| 921 | + ASYNC_CLOSING_WAIT_NONE : | |
| 922 | + jiffies_to_msecs(acm->port.closing_wait) / 10; | |
| 915 | 923 | |
| 916 | 924 | mutex_lock(&acm->port.mutex); |
| 917 | 925 | |
| 918 | − if (!capable(CAP_SYS_ADMIN)) { | |
| 919 | − if ((close_delay != acm->port.close_delay) || | |
| 920 | − (closing_wait != acm->port.closing_wait)) | |
| 926 | + if ((ss->close_delay != old_close_delay) || | |
| 927 | + (ss->closing_wait != old_closing_wait)) { | |
| 928 | + if (!capable(CAP_SYS_ADMIN)) | |
| 921 | 929 | retval = -EPERM; |
| 922 | − else | |
| 923 | − retval = -EOPNOTSUPP; | |
| 924 | − } else { | |
| 925 | − acm->port.close_delay = close_delay; | |
| 926 | − acm->port.closing_wait = closing_wait; | |
| 927 | − } | |
| 930 | + else { | |
| 931 | + acm->port.close_delay = close_delay; | |
| 932 | + acm->port.closing_wait = closing_wait; | |
| 933 | + } | |
| 934 | + } else | |
| 935 | + retval = -EOPNOTSUPP; | |
| 928 | 936 | |
| 929 | 937 | mutex_unlock(&acm->port.mutex); |
| 930 | 938 | return retval; |
| @@ -378,6 +378,12 @@ static const struct usb_device_id usb_quirk_list[] = { · 377 unmodified lines | ||
| 378 | 378 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = |
| 379 | 379 | USB_QUIRK_IGNORE_REMOTE_WAKEUP }, |
| 380 | 380 | |
| 381 | + /* Realtek hub in Dell WD19 (Type-C) */ | |
| 382 | + { USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM }, | |
| 383 | + | |
| 384 | + /* Generic RTL8153 based ethernet adapters */ | |
| 385 | + { USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM }, | |
| 386 | + | |
| 381 | 387 | /* Action Semiconductor flash disk */ |
| 382 | 388 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = |
| 383 | 389 | USB_QUIRK_STRING_FETCH_255 }, |
| @@ -136,7 +136,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) · 135 unmodified lines | ||
| 136 | 136 | xhci->quirks |= XHCI_AMD_PLL_FIX; |
| 137 | 137 | |
| 138 | 138 | if (pdev->vendor == PCI_VENDOR_ID_AMD && |
| 139 | − (pdev->device == 0x15e0 || | |
| 139 | + (pdev->device == 0x145c || | |
| 140 | + pdev->device == 0x15e0 || | |
| 140 | 141 | pdev->device == 0x15e1 || |
| 141 | 142 | pdev->device == 0x43bb)) |
| 142 | 143 | xhci->quirks |= XHCI_SUSPEND_DELAY; |
| @@ -445,6 +445,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); · 444 unmodified lines | ||
| 445 | 445 | static struct platform_driver usb_xhci_driver = { |
| 446 | 446 | .probe = xhci_plat_probe, |
| 447 | 447 | .remove = xhci_plat_remove, |
| 448 | + .shutdown = usb_hcd_platform_shutdown, | |
| 448 | 449 | .driver = { |
| 449 | 450 | .name = "xhci-hcd", |
| 450 | 451 | .pm = &xhci_plat_pm_ops, |
| @@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb, · 288 unmodified lines | ||
| 289 | 289 | ), |
| 290 | 290 | TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x", |
| 291 | 291 | __entry->epnum, __entry->dir_in ? "in" : "out", |
| 292 | − ({ char *s; | |
| 293 | − switch (__entry->type) { | |
| 294 | − case USB_ENDPOINT_XFER_INT: | |
| 295 | − s = "intr"; | |
| 296 | − break; | |
| 297 | − case USB_ENDPOINT_XFER_CONTROL: | |
| 298 | − s = "control"; | |
| 299 | − break; | |
| 300 | − case USB_ENDPOINT_XFER_BULK: | |
| 301 | − s = "bulk"; | |
| 302 | − break; | |
| 303 | − case USB_ENDPOINT_XFER_ISOC: | |
| 304 | − s = "isoc"; | |
| 305 | − break; | |
| 306 | − default: | |
| 307 | − s = "UNKNOWN"; | |
| 308 | − } s; }), __entry->urb, __entry->pipe, __entry->slot_id, | |
| 292 | + __print_symbolic(__entry->type, | |
| 293 | + { USB_ENDPOINT_XFER_INT, "intr" }, | |
| 294 | + { USB_ENDPOINT_XFER_CONTROL, "control" }, | |
| 295 | + { USB_ENDPOINT_XFER_BULK, "bulk" }, | |
| 296 | + { USB_ENDPOINT_XFER_ISOC, "isoc" }), | |
| 297 | + __entry->urb, __entry->pipe, __entry->slot_id, | |
| 309 | 298 | __entry->actual, __entry->length, __entry->num_mapped_sgs, |
| 310 | 299 | __entry->num_sgs, __entry->stream, __entry->flags |
| 311 | 300 | ) |
| @@ -1183,6 +1183,8 @@ static const struct usb_device_id option_ids[] = { · 1182 unmodified lines | ||
| 1183 | 1183 | .driver_info = NCTRL(0) }, |
| 1184 | 1184 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ |
| 1185 | 1185 | .driver_info = NCTRL(0) | RSVD(3) }, |
| 1186 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110b, 0xff), /* Telit ME910G1 (ECM) */ | |
| 1187 | + .driver_info = NCTRL(0) }, | |
| 1186 | 1188 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), |
| 1187 | 1189 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, |
| 1188 | 1190 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), |
| @@ -99,6 +99,7 @@ static const struct usb_device_id id_table[] = { · 98 unmodified lines | ||
| 99 | 99 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, |
| 100 | 100 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
| 101 | 101 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, |
| 102 | + { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) }, | |
| 102 | 103 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, |
| 103 | 104 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, |
| 104 | 105 | { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, |
| @@ -130,6 +130,7 @@ · 129 unmodified lines | ||
| 130 | 130 | #define HP_LM920_PRODUCT_ID 0x026b |
| 131 | 131 | #define HP_TD620_PRODUCT_ID 0x0956 |
| 132 | 132 | #define HP_LD960_PRODUCT_ID 0x0b39 |
| 133 | +#define HP_LD381_PRODUCT_ID 0x0f7f | |
| 133 | 134 | #define HP_LCM220_PRODUCT_ID 0x3139 |
| 134 | 135 | #define HP_LCM960_PRODUCT_ID 0x3239 |
| 135 | 136 | #define HP_LD220_PRODUCT_ID 0x3524 |
| @@ -271,6 +271,9 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt) · 270 unmodified lines | ||
| 271 | 271 | return; |
| 272 | 272 | |
| 273 | 273 | dp = typec_altmode_get_drvdata(alt); |
| 274 | + if (!dp) | |
| 275 | + return; | |
| 276 | + | |
| 274 | 277 | dp->data.conf = 0; |
| 275 | 278 | dp->data.status = 0; |
| 276 | 279 | dp->initialized = false; |
| @@ -285,6 +288,8 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, · 8 unmodified lines | ||
| 285 | 288 | struct typec_altmode *alt; |
| 286 | 289 | struct ucsi_dp *dp; |
| 287 | 290 | |
| 291 | + mutex_lock(&con->lock); | |
| 292 | + | |
| 288 | 293 | /* We can't rely on the firmware with the capabilities. */ |
| 289 | 294 | desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE; |
| 290 | 295 | |
| @@ -293,12 +298,15 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, · 2 unmodified lines | ||
| 293 | 298 | desc->vdo |= all_assignments << 16; |
| 294 | 299 | |
| 295 | 300 | alt = typec_port_register_altmode(con->port, desc); |
| 296 | − if (IS_ERR(alt)) | |
| 301 | + if (IS_ERR(alt)) { | |
| 302 | + mutex_unlock(&con->lock); | |
| 297 | 303 | return alt; |
| 304 | + } | |
| 298 | 305 | |
| 299 | 306 | dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL); |
| 300 | 307 | if (!dp) { |
| 301 | 308 | typec_unregister_altmode(alt); |
| 309 | + mutex_unlock(&con->lock); | |
| 302 | 310 | return ERR_PTR(-ENOMEM); |
| 303 | 311 | } |
| 304 | 312 | |
| @@ -311,5 +319,7 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, · 6 unmodified lines | ||
| 311 | 319 | alt->ops = &ucsi_displayport_ops; |
| 312 | 320 | typec_altmode_set_drvdata(alt, dp); |
| 313 | 321 | |
| 322 | + mutex_unlock(&con->lock); | |
| 323 | + | |
| 314 | 324 | return alt; |
| 315 | 325 | } |
| @@ -959,8 +959,8 @@ out_iput: · 958 unmodified lines | ||
| 959 | 959 | iput(vb->vb_dev_info.inode); |
| 960 | 960 | out_kern_unmount: |
| 961 | 961 | kern_unmount(balloon_mnt); |
| 962 | −#endif | |
| 963 | 962 | out_del_vqs: |
| 963 | +#endif | |
| 964 | 964 | vdev->config->del_vqs(vdev); |
| 965 | 965 | out_free_vb: |
| 966 | 966 | kfree(vb); |
| @@ -2203,10 +2203,10 @@ void vring_del_virtqueue(struct virtqueue *_vq) · 2202 unmodified lines | ||
| 2203 | 2203 | vq->split.queue_size_in_bytes, |
| 2204 | 2204 | vq->split.vring.desc, |
| 2205 | 2205 | vq->split.queue_dma_addr); |
| 2206 | − | |
| 2207 | − kfree(vq->split.desc_state); | |
| 2208 | 2206 | } |
| 2209 | 2207 | } |
| 2208 | + if (!vq->packed_ring) | |
| 2209 | + kfree(vq->split.desc_state); | |
| 2210 | 2210 | list_del(&_vq->list); |
| 2211 | 2211 | kfree(vq); |
| 2212 | 2212 | } |
| @@ -1,10 +1,12 @@ | ||
| 1 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | 2 | /* iTCO Vendor Specific Support hooks */ |
| 3 | 3 | #ifdef CONFIG_ITCO_VENDOR_SUPPORT |
| 4 | +extern int iTCO_vendorsupport; | |
| 4 | 5 | extern void iTCO_vendor_pre_start(struct resource *, unsigned int); |
| 5 | 6 | extern void iTCO_vendor_pre_stop(struct resource *); |
| 6 | 7 | extern int iTCO_vendor_check_noreboot_on(void); |
| 7 | 8 | #else |
| 9 | +#define iTCO_vendorsupport 0 | |
| 8 | 10 | #define iTCO_vendor_pre_start(acpibase, heartbeat) {} |
| 9 | 11 | #define iTCO_vendor_pre_stop(acpibase) {} |
| 10 | 12 | #define iTCO_vendor_check_noreboot_on() 1 |
| @@ -39,8 +39,10 @@ · 38 unmodified lines | ||
| 39 | 39 | /* Broken BIOS */ |
| 40 | 40 | #define BROKEN_BIOS 911 |
| 41 | 41 | |
| 42 | −static int vendorsupport; | |
| 43 | −module_param(vendorsupport, int, 0); | |
| 42 | +int iTCO_vendorsupport; | |
| 43 | +EXPORT_SYMBOL(iTCO_vendorsupport); | |
| 44 | + | |
| 45 | +module_param_named(vendorsupport, iTCO_vendorsupport, int, 0); | |
| 44 | 46 | MODULE_PARM_DESC(vendorsupport, "iTCO vendor specific support mode, default=" |
| 45 | 47 | "0 (none), 1=SuperMicro Pent3, 911=Broken SMI BIOS"); |
| 46 | 48 | |
| @@ -152,7 +154,7 @@ static void broken_bios_stop(struct resource *smires) · 105 unmodified lines | ||
| 152 | 154 | void iTCO_vendor_pre_start(struct resource *smires, |
| 153 | 155 | unsigned int heartbeat) |
| 154 | 156 | { |
| 155 | − switch (vendorsupport) { | |
| 157 | + switch (iTCO_vendorsupport) { | |
| 156 | 158 | case SUPERMICRO_OLD_BOARD: |
| 157 | 159 | supermicro_old_pre_start(smires); |
| 158 | 160 | break; |
| @@ -165,7 +167,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_start); · 6 unmodified lines | ||
| 165 | 167 | |
| 166 | 168 | void iTCO_vendor_pre_stop(struct resource *smires) |
| 167 | 169 | { |
| 168 | − switch (vendorsupport) { | |
| 170 | + switch (iTCO_vendorsupport) { | |
| 169 | 171 | case SUPERMICRO_OLD_BOARD: |
| 170 | 172 | supermicro_old_pre_stop(smires); |
| 171 | 173 | break; |
| @@ -178,7 +180,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_stop); · 6 unmodified lines | ||
| 178 | 180 | |
| 179 | 181 | int iTCO_vendor_check_noreboot_on(void) |
| 180 | 182 | { |
| 181 | − switch (vendorsupport) { | |
| 183 | + switch (iTCO_vendorsupport) { | |
| 182 | 184 | case SUPERMICRO_OLD_BOARD: |
| 183 | 185 | return 0; |
| 184 | 186 | default: |
| @@ -189,13 +191,13 @@ EXPORT_SYMBOL(iTCO_vendor_check_noreboot_on); · 4 unmodified lines | ||
| 189 | 191 | |
| 190 | 192 | static int __init iTCO_vendor_init_module(void) |
| 191 | 193 | { |
| 192 | − if (vendorsupport == SUPERMICRO_NEW_BOARD) { | |
| 194 | + if (iTCO_vendorsupport == SUPERMICRO_NEW_BOARD) { | |
| 193 | 195 | pr_warn("Option vendorsupport=%d is no longer supported, " |
| 194 | 196 | "please use the w83627hf_wdt driver instead\n", |
| 195 | 197 | SUPERMICRO_NEW_BOARD); |
| 196 | 198 | return -EINVAL; |
| 197 | 199 | } |
| 198 | − pr_info("vendor-support=%d\n", vendorsupport); | |
| 200 | + pr_info("vendor-support=%d\n", iTCO_vendorsupport); | |
| 199 | 201 | return 0; |
| 200 | 202 | } |
| 201 | 203 | |
| @@ -459,13 +459,25 @@ static int iTCO_wdt_probe(struct platform_device *pdev) · 458 unmodified lines | ||
| 459 | 459 | if (!p->tco_res) |
| 460 | 460 | return -ENODEV; |
| 461 | 461 | |
| 462 | − p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); | |
| 463 | − if (!p->smi_res) | |
| 464 | − return -ENODEV; | |
| 465 | − | |
| 466 | 462 | p->iTCO_version = pdata->version; |
| 467 | 463 | p->pci_dev = to_pci_dev(dev->parent); |
| 468 | 464 | |
| 465 | + p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); | |
| 466 | + if (p->smi_res) { | |
| 467 | + /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ | |
| 468 | + if (!devm_request_region(dev, p->smi_res->start, | |
| 469 | + resource_size(p->smi_res), | |
| 470 | + pdev->name)) { | |
| 471 | + pr_err("I/O address 0x%04llx already in use, device disabled\n", | |
| 472 | + (u64)SMI_EN(p)); | |
| 473 | + return -EBUSY; | |
| 474 | + } | |
| 475 | + } else if (iTCO_vendorsupport || | |
| 476 | + turn_SMI_watchdog_clear_off >= p->iTCO_version) { | |
| 477 | + pr_err("SMI I/O resource is missing\n"); | |
| 478 | + return -ENODEV; | |
| 479 | + } | |
| 480 | + | |
| 469 | 481 | iTCO_wdt_no_reboot_bit_setup(p, pdata); |
| 470 | 482 | |
| 471 | 483 | /* |
| @@ -492,14 +504,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev) · 20 unmodified lines | ||
| 492 | 504 | /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ |
| 493 | 505 | p->update_no_reboot_bit(p->no_reboot_priv, true); |
| 494 | 506 | |
| 495 | − /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ | |
| 496 | − if (!devm_request_region(dev, p->smi_res->start, | |
| 497 | − resource_size(p->smi_res), | |
| 498 | − pdev->name)) { | |
| 499 | − pr_err("I/O address 0x%04llx already in use, device disabled\n", | |
| 500 | − (u64)SMI_EN(p)); | |
| 501 | − return -EBUSY; | |
| 502 | − } | |
| 503 | 507 | if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { |
| 504 | 508 | /* |
| 505 | 509 | * Bit 13: TCO_EN -> 0 |
| @@ -19,7 +19,7 @@ · 18 unmodified lines | ||
| 19 | 19 | void afs_put_addrlist(struct afs_addr_list *alist) |
| 20 | 20 | { |
| 21 | 21 | if (alist && refcount_dec_and_test(&alist->usage)) |
| 22 | − call_rcu(&alist->rcu, (rcu_callback_t)kfree); | |
| 22 | + kfree_rcu(alist, rcu); | |
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | /* |
| @@ -81,7 +81,7 @@ enum afs_call_state { · 80 unmodified lines | ||
| 81 | 81 | * List of server addresses. |
| 82 | 82 | */ |
| 83 | 83 | struct afs_addr_list { |
| 84 | − struct rcu_head rcu; /* Must be first */ | |
| 84 | + struct rcu_head rcu; | |
| 85 | 85 | refcount_t usage; |
| 86 | 86 | u32 version; /* Version */ |
| 87 | 87 | unsigned char max_addrs; |
| @@ -856,9 +856,9 @@ static void clear_incompat_bg_bits(struct btrfs_fs_info *fs_info, u64 flags) · 855 unmodified lines | ||
| 856 | 856 | found_raid1c34 = true; |
| 857 | 857 | up_read(&sinfo->groups_sem); |
| 858 | 858 | } |
| 859 | − if (found_raid56) | |
| 859 | + if (!found_raid56) | |
| 860 | 860 | btrfs_clear_fs_incompat(fs_info, RAID56); |
| 861 | − if (found_raid1c34) | |
| 861 | + if (!found_raid1c34) | |
| 862 | 862 | btrfs_clear_fs_incompat(fs_info, RAID1C34); |
| 863 | 863 | } |
| 864 | 864 | } |
| @@ -9496,6 +9496,10 @@ out_fail: · 9495 unmodified lines | ||
| 9496 | 9496 | ret = btrfs_sync_log(trans, BTRFS_I(old_inode)->root, &ctx); |
| 9497 | 9497 | if (ret) |
| 9498 | 9498 | commit_transaction = true; |
| 9499 | + } else if (sync_log) { | |
| 9500 | + mutex_lock(&root->log_mutex); | |
| 9501 | + list_del(&ctx.list); | |
| 9502 | + mutex_unlock(&root->log_mutex); | |
| 9499 | 9503 | } |
| 9500 | 9504 | if (commit_transaction) { |
| 9501 | 9505 | ret = btrfs_commit_transaction(trans); |
| @@ -555,7 +555,6 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, · 554 unmodified lines | ||
| 555 | 555 | if (server->ops->close) |
| 556 | 556 | server->ops->close(xid, tcon, &fid); |
| 557 | 557 | cifs_del_pending_open(&open); |
| 558 | − fput(file); | |
| 559 | 558 | rc = -ENOMEM; |
| 560 | 559 | } |
| 561 | 560 | |
| @@ -1169,7 +1169,8 @@ try_again: · 1168 unmodified lines | ||
| 1169 | 1169 | rc = posix_lock_file(file, flock, NULL); |
| 1170 | 1170 | up_write(&cinode->lock_sem); |
| 1171 | 1171 | if (rc == FILE_LOCK_DEFERRED) { |
| 1172 | − rc = wait_event_interruptible(flock->fl_wait, !flock->fl_blocker); | |
| 1172 | + rc = wait_event_interruptible(flock->fl_wait, | |
| 1173 | + list_empty(&flock->fl_blocked_member)); | |
| 1173 | 1174 | if (!rc) |
| 1174 | 1175 | goto try_again; |
| 1175 | 1176 | locks_delete_block(flock); |
| @@ -2191,7 +2191,7 @@ int cifs_getattr(const struct path *path, struct kstat *stat, · 2190 unmodified lines | ||
| 2191 | 2191 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) |
| 2192 | 2192 | stat->gid = current_fsgid(); |
| 2193 | 2193 | } |
| 2194 | − return rc; | |
| 2194 | + return 0; | |
| 2195 | 2195 | } |
| 2196 | 2196 | |
| 2197 | 2197 | int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start, |
| @@ -2222,6 +2222,8 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, · 2221 unmodified lines | ||
| 2222 | 2222 | goto qdf_free; |
| 2223 | 2223 | } |
| 2224 | 2224 | |
| 2225 | + atomic_inc(&tcon->num_remote_opens); | |
| 2226 | + | |
| 2225 | 2227 | qd_rsp = (struct smb2_query_directory_rsp *)rsp_iov[1].iov_base; |
| 2226 | 2228 | if (qd_rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) { |
| 2227 | 2229 | trace_smb3_query_dir_done(xid, fid->persistent_fid, |
| @@ -3417,7 +3419,7 @@ static int smb3_fiemap(struct cifs_tcon *tcon, · 1189 unmodified lines | ||
| 3417 | 3419 | if (rc) |
| 3418 | 3420 | goto out; |
| 3419 | 3421 | |
| 3420 | − if (out_data_len < sizeof(struct file_allocated_range_buffer)) { | |
| 3422 | + if (out_data_len && out_data_len < sizeof(struct file_allocated_range_buffer)) { | |
| 3421 | 3423 | rc = -EINVAL; |
| 3422 | 3424 | goto out; |
| 3423 | 3425 | } |
| @@ -538,6 +538,15 @@ int fscrypt_drop_inode(struct inode *inode) · 537 unmodified lines | ||
| 538 | 538 | return 0; |
| 539 | 539 | mk = ci->ci_master_key->payload.data[0]; |
| 540 | 540 | |
| 541 | + /* | |
| 542 | + * With proper, non-racy use of FS_IOC_REMOVE_ENCRYPTION_KEY, all inodes | |
| 543 | + * protected by the key were cleaned by sync_filesystem(). But if | |
| 544 | + * userspace is still using the files, inodes can be dirtied between | |
| 545 | + * then and now. We mustn't lose any writes, so skip dirty inodes here. | |
| 546 | + */ | |
| 547 | + if (inode->i_state & I_DIRTY_ALL) | |
| 548 | + return 0; | |
| 549 | + | |
| 541 | 550 | /* |
| 542 | 551 | * Note: since we aren't holding ->mk_secret_sem, the result here can |
| 543 | 552 | * immediately become outdated. But there's no correctness problem with |
| @@ -1854,9 +1854,9 @@ fetch_events: · 1853 unmodified lines | ||
| 1854 | 1854 | waiter = true; |
| 1855 | 1855 | init_waitqueue_entry(&wait, current); |
| 1856 | 1856 | |
| 1857 | − spin_lock_irq(&ep->wq.lock); | |
| 1857 | + write_lock_irq(&ep->lock); | |
| 1858 | 1858 | __add_wait_queue_exclusive(&ep->wq, &wait); |
| 1859 | − spin_unlock_irq(&ep->wq.lock); | |
| 1859 | + write_unlock_irq(&ep->lock); | |
| 1860 | 1860 | } |
| 1861 | 1861 | |
| 1862 | 1862 | for (;;) { |
| @@ -1904,9 +1904,9 @@ send_events: · 41 unmodified lines | ||
| 1904 | 1904 | goto fetch_events; |
| 1905 | 1905 | |
| 1906 | 1906 | if (waiter) { |
| 1907 | − spin_lock_irq(&ep->wq.lock); | |
| 1907 | + write_lock_irq(&ep->lock); | |
| 1908 | 1908 | __remove_wait_queue(&ep->wq, &wait); |
| 1909 | − spin_unlock_irq(&ep->wq.lock); | |
| 1909 | + write_unlock_irq(&ep->lock); | |
| 1910 | 1910 | } |
| 1911 | 1911 | |
| 1912 | 1912 | return res; |
| @@ -540,9 +540,14 @@ static int alloc_fd(unsigned start, unsigned flags) · 539 unmodified lines | ||
| 540 | 540 | return __alloc_fd(current->files, start, rlimit(RLIMIT_NOFILE), flags); |
| 541 | 541 | } |
| 542 | 542 | |
| 543 | +int __get_unused_fd_flags(unsigned flags, unsigned long nofile) | |
| 544 | +{ | |
| 545 | + return __alloc_fd(current->files, 0, nofile, flags); | |
| 546 | +} | |
| 547 | + | |
| 543 | 548 | int get_unused_fd_flags(unsigned flags) |
| 544 | 549 | { |
| 545 | − return __alloc_fd(current->files, 0, rlimit(RLIMIT_NOFILE), flags); | |
| 550 | + return __get_unused_fd_flags(flags, rlimit(RLIMIT_NOFILE)); | |
| 546 | 551 | } |
| 547 | 552 | EXPORT_SYMBOL(get_unused_fd_flags); |
| 548 | 553 | |
| @@ -276,12 +276,10 @@ static void flush_bg_queue(struct fuse_conn *fc) · 275 unmodified lines | ||
| 276 | 276 | void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req) |
| 277 | 277 | { |
| 278 | 278 | struct fuse_iqueue *fiq = &fc->iq; |
| 279 | − bool async; | |
| 280 | 279 | |
| 281 | 280 | if (test_and_set_bit(FR_FINISHED, &req->flags)) |
| 282 | 281 | goto put_request; |
| 283 | 282 | |
| 284 | − async = req->args->end; | |
| 285 | 283 | /* |
| 286 | 284 | * test_and_set_bit() implies smp_mb() between bit |
| 287 | 285 | * changing and below intr_entry check. Pairs with |
| @@ -324,7 +322,7 @@ void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req) · 36 unmodified lines | ||
| 324 | 322 | wake_up(&req->waitq); |
| 325 | 323 | } |
| 326 | 324 | |
| 327 | − if (async) | |
| 325 | + if (test_bit(FR_ASYNC, &req->flags)) | |
| 328 | 326 | req->args->end(fc, req->args, req->out.h.error); |
| 329 | 327 | put_request: |
| 330 | 328 | fuse_put_request(fc, req); |
| @@ -471,6 +469,8 @@ static void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args) · 140 unmodified lines | ||
| 471 | 469 | req->in.h.opcode = args->opcode; |
| 472 | 470 | req->in.h.nodeid = args->nodeid; |
| 473 | 471 | req->args = args; |
| 472 | + if (args->end) | |
| 473 | + __set_bit(FR_ASYNC, &req->flags); | |
| 474 | 474 | } |
| 475 | 475 | |
| 476 | 476 | ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) |
| @@ -301,6 +301,7 @@ struct fuse_io_priv { · 300 unmodified lines | ||
| 301 | 301 | * FR_SENT: request is in userspace, waiting for an answer |
| 302 | 302 | * FR_FINISHED: request is finished |
| 303 | 303 | * FR_PRIVATE: request is on private list |
| 304 | + * FR_ASYNC: request is asynchronous | |
| 304 | 305 | */ |
| 305 | 306 | enum fuse_req_flag { |
| 306 | 307 | FR_ISREPLY, |
| @@ -314,6 +315,7 @@ enum fuse_req_flag { · 7 unmodified lines | ||
| 314 | 315 | FR_SENT, |
| 315 | 316 | FR_FINISHED, |
| 316 | 317 | FR_PRIVATE, |
| 318 | + FR_ASYNC, | |
| 317 | 319 | }; |
| 318 | 320 | |
| 319 | 321 | /** |
| @@ -1248,7 +1248,7 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry, · 1247 unmodified lines | ||
| 1248 | 1248 | if (!(file->f_mode & FMODE_OPENED)) |
| 1249 | 1249 | return finish_no_open(file, d); |
| 1250 | 1250 | dput(d); |
| 1251 | − return 0; | |
| 1251 | + return excl && (flags & O_CREAT) ? -EEXIST : 0; | |
| 1252 | 1252 | } |
| 1253 | 1253 | |
| 1254 | 1254 | BUG_ON(d != NULL); |
| @@ -138,6 +138,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) · 137 unmodified lines | ||
| 138 | 138 | inode->i_sb = sb; |
| 139 | 139 | inode->i_blkbits = sb->s_blocksize_bits; |
| 140 | 140 | inode->i_flags = 0; |
| 141 | + atomic64_set(&inode->i_sequence, 0); | |
| 141 | 142 | atomic_set(&inode->i_count, 1); |
| 142 | 143 | inode->i_op = &empty_iops; |
| 143 | 144 | inode->i_fop = &no_open_fops; |
| @@ -191,7 +191,6 @@ struct fixed_file_data { · 190 unmodified lines | ||
| 191 | 191 | struct llist_head put_llist; |
| 192 | 192 | struct work_struct ref_work; |
| 193 | 193 | struct completion done; |
| 194 | − struct rcu_head rcu; | |
| 195 | 194 | }; |
| 196 | 195 | |
| 197 | 196 | struct io_ring_ctx { |
| @@ -344,6 +343,7 @@ struct io_accept { · 146 unmodified lines | ||
| 344 | 343 | struct sockaddr __user *addr; |
| 345 | 344 | int __user *addr_len; |
| 346 | 345 | int flags; |
| 346 | + unsigned long nofile; | |
| 347 | 347 | }; |
| 348 | 348 | |
| 349 | 349 | struct io_sync { |
| @@ -398,6 +398,7 @@ struct io_open { · 48 unmodified lines | ||
| 398 | 398 | struct filename *filename; |
| 399 | 399 | struct statx __user *buffer; |
| 400 | 400 | struct open_how how; |
| 401 | + unsigned long nofile; | |
| 401 | 402 | }; |
| 402 | 403 | |
| 403 | 404 | struct io_files_update { |
| @@ -2578,6 +2579,7 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) · 2174 unmodified lines | ||
| 2578 | 2579 | return ret; |
| 2579 | 2580 | } |
| 2580 | 2581 | |
| 2582 | + req->open.nofile = rlimit(RLIMIT_NOFILE); | |
| 2581 | 2583 | req->flags |= REQ_F_NEED_CLEANUP; |
| 2582 | 2584 | return 0; |
| 2583 | 2585 | } |
| @@ -2619,6 +2621,7 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) · 35 unmodified lines | ||
| 2619 | 2621 | return ret; |
| 2620 | 2622 | } |
| 2621 | 2623 | |
| 2624 | + req->open.nofile = rlimit(RLIMIT_NOFILE); | |
| 2622 | 2625 | req->flags |= REQ_F_NEED_CLEANUP; |
| 2623 | 2626 | return 0; |
| 2624 | 2627 | } |
| @@ -2637,7 +2640,7 @@ static int io_openat2(struct io_kiocb *req, struct io_kiocb **nxt, · 12 unmodified lines | ||
| 2637 | 2640 | if (ret) |
| 2638 | 2641 | goto err; |
| 2639 | 2642 | |
| 2640 | − ret = get_unused_fd_flags(req->open.how.flags); | |
| 2643 | + ret = __get_unused_fd_flags(req->open.how.flags, req->open.nofile); | |
| 2641 | 2644 | if (ret < 0) |
| 2642 | 2645 | goto err; |
| 2643 | 2646 | |
| @@ -3322,6 +3325,7 @@ static int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) · 678 unmodified lines | ||
| 3322 | 3325 | accept->addr = u64_to_user_ptr(READ_ONCE(sqe->addr)); |
| 3323 | 3326 | accept->addr_len = u64_to_user_ptr(READ_ONCE(sqe->addr2)); |
| 3324 | 3327 | accept->flags = READ_ONCE(sqe->accept_flags); |
| 3328 | + accept->nofile = rlimit(RLIMIT_NOFILE); | |
| 3325 | 3329 | return 0; |
| 3326 | 3330 | #else |
| 3327 | 3331 | return -EOPNOTSUPP; |
| @@ -3338,7 +3342,8 @@ static int __io_accept(struct io_kiocb *req, struct io_kiocb **nxt, · 10 unmodified lines | ||
| 3338 | 3342 | |
| 3339 | 3343 | file_flags = force_nonblock ? O_NONBLOCK : 0; |
| 3340 | 3344 | ret = __sys_accept4_file(req->file, file_flags, accept->addr, |
| 3341 | − accept->addr_len, accept->flags); | |
| 3345 | + accept->addr_len, accept->flags, | |
| 3346 | + accept->nofile); | |
| 3342 | 3347 | if (ret == -EAGAIN && force_nonblock) |
| 3343 | 3348 | return -EAGAIN; |
| 3344 | 3349 | if (ret == -ERESTARTSYS) |
| @@ -4132,6 +4137,9 @@ static int io_req_defer_prep(struct io_kiocb *req, · 787 unmodified lines | ||
| 4132 | 4137 | { |
| 4133 | 4138 | ssize_t ret = 0; |
| 4134 | 4139 | |
| 4140 | + if (!sqe) | |
| 4141 | + return 0; | |
| 4142 | + | |
| 4135 | 4143 | if (io_op_defs[req->opcode].file_table) { |
| 4136 | 4144 | ret = io_grab_files(req); |
| 4137 | 4145 | if (unlikely(ret)) |
| @@ -4908,6 +4916,11 @@ err_req: · 770 unmodified lines | ||
| 4908 | 4916 | if (sqe_flags & (IOSQE_IO_LINK|IOSQE_IO_HARDLINK)) { |
| 4909 | 4917 | req->flags |= REQ_F_LINK; |
| 4910 | 4918 | INIT_LIST_HEAD(&req->link_list); |
| 4919 | + | |
| 4920 | + if (io_alloc_async_ctx(req)) { | |
| 4921 | + ret = -EAGAIN; | |
| 4922 | + goto err_req; | |
| 4923 | + } | |
| 4911 | 4924 | ret = io_req_defer_prep(req, sqe); |
| 4912 | 4925 | if (ret) |
| 4913 | 4926 | req->flags |= REQ_F_FAIL_LINK; |
| @@ -5331,24 +5344,21 @@ static void io_file_ref_kill(struct percpu_ref *ref) · 417 unmodified lines | ||
| 5331 | 5344 | complete(&data->done); |
| 5332 | 5345 | } |
| 5333 | 5346 | |
| 5334 | −static void __io_file_ref_exit_and_free(struct rcu_head *rcu) | |
| 5347 | +static void io_file_ref_exit_and_free(struct work_struct *work) | |
| 5335 | 5348 | { |
| 5336 | − struct fixed_file_data *data = container_of(rcu, struct fixed_file_data, | |
| 5337 | − rcu); | |
| 5338 | − percpu_ref_exit(&data->refs); | |
| 5339 | − kfree(data); | |
| 5340 | −} | |
| 5349 | + struct fixed_file_data *data; | |
| 5350 | + | |
| 5351 | + data = container_of(work, struct fixed_file_data, ref_work); | |
| 5341 | 5352 | |
| 5342 | −static void io_file_ref_exit_and_free(struct rcu_head *rcu) | |
| 5343 | −{ | |
| 5344 | 5353 | /* |
| 5345 | − * We need to order our exit+free call against the potentially | |
| 5346 | − * existing call_rcu() for switching to atomic. One way to do that | |
| 5347 | − * is to have this rcu callback queue the final put and free, as we | |
| 5348 | − * could otherwise have a pre-existing atomic switch complete _after_ | |
| 5349 | − * the free callback we queued. | |
| 5354 | + * Ensure any percpu-ref atomic switch callback has run, it could have | |
| 5355 | + * been in progress when the files were being unregistered. Once | |
| 5356 | + * that's done, we can safely exit and free the ref and containing | |
| 5357 | + * data structure. | |
| 5350 | 5358 | */ |
| 5351 | − call_rcu(rcu, __io_file_ref_exit_and_free); | |
| 5359 | + rcu_barrier(); | |
| 5360 | + percpu_ref_exit(&data->refs); | |
| 5361 | + kfree(data); | |
| 5352 | 5362 | } |
| 5353 | 5363 | |
| 5354 | 5364 | static int io_sqe_files_unregister(struct io_ring_ctx *ctx) |
| @@ -5369,7 +5379,8 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx) · 14 unmodified lines | ||
| 5369 | 5379 | for (i = 0; i < nr_tables; i++) |
| 5370 | 5380 | kfree(data->table[i].files); |
| 5371 | 5381 | kfree(data->table); |
| 5372 | − call_rcu(&data->rcu, io_file_ref_exit_and_free); | |
| 5382 | + INIT_WORK(&data->ref_work, io_file_ref_exit_and_free); | |
| 5383 | + queue_work(system_wq, &data->ref_work); | |
| 5373 | 5384 | ctx->file_data = NULL; |
| 5374 | 5385 | ctx->nr_user_files = 0; |
| 5375 | 5386 | return 0; |
| @@ -725,7 +725,6 @@ static void __locks_delete_block(struct file_lock *waiter) · 724 unmodified lines | ||
| 725 | 725 | { |
| 726 | 726 | locks_delete_global_blocked(waiter); |
| 727 | 727 | list_del_init(&waiter->fl_blocked_member); |
| 728 | − waiter->fl_blocker = NULL; | |
| 729 | 728 | } |
| 730 | 729 | |
| 731 | 730 | static void __locks_wake_up_blocks(struct file_lock *blocker) |
| @@ -740,6 +739,13 @@ static void __locks_wake_up_blocks(struct file_lock *blocker) · 8 unmodified lines | ||
| 740 | 739 | waiter->fl_lmops->lm_notify(waiter); |
| 741 | 740 | else |
| 742 | 741 | wake_up(&waiter->fl_wait); |
| 742 | + | |
| 743 | + /* | |
| 744 | + * The setting of fl_blocker to NULL marks the "done" | |
| 745 | + * point in deleting a block. Paired with acquire at the top | |
| 746 | + * of locks_delete_block(). | |
| 747 | + */ | |
| 748 | + smp_store_release(&waiter->fl_blocker, NULL); | |
| 743 | 749 | } |
| 744 | 750 | } |
| 745 | 751 | |
| @@ -753,11 +759,42 @@ int locks_delete_block(struct file_lock *waiter) · 7 unmodified lines | ||
| 753 | 759 | { |
| 754 | 760 | int status = -ENOENT; |
| 755 | 761 | |
| 762 | + /* | |
| 763 | + * If fl_blocker is NULL, it won't be set again as this thread "owns" | |
| 764 | + * the lock and is the only one that might try to claim the lock. | |
| 765 | + * | |
| 766 | + * We use acquire/release to manage fl_blocker so that we can | |
| 767 | + * optimize away taking the blocked_lock_lock in many cases. | |
| 768 | + * | |
| 769 | + * The smp_load_acquire guarantees two things: | |
| 770 | + * | |
| 771 | + * 1/ that fl_blocked_requests can be tested locklessly. If something | |
| 772 | + * was recently added to that list it must have been in a locked region | |
| 773 | + * *before* the locked region when fl_blocker was set to NULL. | |
| 774 | + * | |
| 775 | + * 2/ that no other thread is accessing 'waiter', so it is safe to free | |
| 776 | + * it. __locks_wake_up_blocks is careful not to touch waiter after | |
| 777 | + * fl_blocker is released. | |
| 778 | + * | |
| 779 | + * If a lockless check of fl_blocker shows it to be NULL, we know that | |
| 780 | + * no new locks can be inserted into its fl_blocked_requests list, and | |
| 781 | + * can avoid doing anything further if the list is empty. | |
| 782 | + */ | |
| 783 | + if (!smp_load_acquire(&waiter->fl_blocker) && | |
| 784 | + list_empty(&waiter->fl_blocked_requests)) | |
| 785 | + return status; | |
| 786 | + | |
| 756 | 787 | spin_lock(&blocked_lock_lock); |
| 757 | 788 | if (waiter->fl_blocker) |
| 758 | 789 | status = 0; |
| 759 | 790 | __locks_wake_up_blocks(waiter); |
| 760 | 791 | __locks_delete_block(waiter); |
| 792 | + | |
| 793 | + /* | |
| 794 | + * The setting of fl_blocker to NULL marks the "done" point in deleting | |
| 795 | + * a block. Paired with acquire at the top of this function. | |
| 796 | + */ | |
| 797 | + smp_store_release(&waiter->fl_blocker, NULL); | |
| 761 | 798 | spin_unlock(&blocked_lock_lock); |
| 762 | 799 | return status; |
| 763 | 800 | } |
| @@ -1350,7 +1387,8 @@ static int posix_lock_inode_wait(struct inode *inode, struct file_lock *fl) · 586 unmodified lines | ||
| 1350 | 1387 | error = posix_lock_inode(inode, fl, NULL); |
| 1351 | 1388 | if (error != FILE_LOCK_DEFERRED) |
| 1352 | 1389 | break; |
| 1353 | − error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker); | |
| 1390 | + error = wait_event_interruptible(fl->fl_wait, | |
| 1391 | + list_empty(&fl->fl_blocked_member)); | |
| 1354 | 1392 | if (error) |
| 1355 | 1393 | break; |
| 1356 | 1394 | } |
| @@ -1435,7 +1473,8 @@ int locks_mandatory_area(struct inode *inode, struct file *filp, loff_t start, · 78 unmodified lines | ||
| 1435 | 1473 | error = posix_lock_inode(inode, &fl, NULL); |
| 1436 | 1474 | if (error != FILE_LOCK_DEFERRED) |
| 1437 | 1475 | break; |
| 1438 | − error = wait_event_interruptible(fl.fl_wait, !fl.fl_blocker); | |
| 1476 | + error = wait_event_interruptible(fl.fl_wait, | |
| 1477 | + list_empty(&fl.fl_blocked_member)); | |
| 1439 | 1478 | if (!error) { |
| 1440 | 1479 | /* |
| 1441 | 1480 | * If we've been sleeping someone might have |
| @@ -1638,7 +1677,8 @@ restart: · 196 unmodified lines | ||
| 1638 | 1677 | |
| 1639 | 1678 | locks_dispose_list(&dispose); |
| 1640 | 1679 | error = wait_event_interruptible_timeout(new_fl->fl_wait, |
| 1641 | − !new_fl->fl_blocker, break_time); | |
| 1680 | + list_empty(&new_fl->fl_blocked_member), | |
| 1681 | + break_time); | |
| 1642 | 1682 | |
| 1643 | 1683 | percpu_down_read(&file_rwsem); |
| 1644 | 1684 | spin_lock(&ctx->flc_lock); |
| @@ -2122,7 +2162,8 @@ static int flock_lock_inode_wait(struct inode *inode, struct file_lock *fl) · 477 unmodified lines | ||
| 2122 | 2162 | error = flock_lock_inode(inode, fl); |
| 2123 | 2163 | if (error != FILE_LOCK_DEFERRED) |
| 2124 | 2164 | break; |
| 2125 | − error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker); | |
| 2165 | + error = wait_event_interruptible(fl->fl_wait, | |
| 2166 | + list_empty(&fl->fl_blocked_member)); | |
| 2126 | 2167 | if (error) |
| 2127 | 2168 | break; |
| 2128 | 2169 | } |
| @@ -2399,7 +2440,8 @@ static int do_lock_file_wait(struct file *filp, unsigned int cmd, · 270 unmodified lines | ||
| 2399 | 2440 | error = vfs_lock_file(filp, cmd, fl, NULL); |
| 2400 | 2441 | if (error != FILE_LOCK_DEFERRED) |
| 2401 | 2442 | break; |
| 2402 | − error = wait_event_interruptible(fl->fl_wait, !fl->fl_blocker); | |
| 2443 | + error = wait_event_interruptible(fl->fl_wait, | |
| 2444 | + list_empty(&fl->fl_blocked_member)); | |
| 2403 | 2445 | if (error) |
| 2404 | 2446 | break; |
| 2405 | 2447 | } |
| @@ -153,6 +153,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) · 152 unmodified lines | ||
| 153 | 153 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) |
| 154 | 154 | goto error_0; |
| 155 | 155 | |
| 156 | + clp->cl_minorversion = cl_init->minorversion; | |
| 156 | 157 | clp->cl_nfs_mod = cl_init->nfs_mod; |
| 157 | 158 | if (!try_module_get(clp->cl_nfs_mod->owner)) |
| 158 | 159 | goto error_dealloc; |
| @@ -832,6 +832,8 @@ static int nfs_parse_source(struct fs_context *fc, · 831 unmodified lines | ||
| 832 | 832 | if (len > maxnamlen) |
| 833 | 833 | goto out_hostname; |
| 834 | 834 | |
| 835 | + kfree(ctx->nfs_server.hostname); | |
| 836 | + | |
| 835 | 837 | /* N.B. caller will free nfs_server.hostname in all cases */ |
| 836 | 838 | ctx->nfs_server.hostname = kmemdup_nul(dev_name, len, GFP_KERNEL); |
| 837 | 839 | if (!ctx->nfs_server.hostname) |
| @@ -1240,6 +1242,13 @@ static int nfs_fs_context_validate(struct fs_context *fc) · 402 unmodified lines | ||
| 1240 | 1242 | } |
| 1241 | 1243 | ctx->nfs_mod = nfs_mod; |
| 1242 | 1244 | } |
| 1245 | + | |
| 1246 | + /* Ensure the filesystem context has the correct fs_type */ | |
| 1247 | + if (fc->fs_type != ctx->nfs_mod->nfs_fs) { | |
| 1248 | + module_put(fc->fs_type->owner); | |
| 1249 | + __module_get(ctx->nfs_mod->nfs_fs->owner); | |
| 1250 | + fc->fs_type = ctx->nfs_mod->nfs_fs; | |
| 1251 | + } | |
| 1243 | 1252 | return 0; |
| 1244 | 1253 | |
| 1245 | 1254 | out_no_device_name: |
| @@ -31,6 +31,7 @@ static DEFINE_SPINLOCK(nfs_fscache_keys_lock); · 30 unmodified lines | ||
| 31 | 31 | struct nfs_server_key { |
| 32 | 32 | struct { |
| 33 | 33 | uint16_t nfsversion; /* NFS protocol version */ |
| 34 | + uint32_t minorversion; /* NFSv4 minor version */ | |
| 34 | 35 | uint16_t family; /* address family */ |
| 35 | 36 | __be16 port; /* IP port */ |
| 36 | 37 | } hdr; |
| @@ -55,6 +56,7 @@ void nfs_fscache_get_client_cookie(struct nfs_client *clp) · 18 unmodified lines | ||
| 55 | 56 | |
| 56 | 57 | memset(&key, 0, sizeof(key)); |
| 57 | 58 | key.hdr.nfsversion = clp->rpc_ops->version; |
| 59 | + key.hdr.minorversion = clp->cl_minorversion; | |
| 58 | 60 | key.hdr.family = clp->cl_addr.ss_family; |
| 59 | 61 | |
| 60 | 62 | switch (clp->cl_addr.ss_family) { |
| @@ -153,7 +153,7 @@ struct vfsmount *nfs_d_automount(struct path *path) · 152 unmodified lines | ||
| 153 | 153 | /* Open a new filesystem context, transferring parameters from the |
| 154 | 154 | * parent superblock, including the network namespace. |
| 155 | 155 | */ |
| 156 | − fc = fs_context_for_submount(&nfs_fs_type, path->dentry); | |
| 156 | + fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry); | |
| 157 | 157 | if (IS_ERR(fc)) |
| 158 | 158 | return ERR_CAST(fc); |
| 159 | 159 | |
| @@ -216,7 +216,6 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init) · 215 unmodified lines | ||
| 216 | 216 | INIT_LIST_HEAD(&clp->cl_ds_clients); |
| 217 | 217 | rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); |
| 218 | 218 | clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; |
| 219 | − clp->cl_minorversion = cl_init->minorversion; | |
| 220 | 219 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; |
| 221 | 220 | clp->cl_mig_gen = 1; |
| 222 | 221 | #if IS_ENABLED(CONFIG_NFS_V4_1) |
| @@ -860,9 +860,6 @@ cleanup_file: · 859 unmodified lines | ||
| 860 | 860 | * the return value of d_splice_alias(), then the caller needs to perform dput() |
| 861 | 861 | * on it after finish_open(). |
| 862 | 862 | * |
| 863 | − * On successful return @file is a fully instantiated open file. After this, if | |
| 864 | − * an error occurs in ->atomic_open(), it needs to clean up with fput(). | |
| 865 | − * | |
| 866 | 863 | * Returns zero on success or -errno if the open failed. |
| 867 | 864 | */ |
| 868 | 865 | int finish_open(struct file *file, struct dentry *dentry, |
| @@ -93,6 +93,7 @@ config OVERLAY_FS_XINO_AUTO · 92 unmodified lines | ||
| 93 | 93 | bool "Overlayfs: auto enable inode number mapping" |
| 94 | 94 | default n |
| 95 | 95 | depends on OVERLAY_FS |
| 96 | + depends on 64BIT | |
| 96 | 97 | help |
| 97 | 98 | If this config option is enabled then overlay filesystems will use |
| 98 | 99 | unused high bits in undelying filesystem inode numbers to map all |
| @@ -244,6 +244,9 @@ static void ovl_aio_cleanup_handler(struct ovl_aio_req *aio_req) · 243 unmodified lines | ||
| 244 | 244 | if (iocb->ki_flags & IOCB_WRITE) { |
| 245 | 245 | struct inode *inode = file_inode(orig_iocb->ki_filp); |
| 246 | 246 | |
| 247 | + /* Actually acquired in ovl_write_iter() */ | |
| 248 | + __sb_writers_acquired(file_inode(iocb->ki_filp)->i_sb, | |
| 249 | + SB_FREEZE_WRITE); | |
| 247 | 250 | file_end_write(iocb->ki_filp); |
| 248 | 251 | ovl_copyattr(ovl_inode_real(inode), inode); |
| 249 | 252 | } |
| @@ -346,6 +349,9 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) · 96 unmodified lines | ||
| 346 | 349 | goto out; |
| 347 | 350 | |
| 348 | 351 | file_start_write(real.file); |
| 352 | + /* Pacify lockdep, same trick as done in aio_write() */ | |
| 353 | + __sb_writers_release(file_inode(real.file)->i_sb, | |
| 354 | + SB_FREEZE_WRITE); | |
| 349 | 355 | aio_req->fd = real; |
| 350 | 356 | real.flags = 0; |
| 351 | 357 | aio_req->orig_iocb = iocb; |
| @@ -318,7 +318,12 @@ static inline unsigned int ovl_xino_bits(struct super_block *sb) · 317 unmodified lines | ||
| 318 | 318 | return ovl_same_dev(sb) ? OVL_FS(sb)->xino_mode : 0; |
| 319 | 319 | } |
| 320 | 320 | |
| 321 | −static inline int ovl_inode_lock(struct inode *inode) | |
| 321 | +static inline void ovl_inode_lock(struct inode *inode) | |
| 322 | +{ | |
| 323 | + mutex_lock(&OVL_I(inode)->lock); | |
| 324 | +} | |
| 325 | + | |
| 326 | +static inline int ovl_inode_lock_interruptible(struct inode *inode) | |
| 322 | 327 | { |
| 323 | 328 | return mutex_lock_interruptible(&OVL_I(inode)->lock); |
| 324 | 329 | } |
| @@ -1411,6 +1411,8 @@ static int ovl_get_layers(struct super_block *sb, struct ovl_fs *ofs, · 1410 unmodified lines | ||
| 1411 | 1411 | if (ofs->config.xino == OVL_XINO_ON) |
| 1412 | 1412 | pr_info("\"xino=on\" is useless with all layers on same fs, ignore.\n"); |
| 1413 | 1413 | ofs->xino_mode = 0; |
| 1414 | + } else if (ofs->config.xino == OVL_XINO_OFF) { | |
| 1415 | + ofs->xino_mode = -1; | |
| 1414 | 1416 | } else if (ofs->config.xino == OVL_XINO_ON && ofs->xino_mode < 0) { |
| 1415 | 1417 | /* |
| 1416 | 1418 | * This is a roundup of number of bits needed for encoding |
| @@ -1623,8 +1625,13 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) · 206 unmodified lines | ||
| 1623 | 1625 | sb->s_stack_depth = 0; |
| 1624 | 1626 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 1625 | 1627 | /* Assume underlaying fs uses 32bit inodes unless proven otherwise */ |
| 1626 | − if (ofs->config.xino != OVL_XINO_OFF) | |
| 1628 | + if (ofs->config.xino != OVL_XINO_OFF) { | |
| 1627 | 1629 | ofs->xino_mode = BITS_PER_LONG - 32; |
| 1630 | + if (!ofs->xino_mode) { | |
| 1631 | + pr_warn("xino not supported on 32bit kernel, falling back to xino=off.\n"); | |
| 1632 | + ofs->config.xino = OVL_XINO_OFF; | |
| 1633 | + } | |
| 1634 | + } | |
| 1628 | 1635 | |
| 1629 | 1636 | /* alloc/destroy_inode needed for setting up traps in inode cache */ |
| 1630 | 1637 | sb->s_op = &ovl_super_operations; |
| @@ -509,7 +509,7 @@ int ovl_copy_up_start(struct dentry *dentry, int flags) · 508 unmodified lines | ||
| 509 | 509 | struct inode *inode = d_inode(dentry); |
| 510 | 510 | int err; |
| 511 | 511 | |
| 512 | − err = ovl_inode_lock(inode); | |
| 512 | + err = ovl_inode_lock_interruptible(inode); | |
| 513 | 513 | if (!err && ovl_already_copied_up_locked(dentry, flags)) { |
| 514 | 514 | err = 1; /* Already copied up */ |
| 515 | 515 | ovl_inode_unlock(inode); |
| @@ -764,7 +764,7 @@ int ovl_nlink_start(struct dentry *dentry) · 248 unmodified lines | ||
| 764 | 764 | return err; |
| 765 | 765 | } |
| 766 | 766 | |
| 767 | − err = ovl_inode_lock(inode); | |
| 767 | + err = ovl_inode_lock_interruptible(inode); | |
| 768 | 768 | if (err) |
| 769 | 769 | return err; |
| 770 | 770 | |
| @@ -33,7 +33,8 @@ bool __must_check curve25519(u8 mypublic[CURVE25519_KEY_SIZE], · 32 unmodified lines | ||
| 33 | 33 | const u8 secret[CURVE25519_KEY_SIZE], |
| 34 | 34 | const u8 basepoint[CURVE25519_KEY_SIZE]) |
| 35 | 35 | { |
| 36 | − if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519)) | |
| 36 | + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519) && | |
| 37 | + (!IS_ENABLED(CONFIG_CRYPTO_CURVE25519_X86) || IS_ENABLED(CONFIG_AS_ADX))) | |
| 37 | 38 | curve25519_arch(mypublic, secret, basepoint); |
| 38 | 39 | else |
| 39 | 40 | curve25519_generic(mypublic, secret, basepoint); |
| @@ -49,7 +50,8 @@ __must_check curve25519_generate_public(u8 pub[CURVE25519_KEY_SIZE], · 9 unmodified lines | ||
| 49 | 50 | CURVE25519_KEY_SIZE))) |
| 50 | 51 | return false; |
| 51 | 52 | |
| 52 | − if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519)) | |
| 53 | + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519) && | |
| 54 | + (!IS_ENABLED(CONFIG_CRYPTO_CURVE25519_X86) || IS_ENABLED(CONFIG_AS_ADX))) | |
| 53 | 55 | curve25519_base_arch(pub, secret); |
| 54 | 56 | else |
| 55 | 57 | curve25519_generic(pub, secret, curve25519_base_point); |
| @@ -81,7 +81,7 @@ struct drm_dp_vcpi { · 80 unmodified lines | ||
| 81 | 81 | * &drm_dp_mst_topology_mgr.base.lock. |
| 82 | 82 | * @num_sdp_stream_sinks: Number of stream sinks. Protected by |
| 83 | 83 | * &drm_dp_mst_topology_mgr.base.lock. |
| 84 | − * @available_pbn: Available bandwidth for this port. Protected by | |
| 84 | + * @full_pbn: Max possible bandwidth for this port. Protected by | |
| 85 | 85 | * &drm_dp_mst_topology_mgr.base.lock. |
| 86 | 86 | * @next: link to next port on this branch device |
| 87 | 87 | * @aux: i2c aux transport to talk to device connected to this port, protected |
| @@ -126,7 +126,7 @@ struct drm_dp_mst_port { · 38 unmodified lines | ||
| 126 | 126 | u8 dpcd_rev; |
| 127 | 127 | u8 num_sdp_streams; |
| 128 | 128 | u8 num_sdp_stream_sinks; |
| 129 | − uint16_t available_pbn; | |
| 129 | + uint16_t full_pbn; | |
| 130 | 130 | struct list_head next; |
| 131 | 131 | /** |
| 132 | 132 | * @mstb: the branch device connected to this port, if there is one. |
| @@ -122,8 +122,8 @@ · 121 unmodified lines | ||
| 122 | 122 | #define IMX8MN_CLK_I2C1 105 |
| 123 | 123 | #define IMX8MN_CLK_I2C2 106 |
| 124 | 124 | #define IMX8MN_CLK_I2C3 107 |
| 125 | −#define IMX8MN_CLK_I2C4 118 | |
| 126 | −#define IMX8MN_CLK_UART1 119 | |
| 125 | +#define IMX8MN_CLK_I2C4 108 | |
| 126 | +#define IMX8MN_CLK_UART1 109 | |
| 127 | 127 | #define IMX8MN_CLK_UART2 110 |
| 128 | 128 | #define IMX8MN_CLK_UART3 111 |
| 129 | 129 | #define IMX8MN_CLK_UART4 112 |
| @@ -62,6 +62,7 @@ struct css_task_iter { · 61 unmodified lines | ||
| 62 | 62 | struct list_head *mg_tasks_head; |
| 63 | 63 | struct list_head *dying_tasks_head; |
| 64 | 64 | |
| 65 | + struct list_head *cur_tasks_head; | |
| 65 | 66 | struct css_set *cur_cset; |
| 66 | 67 | struct css_set *cur_dcset; |
| 67 | 68 | struct task_struct *cur_task; |
| @@ -69,19 +69,23 @@ struct dmar_pci_notify_info { · 68 unmodified lines | ||
| 69 | 69 | extern struct rw_semaphore dmar_global_lock; |
| 70 | 70 | extern struct list_head dmar_drhd_units; |
| 71 | 71 | |
| 72 | −#define for_each_drhd_unit(drhd) \ | |
| 73 | − list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) | |
| 72 | +#define for_each_drhd_unit(drhd) \ | |
| 73 | + list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \ | |
| 74 | + dmar_rcu_check()) | |
| 74 | 75 | |
| 75 | 76 | #define for_each_active_drhd_unit(drhd) \ |
| 76 | − list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ | |
| 77 | + list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \ | |
| 78 | + dmar_rcu_check()) \ | |
| 77 | 79 | if (drhd->ignored) {} else |
| 78 | 80 | |
| 79 | 81 | #define for_each_active_iommu(i, drhd) \ |
| 80 | − list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ | |
| 82 | + list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \ | |
| 83 | + dmar_rcu_check()) \ | |
| 81 | 84 | if (i=drhd->iommu, drhd->ignored) {} else |
| 82 | 85 | |
| 83 | 86 | #define for_each_iommu(i, drhd) \ |
| 84 | − list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ | |
| 87 | + list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \ | |
| 88 | + dmar_rcu_check()) \ | |
| 85 | 89 | if (i=drhd->iommu, 0) {} else |
| 86 | 90 | |
| 87 | 91 | static inline bool dmar_rcu_check(void) |
| @@ -85,6 +85,7 @@ extern int f_dupfd(unsigned int from, struct file *file, unsigned flags); · 84 unmodified lines | ||
| 85 | 85 | extern int replace_fd(unsigned fd, struct file *file, unsigned flags); |
| 86 | 86 | extern void set_close_on_exec(unsigned int fd, int flag); |
| 87 | 87 | extern bool get_close_on_exec(unsigned int fd); |
| 88 | +extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile); | |
| 88 | 89 | extern int get_unused_fd_flags(unsigned flags); |
| 89 | 90 | extern void put_unused_fd(unsigned int fd); |
| 90 | 91 | |
| @@ -698,6 +698,7 @@ struct inode { · 697 unmodified lines | ||
| 698 | 698 | struct rcu_head i_rcu; |
| 699 | 699 | }; |
| 700 | 700 | atomic64_t i_version; |
| 701 | + atomic64_t i_sequence; /* see futex */ | |
| 701 | 702 | atomic_t i_count; |
| 702 | 703 | atomic_t i_dio_count; |
| 703 | 704 | atomic_t i_writecount; |
| @@ -31,23 +31,26 @@ struct task_struct; · 30 unmodified lines | ||
| 31 | 31 | |
| 32 | 32 | union futex_key { |
| 33 | 33 | struct { |
| 34 | + u64 i_seq; | |
| 34 | 35 | unsigned long pgoff; |
| 35 | − struct inode *inode; | |
| 36 | − int offset; | |
| 36 | + unsigned int offset; | |
| 37 | 37 | } shared; |
| 38 | 38 | struct { |
| 39 | + union { | |
| 40 | + struct mm_struct *mm; | |
| 41 | + u64 __tmp; | |
| 42 | + }; | |
| 39 | 43 | unsigned long address; |
| 40 | − struct mm_struct *mm; | |
| 41 | − int offset; | |
| 44 | + unsigned int offset; | |
| 42 | 45 | } private; |
| 43 | 46 | struct { |
| 47 | + u64 ptr; | |
| 44 | 48 | unsigned long word; |
| 45 | − void *ptr; | |
| 46 | − int offset; | |
| 49 | + unsigned int offset; | |
| 47 | 50 | } both; |
| 48 | 51 | }; |
| 49 | 52 | |
| 50 | −#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = NULL } } | |
| 53 | +#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = 0ULL } } | |
| 51 | 54 | |
| 52 | 55 | #ifdef CONFIG_FUTEX |
| 53 | 56 | enum { |
| @@ -245,18 +245,6 @@ static inline bool disk_part_scan_enabled(struct gendisk *disk) · 244 unmodified lines | ||
| 245 | 245 | !(disk->flags & GENHD_FL_NO_PART_SCAN); |
| 246 | 246 | } |
| 247 | 247 | |
| 248 | −static inline bool disk_has_partitions(struct gendisk *disk) | |
| 249 | −{ | |
| 250 | − bool ret = false; | |
| 251 | − | |
| 252 | − rcu_read_lock(); | |
| 253 | − if (rcu_dereference(disk->part_tbl)->len > 1) | |
| 254 | − ret = true; | |
| 255 | − rcu_read_unlock(); | |
| 256 | − | |
| 257 | − return ret; | |
| 258 | −} | |
| 259 | − | |
| 260 | 248 | static inline dev_t disk_devt(struct gendisk *disk) |
| 261 | 249 | { |
| 262 | 250 | return MKDEV(disk->major, disk->first_minor); |
| @@ -298,6 +286,7 @@ extern void disk_part_iter_exit(struct disk_part_iter *piter); · 35 unmodified lines | ||
| 298 | 286 | |
| 299 | 287 | extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, |
| 300 | 288 | sector_t sector); |
| 289 | +bool disk_has_partitions(struct gendisk *disk); | |
| 301 | 290 | |
| 302 | 291 | /* |
| 303 | 292 | * Macros to operate on percpu disk statistics: |
| @@ -2,15 +2,10 @@ · 1 unmodified line | ||
| 2 | 2 | #ifndef _INET_DIAG_H_ |
| 3 | 3 | #define _INET_DIAG_H_ 1 |
| 4 | 4 | |
| 5 | +#include <net/netlink.h> | |
| 5 | 6 | #include <uapi/linux/inet_diag.h> |
| 6 | 7 | |
| 7 | −struct net; | |
| 8 | −struct sock; | |
| 9 | 8 | struct inet_hashinfo; |
| 10 | −struct nlattr; | |
| 11 | −struct nlmsghdr; | |
| 12 | −struct sk_buff; | |
| 13 | −struct netlink_callback; | |
| 14 | 9 | |
| 15 | 10 | struct inet_diag_handler { |
| 16 | 11 | void (*dump)(struct sk_buff *skb, |
| @@ -62,6 +57,17 @@ int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk); · 45 unmodified lines | ||
| 62 | 57 | |
| 63 | 58 | void inet_diag_msg_common_fill(struct inet_diag_msg *r, struct sock *sk); |
| 64 | 59 | |
| 60 | +static inline size_t inet_diag_msg_attrs_size(void) | |
| 61 | +{ | |
| 62 | + return nla_total_size(1) /* INET_DIAG_SHUTDOWN */ | |
| 63 | + + nla_total_size(1) /* INET_DIAG_TOS */ | |
| 64 | +#if IS_ENABLED(CONFIG_IPV6) | |
| 65 | + + nla_total_size(1) /* INET_DIAG_TCLASS */ | |
| 66 | + + nla_total_size(1) /* INET_DIAG_SKV6ONLY */ | |
| 67 | +#endif | |
| 68 | + + nla_total_size(4) /* INET_DIAG_MARK */ | |
| 69 | + + nla_total_size(4); /* INET_DIAG_CLASS_ID */ | |
| 70 | +} | |
| 65 | 71 | int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb, |
| 66 | 72 | struct inet_diag_msg *r, int ext, |
| 67 | 73 | struct user_namespace *user_ns, bool net_admin); |
| @@ -123,6 +123,8 @@ · 122 unmodified lines | ||
| 123 | 123 | |
| 124 | 124 | #define dmar_readq(a) readq(a) |
| 125 | 125 | #define dmar_writeq(a,v) writeq(v,a) |
| 126 | +#define dmar_readl(a) readl(a) | |
| 127 | +#define dmar_writel(a, v) writel(v, a) | |
| 126 | 128 | |
| 127 | 129 | #define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4) |
| 128 | 130 | #define DMAR_VER_MINOR(v) ((v) & 0x0f) |
| @@ -333,6 +333,7 @@ struct mmc_host { · 332 unmodified lines | ||
| 333 | 333 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | \ |
| 334 | 334 | MMC_CAP_UHS_DDR50) |
| 335 | 335 | #define MMC_CAP_SYNC_RUNTIME_PM (1 << 21) /* Synced runtime PM suspends. */ |
| 336 | +#define MMC_CAP_NEED_RSP_BUSY (1 << 22) /* Commands with R1B can't use R1. */ | |
| 336 | 337 | #define MMC_CAP_DRIVER_TYPE_A (1 << 23) /* Host supports Driver Type A */ |
| 337 | 338 | #define MMC_CAP_DRIVER_TYPE_C (1 << 24) /* Host supports Driver Type C */ |
| 338 | 339 | #define MMC_CAP_DRIVER_TYPE_D (1 << 25) /* Host supports Driver Type D */ |
| @@ -11,17 +11,17 @@ struct of_device_id; · 10 unmodified lines | ||
| 11 | 11 | |
| 12 | 12 | #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_OF) |
| 13 | 13 | |
| 14 | −unsigned int of_clk_get_parent_count(struct device_node *np); | |
| 15 | −const char *of_clk_get_parent_name(struct device_node *np, int index); | |
| 14 | +unsigned int of_clk_get_parent_count(const struct device_node *np); | |
| 15 | +const char *of_clk_get_parent_name(const struct device_node *np, int index); | |
| 16 | 16 | void of_clk_init(const struct of_device_id *matches); |
| 17 | 17 | |
| 18 | 18 | #else /* !CONFIG_COMMON_CLK || !CONFIG_OF */ |
| 19 | 19 | |
| 20 | −static inline unsigned int of_clk_get_parent_count(struct device_node *np) | |
| 20 | +static inline unsigned int of_clk_get_parent_count(const struct device_node *np) | |
| 21 | 21 | { |
| 22 | 22 | return 0; |
| 23 | 23 | } |
| 24 | −static inline const char *of_clk_get_parent_name(struct device_node *np, | |
| 24 | +static inline const char *of_clk_get_parent_name(const struct device_node *np, | |
| 25 | 25 | int index) |
| 26 | 26 | { |
| 27 | 27 | return NULL; |
| @@ -311,7 +311,7 @@ static inline int TestClearPage##uname(struct page *page) { return 0; } · 310 unmodified lines | ||
| 311 | 311 | |
| 312 | 312 | __PAGEFLAG(Locked, locked, PF_NO_TAIL) |
| 313 | 313 | PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) |
| 314 | −PAGEFLAG(Error, error, PF_NO_COMPOUND) TESTCLEARFLAG(Error, error, PF_NO_COMPOUND) | |
| 314 | +PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL) | |
| 315 | 315 | PAGEFLAG(Referenced, referenced, PF_HEAD) |
| 316 | 316 | TESTCLEARFLAG(Referenced, referenced, PF_HEAD) |
| 317 | 317 | __SETPAGEFLAG(Referenced, referenced, PF_HEAD) |
| @@ -357,6 +357,7 @@ struct macsec_ops; · 356 unmodified lines | ||
| 357 | 357 | * is_gigabit_capable: Set to true if PHY supports 1000Mbps |
| 358 | 358 | * has_fixups: Set to true if this phy has fixups/quirks. |
| 359 | 359 | * suspended: Set to true if this phy has been suspended successfully. |
| 360 | + * suspended_by_mdio_bus: Set to true if this phy was suspended by MDIO bus. | |
| 360 | 361 | * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. |
| 361 | 362 | * loopback_enabled: Set true if this phy has been loopbacked successfully. |
| 362 | 363 | * state: state of the PHY for management purposes |
| @@ -396,6 +397,7 @@ struct phy_device { · 33 unmodified lines | ||
| 396 | 397 | unsigned is_gigabit_capable:1; |
| 397 | 398 | unsigned has_fixups:1; |
| 398 | 399 | unsigned suspended:1; |
| 400 | + unsigned suspended_by_mdio_bus:1; | |
| 399 | 401 | unsigned sysfs_links:1; |
| 400 | 402 | unsigned loopback_enabled:1; |
| 401 | 403 | |
| @@ -557,6 +559,7 @@ struct phy_driver { · 155 unmodified lines | ||
| 557 | 559 | /* |
| 558 | 560 | * Checks if the PHY generated an interrupt. |
| 559 | 561 | * For multi-PHY devices with shared PHY interrupt pin |
| 562 | + * Set interrupt bits have to be cleared. | |
| 560 | 563 | */ |
| 561 | 564 | int (*did_interrupt)(struct phy_device *phydev); |
| 562 | 565 | |
| @@ -24,7 +24,7 @@ struct platform_device { · 23 unmodified lines | ||
| 24 | 24 | int id; |
| 25 | 25 | bool id_auto; |
| 26 | 26 | struct device dev; |
| 27 | − u64 dma_mask; | |
| 27 | + u64 platform_dma_mask; | |
| 28 | 28 | u32 num_resources; |
| 29 | 29 | struct resource *resource; |
| 30 | 30 | |
| @@ -972,9 +972,9 @@ static inline int rhashtable_lookup_insert_key( · 971 unmodified lines | ||
| 972 | 972 | /** |
| 973 | 973 | * rhashtable_lookup_get_insert_key - lookup and insert object into hash table |
| 974 | 974 | * @ht: hash table |
| 975 | + * @key: key | |
| 975 | 976 | * @obj: pointer to hash head inside object |
| 976 | 977 | * @params: hash table parameters |
| 977 | − * @data: pointer to element data already in hashes | |
| 978 | 978 | * |
| 979 | 979 | * Just like rhashtable_lookup_insert_key(), but this function returns the |
| 980 | 980 | * object if it exists, NULL if it does not and the insertion was successful, |
| @@ -401,7 +401,8 @@ extern int __sys_sendto(int fd, void __user *buff, size_t len, · 400 unmodified lines | ||
| 401 | 401 | int addr_len); |
| 402 | 402 | extern int __sys_accept4_file(struct file *file, unsigned file_flags, |
| 403 | 403 | struct sockaddr __user *upeer_sockaddr, |
| 404 | − int __user *upeer_addrlen, int flags); | |
| 404 | + int __user *upeer_addrlen, int flags, | |
| 405 | + unsigned long nofile); | |
| 405 | 406 | extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, |
| 406 | 407 | int __user *upeer_addrlen, int flags); |
| 407 | 408 | extern int __sys_socket(int family, int type, int protocol); |
| @@ -141,8 +141,9 @@ extern int remap_vmalloc_range_partial(struct vm_area_struct *vma, · 140 unmodified lines | ||
| 141 | 141 | |
| 142 | 142 | extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, |
| 143 | 143 | unsigned long pgoff); |
| 144 | −void vmalloc_sync_all(void); | |
| 145 | − | |
| 144 | +void vmalloc_sync_mappings(void); | |
| 145 | +void vmalloc_sync_unmappings(void); | |
| 146 | + | |
| 146 | 147 | /* |
| 147 | 148 | * Lowlevel-APIs (not for driver use!) |
| 148 | 149 | */ |
| @@ -487,6 +487,19 @@ extern void wq_worker_comm(char *buf, size_t size, struct task_struct *task); · 486 unmodified lines | ||
| 487 | 487 | * |
| 488 | 488 | * We queue the work to the CPU on which it was submitted, but if the CPU dies |
| 489 | 489 | * it can be processed by another CPU. |
| 490 | + * | |
| 491 | + * Memory-ordering properties: If it returns %true, guarantees that all stores | |
| 492 | + * preceding the call to queue_work() in the program order will be visible from | |
| 493 | + * the CPU which will execute @work by the time such work executes, e.g., | |
| 494 | + * | |
| 495 | + * { x is initially 0 } | |
| 496 | + * | |
| 497 | + * CPU0 CPU1 | |
| 498 | + * | |
| 499 | + * WRITE_ONCE(x, 1); [ @work is being executed ] | |
| 500 | + * r0 = queue_work(wq, work); r1 = READ_ONCE(x); | |
| 501 | + * | |
| 502 | + * Forbids: r0 == true && r1 == 0 | |
| 490 | 503 | */ |
| 491 | 504 | static inline bool queue_work(struct workqueue_struct *wq, |
| 492 | 505 | struct work_struct *work) |
| @@ -546,6 +559,9 @@ static inline bool schedule_work_on(int cpu, struct work_struct *work) · 53 unmodified lines | ||
| 546 | 559 | * This puts a job in the kernel-global workqueue if it was not already |
| 547 | 560 | * queued and leaves it in the same position on the kernel-global |
| 548 | 561 | * workqueue otherwise. |
| 562 | + * | |
| 563 | + * Shares the same memory-ordering properties of queue_work(), cf. the | |
| 564 | + * DocBook header of queue_work(). | |
| 549 | 565 | */ |
| 550 | 566 | static inline bool schedule_work(struct work_struct *work) |
| 551 | 567 | { |
| @@ -108,6 +108,7 @@ struct fib_rule_notifier_info { · 107 unmodified lines | ||
| 108 | 108 | [FRA_OIFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, \ |
| 109 | 109 | [FRA_PRIORITY] = { .type = NLA_U32 }, \ |
| 110 | 110 | [FRA_FWMARK] = { .type = NLA_U32 }, \ |
| 111 | + [FRA_TUN_ID] = { .type = NLA_U64 }, \ | |
| 111 | 112 | [FRA_FWMASK] = { .type = NLA_U32 }, \ |
| 112 | 113 | [FRA_TABLE] = { .type = NLA_U32 }, \ |
| 113 | 114 | [FRA_SUPPRESS_PREFIXLEN] = { .type = NLA_U32 }, \ |
| @@ -74,7 +74,7 @@ · 73 unmodified lines | ||
| 74 | 74 | #define DEV_MAC_TAGS_CFG_TAG_ID_M GENMASK(31, 16) |
| 75 | 75 | #define DEV_MAC_TAGS_CFG_TAG_ID_X(x) (((x) & GENMASK(31, 16)) >> 16) |
| 76 | 76 | #define DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA BIT(2) |
| 77 | −#define DEV_MAC_TAGS_CFG_PB_ENA BIT(1) | |
| 77 | +#define DEV_MAC_TAGS_CFG_VLAN_DBL_AWR_ENA BIT(1) | |
| 78 | 78 | #define DEV_MAC_TAGS_CFG_VLAN_AWR_ENA BIT(0) |
| 79 | 79 | |
| 80 | 80 | #define DEV_MAC_ADV_CHK_CFG 0x2c |
| @@ -74,6 +74,8 @@ enum { · 73 unmodified lines | ||
| 74 | 74 | #define IPPROTO_UDPLITE IPPROTO_UDPLITE |
| 75 | 75 | IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ |
| 76 | 76 | #define IPPROTO_MPLS IPPROTO_MPLS |
| 77 | + IPPROTO_ETHERNET = 143, /* Ethernet-within-IPv6 Encapsulation */ | |
| 78 | +#define IPPROTO_ETHERNET IPPROTO_ETHERNET | |
| 77 | 79 | IPPROTO_RAW = 255, /* Raw IP packets */ |
| 78 | 80 | #define IPPROTO_RAW IPPROTO_RAW |
| 79 | 81 | IPPROTO_MPTCP = 262, /* Multipath TCP connection */ |
| @@ -767,8 +767,7 @@ config ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH · 766 unmodified lines | ||
| 767 | 767 | bool |
| 768 | 768 | |
| 769 | 769 | config CC_HAS_INT128 |
| 770 | − def_bool y | |
| 771 | − depends on !$(cc-option,-D__SIZEOF_INT128__=0) | |
| 770 | + def_bool !$(cc-option,$(m64-flag) -D__SIZEOF_INT128__=0) && 64BIT | |
| 772 | 771 | |
| 773 | 772 | # |
| 774 | 773 | # For architectures that know their GCC __int128 support is sound |
| @@ -471,6 +471,7 @@ static void *cgroup_pidlist_next(struct seq_file *s, void *v, loff_t *pos) · 470 unmodified lines | ||
| 471 | 471 | */ |
| 472 | 472 | p++; |
| 473 | 473 | if (p >= end) { |
| 474 | + (*pos)++; | |
| 474 | 475 | return NULL; |
| 475 | 476 | } else { |
| 476 | 477 | *pos = *p; |
| @@ -782,7 +783,7 @@ void cgroup1_release_agent(struct work_struct *work) · 305 unmodified lines | ||
| 782 | 783 | |
| 783 | 784 | pathbuf = kmalloc(PATH_MAX, GFP_KERNEL); |
| 784 | 785 | agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); |
| 785 | − if (!pathbuf || !agentbuf) | |
| 786 | + if (!pathbuf || !agentbuf || !strlen(agentbuf)) | |
| 786 | 787 | goto out; |
| 787 | 788 | |
| 788 | 789 | spin_lock_irq(&css_set_lock); |
| @@ -3542,21 +3542,21 @@ static int cpu_stat_show(struct seq_file *seq, void *v) · 3541 unmodified lines | ||
| 3542 | 3542 | static int cgroup_io_pressure_show(struct seq_file *seq, void *v) |
| 3543 | 3543 | { |
| 3544 | 3544 | struct cgroup *cgrp = seq_css(seq)->cgroup; |
| 3545 | − struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3545 | + struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3546 | 3546 | |
| 3547 | 3547 | return psi_show(seq, psi, PSI_IO); |
| 3548 | 3548 | } |
| 3549 | 3549 | static int cgroup_memory_pressure_show(struct seq_file *seq, void *v) |
| 3550 | 3550 | { |
| 3551 | 3551 | struct cgroup *cgrp = seq_css(seq)->cgroup; |
| 3552 | − struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3552 | + struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3553 | 3553 | |
| 3554 | 3554 | return psi_show(seq, psi, PSI_MEM); |
| 3555 | 3555 | } |
| 3556 | 3556 | static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v) |
| 3557 | 3557 | { |
| 3558 | 3558 | struct cgroup *cgrp = seq_css(seq)->cgroup; |
| 3559 | − struct psi_group *psi = cgroup_id(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3559 | + struct psi_group *psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi; | |
| 3560 | 3560 | |
| 3561 | 3561 | return psi_show(seq, psi, PSI_CPU); |
| 3562 | 3562 | } |
| @@ -4400,12 +4400,16 @@ static void css_task_iter_advance_css_set(struct css_task_iter *it) · 837 unmodified lines | ||
| 4400 | 4400 | } |
| 4401 | 4401 | } while (!css_set_populated(cset) && list_empty(&cset->dying_tasks)); |
| 4402 | 4402 | |
| 4403 | − if (!list_empty(&cset->tasks)) | |
| 4403 | + if (!list_empty(&cset->tasks)) { | |
| 4404 | 4404 | it->task_pos = cset->tasks.next; |
| 4405 | − else if (!list_empty(&cset->mg_tasks)) | |
| 4405 | + it->cur_tasks_head = &cset->tasks; | |
| 4406 | + } else if (!list_empty(&cset->mg_tasks)) { | |
| 4406 | 4407 | it->task_pos = cset->mg_tasks.next; |
| 4407 | − else | |
| 4408 | + it->cur_tasks_head = &cset->mg_tasks; | |
| 4409 | + } else { | |
| 4408 | 4410 | it->task_pos = cset->dying_tasks.next; |
| 4411 | + it->cur_tasks_head = &cset->dying_tasks; | |
| 4412 | + } | |
| 4409 | 4413 | |
| 4410 | 4414 | it->tasks_head = &cset->tasks; |
| 4411 | 4415 | it->mg_tasks_head = &cset->mg_tasks; |
| @@ -4463,10 +4467,14 @@ repeat: · 51 unmodified lines | ||
| 4463 | 4467 | else |
| 4464 | 4468 | it->task_pos = it->task_pos->next; |
| 4465 | 4469 | |
| 4466 | − if (it->task_pos == it->tasks_head) | |
| 4470 | + if (it->task_pos == it->tasks_head) { | |
| 4467 | 4471 | it->task_pos = it->mg_tasks_head->next; |
| 4468 | − if (it->task_pos == it->mg_tasks_head) | |
| 4472 | + it->cur_tasks_head = it->mg_tasks_head; | |
| 4473 | + } | |
| 4474 | + if (it->task_pos == it->mg_tasks_head) { | |
| 4469 | 4475 | it->task_pos = it->dying_tasks_head->next; |
| 4476 | + it->cur_tasks_head = it->dying_tasks_head; | |
| 4477 | + } | |
| 4470 | 4478 | if (it->task_pos == it->dying_tasks_head) |
| 4471 | 4479 | css_task_iter_advance_css_set(it); |
| 4472 | 4480 | } else { |
| @@ -4485,11 +4493,12 @@ repeat: · 12 unmodified lines | ||
| 4485 | 4493 | goto repeat; |
| 4486 | 4494 | |
| 4487 | 4495 | /* and dying leaders w/o live member threads */ |
| 4488 | − if (!atomic_read(&task->signal->live)) | |
| 4496 | + if (it->cur_tasks_head == it->dying_tasks_head && | |
| 4497 | + !atomic_read(&task->signal->live)) | |
| 4489 | 4498 | goto repeat; |
| 4490 | 4499 | } else { |
| 4491 | 4500 | /* skip all dying ones */ |
| 4492 | − if (task->flags & PF_EXITING) | |
| 4501 | + if (it->cur_tasks_head == it->dying_tasks_head) | |
| 4493 | 4502 | goto repeat; |
| 4494 | 4503 | } |
| 4495 | 4504 | } |
| @@ -4595,6 +4604,9 @@ static void *cgroup_procs_next(struct seq_file *s, void *v, loff_t *pos) · 99 unmodified lines | ||
| 4595 | 4604 | struct kernfs_open_file *of = s->private; |
| 4596 | 4605 | struct css_task_iter *it = of->priv; |
| 4597 | 4606 | |
| 4607 | + if (pos) | |
| 4608 | + (*pos)++; | |
| 4609 | + | |
| 4598 | 4610 | return css_task_iter_next(it); |
| 4599 | 4611 | } |
| 4600 | 4612 | |
| @@ -4610,7 +4622,7 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos, · 9 unmodified lines | ||
| 4610 | 4622 | * from position 0, so we can simply keep iterating on !0 *pos. |
| 4611 | 4623 | */ |
| 4612 | 4624 | if (!it) { |
| 4613 | − if (WARN_ON_ONCE((*pos)++)) | |
| 4625 | + if (WARN_ON_ONCE((*pos))) | |
| 4614 | 4626 | return ERR_PTR(-EINVAL); |
| 4615 | 4627 | |
| 4616 | 4628 | it = kzalloc(sizeof(*it), GFP_KERNEL); |
| @@ -4618,10 +4630,11 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos, · 1 unmodified line | ||
| 4618 | 4630 | return ERR_PTR(-ENOMEM); |
| 4619 | 4631 | of->priv = it; |
| 4620 | 4632 | css_task_iter_start(&cgrp->self, iter_flags, it); |
| 4621 | − } else if (!(*pos)++) { | |
| 4633 | + } else if (!(*pos)) { | |
| 4622 | 4634 | css_task_iter_end(it); |
| 4623 | 4635 | css_task_iter_start(&cgrp->self, iter_flags, it); |
| 4624 | − } | |
| 4636 | + } else | |
| 4637 | + return it->cur_task; | |
| 4625 | 4638 | |
| 4626 | 4639 | return cgroup_procs_next(s, NULL, NULL); |
| 4627 | 4640 | } |
| @@ -6258,6 +6271,10 @@ void cgroup_sk_alloc(struct sock_cgroup_data *skcd) · 1630 unmodified lines | ||
| 6258 | 6271 | return; |
| 6259 | 6272 | } |
| 6260 | 6273 | |
| 6274 | + /* Don't associate the sock with unrelated interrupted task's cgroup. */ | |
| 6275 | + if (in_interrupt()) | |
| 6276 | + return; | |
| 6277 | + | |
| 6261 | 6278 | rcu_read_lock(); |
| 6262 | 6279 | |
| 6263 | 6280 | while (true) { |
| @@ -385,9 +385,9 @@ static inline int hb_waiters_pending(struct futex_hash_bucket *hb) · 384 unmodified lines | ||
| 385 | 385 | */ |
| 386 | 386 | static struct futex_hash_bucket *hash_futex(union futex_key *key) |
| 387 | 387 | { |
| 388 | − u32 hash = jhash2((u32*)&key->both.word, | |
| 389 | − (sizeof(key->both.word)+sizeof(key->both.ptr))/4, | |
| 388 | + u32 hash = jhash2((u32 *)key, offsetof(typeof(*key), both.offset) / 4, | |
| 390 | 389 | key->both.offset); |
| 390 | + | |
| 391 | 391 | return &futex_queues[hash & (futex_hashsize - 1)]; |
| 392 | 392 | } |
| 393 | 393 | |
| @@ -429,7 +429,7 @@ static void get_futex_key_refs(union futex_key *key) · 35 unmodified lines | ||
| 429 | 429 | |
| 430 | 430 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
| 431 | 431 | case FUT_OFF_INODE: |
| 432 | − ihold(key->shared.inode); /* implies smp_mb(); (B) */ | |
| 432 | + smp_mb(); /* explicit smp_mb(); (B) */ | |
| 433 | 433 | break; |
| 434 | 434 | case FUT_OFF_MMSHARED: |
| 435 | 435 | futex_get_mm(key); /* implies smp_mb(); (B) */ |
| @@ -463,7 +463,6 @@ static void drop_futex_key_refs(union futex_key *key) · 27 unmodified lines | ||
| 463 | 463 | |
| 464 | 464 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
| 465 | 465 | case FUT_OFF_INODE: |
| 466 | − iput(key->shared.inode); | |
| 467 | 466 | break; |
| 468 | 467 | case FUT_OFF_MMSHARED: |
| 469 | 468 | mmdrop(key->private.mm); |
| @@ -505,6 +504,46 @@ futex_setup_timer(ktime_t *time, struct hrtimer_sleeper *timeout, · 35 unmodified lines | ||
| 505 | 504 | return timeout; |
| 506 | 505 | } |
| 507 | 506 | |
| 507 | +/* | |
| 508 | + * Generate a machine wide unique identifier for this inode. | |
| 509 | + * | |
| 510 | + * This relies on u64 not wrapping in the life-time of the machine; which with | |
| 511 | + * 1ns resolution means almost 585 years. | |
| 512 | + * | |
| 513 | + * This further relies on the fact that a well formed program will not unmap | |
| 514 | + * the file while it has a (shared) futex waiting on it. This mapping will have | |
| 515 | + * a file reference which pins the mount and inode. | |
| 516 | + * | |
| 517 | + * If for some reason an inode gets evicted and read back in again, it will get | |
| 518 | + * a new sequence number and will _NOT_ match, even though it is the exact same | |
| 519 | + * file. | |
| 520 | + * | |
| 521 | + * It is important that match_futex() will never have a false-positive, esp. | |
| 522 | + * for PI futexes that can mess up the state. The above argues that false-negatives | |
| 523 | + * are only possible for malformed programs. | |
| 524 | + */ | |
| 525 | +static u64 get_inode_sequence_number(struct inode *inode) | |
| 526 | +{ | |
| 527 | + static atomic64_t i_seq; | |
| 528 | + u64 old; | |
| 529 | + | |
| 530 | + /* Does the inode already have a sequence number? */ | |
| 531 | + old = atomic64_read(&inode->i_sequence); | |
| 532 | + if (likely(old)) | |
| 533 | + return old; | |
| 534 | + | |
| 535 | + for (;;) { | |
| 536 | + u64 new = atomic64_add_return(1, &i_seq); | |
| 537 | + if (WARN_ON_ONCE(!new)) | |
| 538 | + continue; | |
| 539 | + | |
| 540 | + old = atomic64_cmpxchg_relaxed(&inode->i_sequence, 0, new); | |
| 541 | + if (old) | |
| 542 | + return old; | |
| 543 | + return new; | |
| 544 | + } | |
| 545 | +} | |
| 546 | + | |
| 508 | 547 | /** |
| 509 | 548 | * get_futex_key() - Get parameters which are the keys for a futex |
| 510 | 549 | * @uaddr: virtual address of the futex |
| @@ -517,9 +556,15 @@ futex_setup_timer(ktime_t *time, struct hrtimer_sleeper *timeout, · 6 unmodified lines | ||
| 517 | 556 | * |
| 518 | 557 | * The key words are stored in @key on success. |
| 519 | 558 | * |
| 520 | − * For shared mappings, it's (page->index, file_inode(vma->vm_file), | |
| 521 | − * offset_within_page). For private mappings, it's (uaddr, current->mm). | |
| 522 | − * We can usually work out the index without swapping in the page. | |
| 559 | + * For shared mappings (when @fshared), the key is: | |
| 560 | + * ( inode->i_sequence, page->index, offset_within_page ) | |
| 561 | + * [ also see get_inode_sequence_number() ] | |
| 562 | + * | |
| 563 | + * For private mappings (or when !@fshared), the key is: | |
| 564 | + * ( current->mm, address, 0 ) | |
| 565 | + * | |
| 566 | + * This allows (cross process, where applicable) identification of the futex | |
| 567 | + * without keeping the page pinned for the duration of the FUTEX_WAIT. | |
| 523 | 568 | * |
| 524 | 569 | * lock_page() might sleep, the caller should not hold a spinlock. |
| 525 | 570 | */ |
| @@ -659,8 +704,6 @@ again: · 133 unmodified lines | ||
| 659 | 704 | key->private.mm = mm; |
| 660 | 705 | key->private.address = address; |
| 661 | 706 | |
| 662 | − get_futex_key_refs(key); /* implies smp_mb(); (B) */ | |
| 663 | − | |
| 664 | 707 | } else { |
| 665 | 708 | struct inode *inode; |
| 666 | 709 | |
| @@ -692,40 +735,14 @@ again: · 25 unmodified lines | ||
| 692 | 735 | goto again; |
| 693 | 736 | } |
| 694 | 737 | |
| 695 | − /* | |
| 696 | − * Take a reference unless it is about to be freed. Previously | |
| 697 | − * this reference was taken by ihold under the page lock | |
| 698 | − * pinning the inode in place so i_lock was unnecessary. The | |
| 699 | − * only way for this check to fail is if the inode was | |
| 700 | − * truncated in parallel which is almost certainly an | |
| 701 | − * application bug. In such a case, just retry. | |
| 702 | − * | |
| 703 | − * We are not calling into get_futex_key_refs() in file-backed | |
| 704 | − * cases, therefore a successful atomic_inc return below will | |
| 705 | − * guarantee that get_futex_key() will still imply smp_mb(); (B). | |
| 706 | − */ | |
| 707 | − if (!atomic_inc_not_zero(&inode->i_count)) { | |
| 708 | − rcu_read_unlock(); | |
| 709 | − put_page(page); | |
| 710 | − | |
| 711 | − goto again; | |
| 712 | − } | |
| 713 | − | |
| 714 | − /* Should be impossible but lets be paranoid for now */ | |
| 715 | − if (WARN_ON_ONCE(inode->i_mapping != mapping)) { | |
| 716 | − err = -EFAULT; | |
| 717 | − rcu_read_unlock(); | |
| 718 | − iput(inode); | |
| 719 | − | |
| 720 | − goto out; | |
| 721 | − } | |
| 722 | − | |
| 723 | 738 | key->both.offset |= FUT_OFF_INODE; /* inode-based key */ |
| 724 | − key->shared.inode = inode; | |
| 739 | + key->shared.i_seq = get_inode_sequence_number(inode); | |
| 725 | 740 | key->shared.pgoff = basepage_index(tail); |
| 726 | 741 | rcu_read_unlock(); |
| 727 | 742 | } |
| 728 | 743 | |
| 744 | + get_futex_key_refs(key); /* implies smp_mb(); (B) */ | |
| 745 | + | |
| 729 | 746 | out: |
| 730 | 747 | put_page(page); |
| 731 | 748 | return err; |
| @@ -519,7 +519,7 @@ NOKPROBE_SYMBOL(notify_die); · 518 unmodified lines | ||
| 519 | 519 | |
| 520 | 520 | int register_die_notifier(struct notifier_block *nb) |
| 521 | 521 | { |
| 522 | − vmalloc_sync_all(); | |
| 522 | + vmalloc_sync_mappings(); | |
| 523 | 523 | return atomic_notifier_chain_register(&die_chain, nb); |
| 524 | 524 | } |
| 525 | 525 | EXPORT_SYMBOL_GPL(register_die_notifier); |
| @@ -247,6 +247,16 @@ struct pid *alloc_pid(struct pid_namespace *ns, pid_t *set_tid, · 246 unmodified lines | ||
| 247 | 247 | tmp = tmp->parent; |
| 248 | 248 | } |
| 249 | 249 | |
| 250 | + /* | |
| 251 | + * ENOMEM is not the most obvious choice especially for the case | |
| 252 | + * where the child subreaper has already exited and the pid | |
| 253 | + * namespace denies the creation of any new processes. But ENOMEM | |
| 254 | + * is what we have exposed to userspace for a long time and it is | |
| 255 | + * documented behavior for pid namespaces. So we can't easily | |
| 256 | + * change it even if there were an error code better suited. | |
| 257 | + */ | |
| 258 | + retval = -ENOMEM; | |
| 259 | + | |
| 250 | 260 | if (unlikely(is_child_reaper(pid))) { |
| 251 | 261 | if (pid_ns_prepare_proc(ns)) |
| 252 | 262 | goto out_free; |
| @@ -47,6 +47,7 @@ · 46 unmodified lines | ||
| 47 | 47 | #include <linux/syscalls.h> |
| 48 | 48 | #include <linux/kprobes.h> |
| 49 | 49 | #include <linux/user_namespace.h> |
| 50 | +#include <linux/time_namespace.h> | |
| 50 | 51 | #include <linux/binfmts.h> |
| 51 | 52 | |
| 52 | 53 | #include <linux/sched.h> |
| @@ -2546,6 +2547,7 @@ static int do_sysinfo(struct sysinfo *info) · 2493 unmodified lines | ||
| 2546 | 2547 | memset(info, 0, sizeof(struct sysinfo)); |
| 2547 | 2548 | |
| 2548 | 2549 | ktime_get_boottime_ts64(&tp); |
| 2550 | + timens_add_boottime(&tp); | |
| 2549 | 2551 | info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); |
| 2550 | 2552 | |
| 2551 | 2553 | get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT); |
| @@ -1547,6 +1547,8 @@ static struct dyn_ftrace *lookup_rec(unsigned long start, unsigned long end) · 1546 unmodified lines | ||
| 1547 | 1547 | rec = bsearch(&key, pg->records, pg->index, |
| 1548 | 1548 | sizeof(struct dyn_ftrace), |
| 1549 | 1549 | ftrace_cmp_recs); |
| 1550 | + if (rec) | |
| 1551 | + break; | |
| 1550 | 1552 | } |
| 1551 | 1553 | return rec; |
| 1552 | 1554 | } |
| @@ -1411,14 +1411,16 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, · 1410 unmodified lines | ||
| 1411 | 1411 | return; |
| 1412 | 1412 | rcu_read_lock(); |
| 1413 | 1413 | retry: |
| 1414 | − if (req_cpu == WORK_CPU_UNBOUND) | |
| 1415 | − cpu = wq_select_unbound_cpu(raw_smp_processor_id()); | |
| 1416 | − | |
| 1417 | 1414 | /* pwq which will be used unless @work is executing elsewhere */ |
| 1418 | − if (!(wq->flags & WQ_UNBOUND)) | |
| 1419 | − pwq = per_cpu_ptr(wq->cpu_pwqs, cpu); | |
| 1420 | − else | |
| 1415 | + if (wq->flags & WQ_UNBOUND) { | |
| 1416 | + if (req_cpu == WORK_CPU_UNBOUND) | |
| 1417 | + cpu = wq_select_unbound_cpu(raw_smp_processor_id()); | |
| 1421 | 1418 | pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); |
| 1419 | + } else { | |
| 1420 | + if (req_cpu == WORK_CPU_UNBOUND) | |
| 1421 | + cpu = raw_smp_processor_id(); | |
| 1422 | + pwq = per_cpu_ptr(wq->cpu_pwqs, cpu); | |
| 1423 | + } | |
| 1422 | 1424 | |
| 1423 | 1425 | /* |
| 1424 | 1426 | * If @work was previously on a different pool, it might still be |
| @@ -335,12 +335,14 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, · 334 unmodified lines | ||
| 335 | 335 | } |
| 336 | 336 | |
| 337 | 337 | page = pmd_page(orig_pmd); |
| 338 | + | |
| 339 | + /* Do not interfere with other mappings of this page */ | |
| 340 | + if (page_mapcount(page) != 1) | |
| 341 | + goto huge_unlock; | |
| 342 | + | |
| 338 | 343 | if (next - addr != HPAGE_PMD_SIZE) { |
| 339 | 344 | int err; |
| 340 | 345 | |
| 341 | − if (page_mapcount(page) != 1) | |
| 342 | − goto huge_unlock; | |
| 343 | − | |
| 344 | 346 | get_page(page); |
| 345 | 347 | spin_unlock(ptl); |
| 346 | 348 | lock_page(page); |
| @@ -426,6 +428,10 @@ regular_page: · 79 unmodified lines | ||
| 426 | 428 | continue; |
| 427 | 429 | } |
| 428 | 430 | |
| 431 | + /* Do not interfere with other mappings of this page */ | |
| 432 | + if (page_mapcount(page) != 1) | |
| 433 | + continue; | |
| 434 | + | |
| 429 | 435 | VM_BUG_ON_PAGE(PageTransCompound(page), page); |
| 430 | 436 | |
| 431 | 437 | if (pte_young(ptent)) { |
| @@ -2297,28 +2297,41 @@ static void high_work_func(struct work_struct *work) · 2296 unmodified lines | ||
| 2297 | 2297 | #define MEMCG_DELAY_SCALING_SHIFT 14 |
| 2298 | 2298 | |
| 2299 | 2299 | /* |
| 2300 | − * Scheduled by try_charge() to be executed from the userland return path | |
| 2301 | − * and reclaims memory over the high limit. | |
| 2300 | + * Get the number of jiffies that we should penalise a mischievous cgroup which | |
| 2301 | + * is exceeding its memory.high by checking both it and its ancestors. | |
| 2302 | 2302 | */ |
| 2303 | −void mem_cgroup_handle_over_high(void) | |
| 2303 | +static unsigned long calculate_high_delay(struct mem_cgroup *memcg, | |
| 2304 | + unsigned int nr_pages) | |
| 2304 | 2305 | { |
| 2305 | − unsigned long usage, high, clamped_high; | |
| 2306 | − unsigned long pflags; | |
| 2307 | − unsigned long penalty_jiffies, overage; | |
| 2308 | − unsigned int nr_pages = current->memcg_nr_pages_over_high; | |
| 2309 | − struct mem_cgroup *memcg; | |
| 2306 | + unsigned long penalty_jiffies; | |
| 2307 | + u64 max_overage = 0; | |
| 2310 | 2308 | |
| 2311 | − if (likely(!nr_pages)) | |
| 2312 | − return; | |
| 2309 | + do { | |
| 2310 | + unsigned long usage, high; | |
| 2311 | + u64 overage; | |
| 2313 | 2312 | |
| 2314 | − memcg = get_mem_cgroup_from_mm(current->mm); | |
| 2315 | − reclaim_high(memcg, nr_pages, GFP_KERNEL); | |
| 2316 | − current->memcg_nr_pages_over_high = 0; | |
| 2313 | + usage = page_counter_read(&memcg->memory); | |
| 2314 | + high = READ_ONCE(memcg->high); | |
| 2315 | + | |
| 2316 | + /* | |
| 2317 | + * Prevent division by 0 in overage calculation by acting as if | |
| 2318 | + * it was a threshold of 1 page | |
| 2319 | + */ | |
| 2320 | + high = max(high, 1UL); | |
| 2321 | + | |
| 2322 | + overage = usage - high; | |
| 2323 | + overage <<= MEMCG_DELAY_PRECISION_SHIFT; | |
| 2324 | + overage = div64_u64(overage, high); | |
| 2325 | + | |
| 2326 | + if (overage > max_overage) | |
| 2327 | + max_overage = overage; | |
| 2328 | + } while ((memcg = parent_mem_cgroup(memcg)) && | |
| 2329 | + !mem_cgroup_is_root(memcg)); | |
| 2330 | + | |
| 2331 | + if (!max_overage) | |
| 2332 | + return 0; | |
| 2317 | 2333 | |
| 2318 | 2334 | /* |
| 2319 | − * memory.high is breached and reclaim is unable to keep up. Throttle | |
| 2320 | − * allocators proactively to slow down excessive growth. | |
| 2321 | − * | |
| 2322 | 2335 | * We use overage compared to memory.high to calculate the number of |
| 2323 | 2336 | * jiffies to sleep (penalty_jiffies). Ideally this value should be |
| 2324 | 2337 | * fairly lenient on small overages, and increasingly harsh when the |
| @@ -2326,24 +2339,9 @@ void mem_cgroup_handle_over_high(void) · 1 unmodified line | ||
| 2326 | 2339 | * its crazy behaviour, so we exponentially increase the delay based on |
| 2327 | 2340 | * overage amount. |
| 2328 | 2341 | */ |
| 2329 | − | |
| 2330 | − usage = page_counter_read(&memcg->memory); | |
| 2331 | − high = READ_ONCE(memcg->high); | |
| 2332 | − | |
| 2333 | − if (usage <= high) | |
| 2334 | − goto out; | |
| 2335 | − | |
| 2336 | − /* | |
| 2337 | − * Prevent division by 0 in overage calculation by acting as if it was a | |
| 2338 | − * threshold of 1 page | |
| 2339 | − */ | |
| 2340 | − clamped_high = max(high, 1UL); | |
| 2341 | − | |
| 2342 | − overage = div_u64((u64)(usage - high) << MEMCG_DELAY_PRECISION_SHIFT, | |
| 2343 | − clamped_high); | |
| 2344 | − | |
| 2345 | − penalty_jiffies = ((u64)overage * overage * HZ) | |
| 2346 | − >> (MEMCG_DELAY_PRECISION_SHIFT + MEMCG_DELAY_SCALING_SHIFT); | |
| 2342 | + penalty_jiffies = max_overage * max_overage * HZ; | |
| 2343 | + penalty_jiffies >>= MEMCG_DELAY_PRECISION_SHIFT; | |
| 2344 | + penalty_jiffies >>= MEMCG_DELAY_SCALING_SHIFT; | |
| 2347 | 2345 | |
| 2348 | 2346 | /* |
| 2349 | 2347 | * Factor in the task's own contribution to the overage, such that four |
| @@ -2360,7 +2358,32 @@ void mem_cgroup_handle_over_high(void) · 10 unmodified lines | ||
| 2360 | 2358 | * application moving forwards and also permit diagnostics, albeit |
| 2361 | 2359 | * extremely slowly. |
| 2362 | 2360 | */ |
| 2363 | − penalty_jiffies = min(penalty_jiffies, MEMCG_MAX_HIGH_DELAY_JIFFIES); | |
| 2361 | + return min(penalty_jiffies, MEMCG_MAX_HIGH_DELAY_JIFFIES); | |
| 2362 | +} | |
| 2363 | + | |
| 2364 | +/* | |
| 2365 | + * Scheduled by try_charge() to be executed from the userland return path | |
| 2366 | + * and reclaims memory over the high limit. | |
| 2367 | + */ | |
| 2368 | +void mem_cgroup_handle_over_high(void) | |
| 2369 | +{ | |
| 2370 | + unsigned long penalty_jiffies; | |
| 2371 | + unsigned long pflags; | |
| 2372 | + unsigned int nr_pages = current->memcg_nr_pages_over_high; | |
| 2373 | + struct mem_cgroup *memcg; | |
| 2374 | + | |
| 2375 | + if (likely(!nr_pages)) | |
| 2376 | + return; | |
| 2377 | + | |
| 2378 | + memcg = get_mem_cgroup_from_mm(current->mm); | |
| 2379 | + reclaim_high(memcg, nr_pages, GFP_KERNEL); | |
| 2380 | + current->memcg_nr_pages_over_high = 0; | |
| 2381 | + | |
| 2382 | + /* | |
| 2383 | + * memory.high is breached and reclaim is unable to keep up. Throttle | |
| 2384 | + * allocators proactively to slow down excessive growth. | |
| 2385 | + */ | |
| 2386 | + penalty_jiffies = calculate_high_delay(memcg, nr_pages); | |
| 2364 | 2387 | |
| 2365 | 2388 | /* |
| 2366 | 2389 | * Don't sleep if the amount of jiffies this memcg owes us is so low |
| @@ -4027,7 +4050,7 @@ static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg, · 1660 unmodified lines | ||
| 4027 | 4050 | struct mem_cgroup_thresholds *thresholds; |
| 4028 | 4051 | struct mem_cgroup_threshold_ary *new; |
| 4029 | 4052 | unsigned long usage; |
| 4030 | − int i, j, size; | |
| 4053 | + int i, j, size, entries; | |
| 4031 | 4054 | |
| 4032 | 4055 | mutex_lock(&memcg->thresholds_lock); |
| 4033 | 4056 | |
| @@ -4047,14 +4070,20 @@ static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg, · 13 unmodified lines | ||
| 4047 | 4070 | __mem_cgroup_threshold(memcg, type == _MEMSWAP); |
| 4048 | 4071 | |
| 4049 | 4072 | /* Calculate new number of threshold */ |
| 4050 | − size = 0; | |
| 4073 | + size = entries = 0; | |
| 4051 | 4074 | for (i = 0; i < thresholds->primary->size; i++) { |
| 4052 | 4075 | if (thresholds->primary->entries[i].eventfd != eventfd) |
| 4053 | 4076 | size++; |
| 4077 | + else | |
| 4078 | + entries++; | |
| 4054 | 4079 | } |
| 4055 | 4080 | |
| 4056 | 4081 | new = thresholds->spare; |
| 4057 | 4082 | |
| 4083 | + /* If no items related to eventfd have been cleared, nothing to do */ | |
| 4084 | + if (!entries) | |
| 4085 | + goto unlock; | |
| 4086 | + | |
| 4058 | 4087 | /* Set thresholds array to NULL if we don't have thresholds */ |
| 4059 | 4088 | if (!size) { |
| 4060 | 4089 | kfree(new); |
| @@ -6682,19 +6711,9 @@ void mem_cgroup_sk_alloc(struct sock *sk) · 2621 unmodified lines | ||
| 6682 | 6711 | if (!mem_cgroup_sockets_enabled) |
| 6683 | 6712 | return; |
| 6684 | 6713 | |
| 6685 | − /* | |
| 6686 | − * Socket cloning can throw us here with sk_memcg already | |
| 6687 | − * filled. It won't however, necessarily happen from | |
| 6688 | − * process context. So the test for root memcg given | |
| 6689 | − * the current task's memcg won't help us in this case. | |
| 6690 | − * | |
| 6691 | − * Respecting the original socket's memcg is a better | |
| 6692 | − * decision in this case. | |
| 6693 | − */ | |
| 6694 | − if (sk->sk_memcg) { | |
| 6695 | − css_get(&sk->sk_memcg->css); | |
| 6714 | + /* Do not associate the sock with unrelated interrupted task's memcg. */ | |
| 6715 | + if (in_interrupt()) | |
| 6696 | 6716 | return; |
| 6697 | − } | |
| 6698 | 6717 | |
| 6699 | 6718 | rcu_read_lock(); |
| 6700 | 6719 | memcg = mem_cgroup_from_task(current); |
| @@ -307,7 +307,8 @@ static void mn_hlist_release(struct mmu_notifier_subscriptions *subscriptions, · 306 unmodified lines | ||
| 307 | 307 | * ->release returns. |
| 308 | 308 | */ |
| 309 | 309 | id = srcu_read_lock(&srcu); |
| 310 | − hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist) | |
| 310 | + hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist, | |
| 311 | + srcu_read_lock_held(&srcu)) | |
| 311 | 312 | /* |
| 312 | 313 | * If ->release runs before mmu_notifier_unregister it must be |
| 313 | 314 | * handled, as it's the only way for the driver to flush all |
| @@ -370,7 +371,8 @@ int __mmu_notifier_clear_flush_young(struct mm_struct *mm, · 56 unmodified lines | ||
| 370 | 371 | |
| 371 | 372 | id = srcu_read_lock(&srcu); |
| 372 | 373 | hlist_for_each_entry_rcu(subscription, |
| 373 | − &mm->notifier_subscriptions->list, hlist) { | |
| 374 | + &mm->notifier_subscriptions->list, hlist, | |
| 375 | + srcu_read_lock_held(&srcu)) { | |
| 374 | 376 | if (subscription->ops->clear_flush_young) |
| 375 | 377 | young |= subscription->ops->clear_flush_young( |
| 376 | 378 | subscription, mm, start, end); |
| @@ -389,7 +391,8 @@ int __mmu_notifier_clear_young(struct mm_struct *mm, · 12 unmodified lines | ||
| 389 | 391 | |
| 390 | 392 | id = srcu_read_lock(&srcu); |
| 391 | 393 | hlist_for_each_entry_rcu(subscription, |
| 392 | − &mm->notifier_subscriptions->list, hlist) { | |
| 394 | + &mm->notifier_subscriptions->list, hlist, | |
| 395 | + srcu_read_lock_held(&srcu)) { | |
| 393 | 396 | if (subscription->ops->clear_young) |
| 394 | 397 | young |= subscription->ops->clear_young(subscription, |
| 395 | 398 | mm, start, end); |
| @@ -407,7 +410,8 @@ int __mmu_notifier_test_young(struct mm_struct *mm, · 11 unmodified lines | ||
| 407 | 410 | |
| 408 | 411 | id = srcu_read_lock(&srcu); |
| 409 | 412 | hlist_for_each_entry_rcu(subscription, |
| 410 | − &mm->notifier_subscriptions->list, hlist) { | |
| 413 | + &mm->notifier_subscriptions->list, hlist, | |
| 414 | + srcu_read_lock_held(&srcu)) { | |
| 411 | 415 | if (subscription->ops->test_young) { |
| 412 | 416 | young = subscription->ops->test_young(subscription, mm, |
| 413 | 417 | address); |
| @@ -428,7 +432,8 @@ void __mmu_notifier_change_pte(struct mm_struct *mm, unsigned long address, · 14 unmodified lines | ||
| 428 | 432 | |
| 429 | 433 | id = srcu_read_lock(&srcu); |
| 430 | 434 | hlist_for_each_entry_rcu(subscription, |
| 431 | − &mm->notifier_subscriptions->list, hlist) { | |
| 435 | + &mm->notifier_subscriptions->list, hlist, | |
| 436 | + srcu_read_lock_held(&srcu)) { | |
| 432 | 437 | if (subscription->ops->change_pte) |
| 433 | 438 | subscription->ops->change_pte(subscription, mm, address, |
| 434 | 439 | pte); |
| @@ -476,7 +481,8 @@ static int mn_hlist_invalidate_range_start( · 41 unmodified lines | ||
| 476 | 481 | int id; |
| 477 | 482 | |
| 478 | 483 | id = srcu_read_lock(&srcu); |
| 479 | − hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist) { | |
| 484 | + hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist, | |
| 485 | + srcu_read_lock_held(&srcu)) { | |
| 480 | 486 | const struct mmu_notifier_ops *ops = subscription->ops; |
| 481 | 487 | |
| 482 | 488 | if (ops->invalidate_range_start) { |
| @@ -528,7 +534,8 @@ mn_hlist_invalidate_end(struct mmu_notifier_subscriptions *subscriptions, · 45 unmodified lines | ||
| 528 | 534 | int id; |
| 529 | 535 | |
| 530 | 536 | id = srcu_read_lock(&srcu); |
| 531 | − hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist) { | |
| 537 | + hlist_for_each_entry_rcu(subscription, &subscriptions->list, hlist, | |
| 538 | + srcu_read_lock_held(&srcu)) { | |
| 532 | 539 | /* |
| 533 | 540 | * Call invalidate_range here too to avoid the need for the |
| 534 | 541 | * subsystem of having to register an invalidate_range_end |
| @@ -582,7 +589,8 @@ void __mmu_notifier_invalidate_range(struct mm_struct *mm, · 47 unmodified lines | ||
| 582 | 589 | |
| 583 | 590 | id = srcu_read_lock(&srcu); |
| 584 | 591 | hlist_for_each_entry_rcu(subscription, |
| 585 | − &mm->notifier_subscriptions->list, hlist) { | |
| 592 | + &mm->notifier_subscriptions->list, hlist, | |
| 593 | + srcu_read_lock_held(&srcu)) { | |
| 586 | 594 | if (subscription->ops->invalidate_range) |
| 587 | 595 | subscription->ops->invalidate_range(subscription, mm, |
| 588 | 596 | start, end); |
| @@ -714,7 +722,8 @@ find_get_mmu_notifier(struct mm_struct *mm, const struct mmu_notifier_ops *ops) · 125 unmodified lines | ||
| 714 | 722 | |
| 715 | 723 | spin_lock(&mm->notifier_subscriptions->lock); |
| 716 | 724 | hlist_for_each_entry_rcu(subscription, |
| 717 | − &mm->notifier_subscriptions->list, hlist) { | |
| 725 | + &mm->notifier_subscriptions->list, hlist, | |
| 726 | + lockdep_is_held(&mm->notifier_subscriptions->lock)) { | |
| 718 | 727 | if (subscription->ops != ops) |
| 719 | 728 | continue; |
| 720 | 729 | |
| @@ -370,10 +370,14 @@ void vm_unmap_aliases(void) · 369 unmodified lines | ||
| 370 | 370 | EXPORT_SYMBOL_GPL(vm_unmap_aliases); |
| 371 | 371 | |
| 372 | 372 | /* |
| 373 | − * Implement a stub for vmalloc_sync_all() if the architecture chose not to | |
| 374 | − * have one. | |
| 373 | + * Implement a stub for vmalloc_sync_[un]mapping() if the architecture | |
| 374 | + * chose not to have one. | |
| 375 | 375 | */ |
| 376 | −void __weak vmalloc_sync_all(void) | |
| 376 | +void __weak vmalloc_sync_mappings(void) | |
| 377 | +{ | |
| 378 | +} | |
| 379 | + | |
| 380 | +void __weak vmalloc_sync_unmappings(void) | |
| 377 | 381 | { |
| 378 | 382 | } |
| 379 | 383 | |
| @@ -1973,8 +1973,6 @@ static void *get_partial(struct kmem_cache *s, gfp_t flags, int node, · 1972 unmodified lines | ||
| 1973 | 1973 | |
| 1974 | 1974 | if (node == NUMA_NO_NODE) |
| 1975 | 1975 | searchnode = numa_mem_id(); |
| 1976 | − else if (!node_present_pages(node)) | |
| 1977 | − searchnode = node_to_mem_node(node); | |
| 1978 | 1976 | |
| 1979 | 1977 | object = get_partial_node(s, get_node(s, searchnode), c, flags); |
| 1980 | 1978 | if (object || node != NUMA_NO_NODE) |
| @@ -2563,17 +2561,27 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, · 582 unmodified lines | ||
| 2563 | 2561 | struct page *page; |
| 2564 | 2562 | |
| 2565 | 2563 | page = c->page; |
| 2566 | − if (!page) | |
| 2564 | + if (!page) { | |
| 2565 | + /* | |
| 2566 | + * if the node is not online or has no normal memory, just | |
| 2567 | + * ignore the node constraint | |
| 2568 | + */ | |
| 2569 | + if (unlikely(node != NUMA_NO_NODE && | |
| 2570 | + !node_state(node, N_NORMAL_MEMORY))) | |
| 2571 | + node = NUMA_NO_NODE; | |
| 2567 | 2572 | goto new_slab; |
| 2573 | + } | |
| 2568 | 2574 | redo: |
| 2569 | 2575 | |
| 2570 | 2576 | if (unlikely(!node_match(page, node))) { |
| 2571 | − int searchnode = node; | |
| 2572 | − | |
| 2573 | − if (node != NUMA_NO_NODE && !node_present_pages(node)) | |
| 2574 | − searchnode = node_to_mem_node(node); | |
| 2575 | − | |
| 2576 | − if (unlikely(!node_match(page, searchnode))) { | |
| 2577 | + /* | |
| 2578 | + * same as above but node_match() being false already | |
| 2579 | + * implies node != NUMA_NO_NODE | |
| 2580 | + */ | |
| 2581 | + if (!node_state(node, N_NORMAL_MEMORY)) { | |
| 2582 | + node = NUMA_NO_NODE; | |
| 2583 | + goto redo; | |
| 2584 | + } else { | |
| 2577 | 2585 | stat(s, ALLOC_NODE_MISMATCH); |
| 2578 | 2586 | deactivate_slab(s, page, c->freelist, c); |
| 2579 | 2587 | goto new_slab; |
| @@ -2997,11 +3005,13 @@ redo: · 417 unmodified lines | ||
| 2997 | 3005 | barrier(); |
| 2998 | 3006 | |
| 2999 | 3007 | if (likely(page == c->page)) { |
| 3000 | − set_freepointer(s, tail_obj, c->freelist); | |
| 3008 | + void **freelist = READ_ONCE(c->freelist); | |
| 3009 | + | |
| 3010 | + set_freepointer(s, tail_obj, freelist); | |
| 3001 | 3011 | |
| 3002 | 3012 | if (unlikely(!this_cpu_cmpxchg_double( |
| 3003 | 3013 | s->cpu_slab->freelist, s->cpu_slab->tid, |
| 3004 | − c->freelist, tid, | |
| 3014 | + freelist, tid, | |
| 3005 | 3015 | head, next_tid(tid)))) { |
| 3006 | 3016 | |
| 3007 | 3017 | note_cmpxchg_failure("slab_free", s, tid); |
| @@ -3174,6 +3184,15 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, · 166 unmodified lines | ||
| 3174 | 3184 | void *object = c->freelist; |
| 3175 | 3185 | |
| 3176 | 3186 | if (unlikely(!object)) { |
| 3187 | + /* | |
| 3188 | + * We may have removed an object from c->freelist using | |
| 3189 | + * the fastpath in the previous iteration; in that case, | |
| 3190 | + * c->tid has not been bumped yet. | |
| 3191 | + * Since ___slab_alloc() may reenable interrupts while | |
| 3192 | + * allocating memory, we should bump c->tid now. | |
| 3193 | + */ | |
| 3194 | + c->tid = next_tid(c->tid); | |
| 3195 | + | |
| 3177 | 3196 | /* |
| 3178 | 3197 | * Invoking slow path likely have side-effect |
| 3179 | 3198 | * of re-populating per CPU c->freelist |
| @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, · 733 unmodified lines | ||
| 734 | 734 | struct mem_section *ms = __pfn_to_section(pfn); |
| 735 | 735 | bool section_is_early = early_section(ms); |
| 736 | 736 | struct page *memmap = NULL; |
| 737 | + bool empty; | |
| 737 | 738 | unsigned long *subsection_map = ms->usage |
| 738 | 739 | ? &ms->usage->subsection_map[0] : NULL; |
| 739 | 740 | |
| @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, · 24 unmodified lines | ||
| 764 | 765 | * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified |
| 765 | 766 | */ |
| 766 | 767 | bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); |
| 767 | − if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { | |
| 768 | + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); | |
| 769 | + if (empty) { | |
| 768 | 770 | unsigned long section_nr = pfn_to_section_nr(pfn); |
| 769 | 771 | |
| 770 | 772 | /* |
| @@ -779,13 +781,15 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, · 8 unmodified lines | ||
| 779 | 781 | ms->usage = NULL; |
| 780 | 782 | } |
| 781 | 783 | memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); |
| 782 | − ms->section_mem_map = (unsigned long)NULL; | |
| 783 | 784 | } |
| 784 | 785 | |
| 785 | 786 | if (section_is_early && memmap) |
| 786 | 787 | free_map_bootmem(memmap); |
| 787 | 788 | else |
| 788 | 789 | depopulate_section_memmap(pfn, nr_pages, altmap); |
| 790 | + | |
| 791 | + if (empty) | |
| 792 | + ms->section_mem_map = (unsigned long)NULL; | |
| 789 | 793 | } |
| 790 | 794 | |
| 791 | 795 | static struct page * __meminit section_activate(int nid, unsigned long pfn, |
| @@ -1295,7 +1295,7 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end) · 1294 unmodified lines | ||
| 1295 | 1295 | * First make sure the mappings are removed from all page-tables |
| 1296 | 1296 | * before they are freed. |
| 1297 | 1297 | */ |
| 1298 | − vmalloc_sync_all(); | |
| 1298 | + vmalloc_sync_unmappings(); | |
| 1299 | 1299 | |
| 1300 | 1300 | /* |
| 1301 | 1301 | * TODO: to calculate a flush range without looping. |
| @@ -3128,16 +3128,19 @@ int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, · 1826 unmodified lines | ||
| 3128 | 3128 | EXPORT_SYMBOL(remap_vmalloc_range); |
| 3129 | 3129 | |
| 3130 | 3130 | /* |
| 3131 | − * Implement a stub for vmalloc_sync_all() if the architecture chose not to | |
| 3132 | − * have one. | |
| 3131 | + * Implement stubs for vmalloc_sync_[un]mappings () if the architecture chose | |
| 3132 | + * not to have one. | |
| 3133 | 3133 | * |
| 3134 | 3134 | * The purpose of this function is to make sure the vmalloc area |
| 3135 | 3135 | * mappings are identical in all page-tables in the system. |
| 3136 | 3136 | */ |
| 3137 | −void __weak vmalloc_sync_all(void) | |
| 3137 | +void __weak vmalloc_sync_mappings(void) | |
| 3138 | 3138 | { |
| 3139 | 3139 | } |
| 3140 | 3140 | |
| 3141 | +void __weak vmalloc_sync_unmappings(void) | |
| 3142 | +{ | |
| 3143 | +} | |
| 3141 | 3144 | |
| 3142 | 3145 | static int f(pte_t *pte, unsigned long addr, void *data) |
| 3143 | 3146 | { |
| @@ -789,6 +789,10 @@ static void batadv_iv_ogm_schedule_buff(struct batadv_hard_iface *hard_iface) · 788 unmodified lines | ||
| 789 | 789 | |
| 790 | 790 | lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex); |
| 791 | 791 | |
| 792 | + /* interface already disabled by batadv_iv_ogm_iface_disable */ | |
| 793 | + if (!*ogm_buff) | |
| 794 | + return; | |
| 795 | + | |
| 792 | 796 | /* the interface gets activated here to avoid race conditions between |
| 793 | 797 | * the moment of activating the interface in |
| 794 | 798 | * hardif_activate_interface() where the originator mac is set and |
| @@ -112,7 +112,8 @@ static struct caif_device_entry *caif_get(struct net_device *dev) · 111 unmodified lines | ||
| 112 | 112 | caif_device_list(dev_net(dev)); |
| 113 | 113 | struct caif_device_entry *caifd; |
| 114 | 114 | |
| 115 | − list_for_each_entry_rcu(caifd, &caifdevs->list, list) { | |
| 115 | + list_for_each_entry_rcu(caifd, &caifdevs->list, list, | |
| 116 | + lockdep_rtnl_is_held()) { | |
| 116 | 117 | if (caifd->netdev == dev) |
| 117 | 118 | return caifd; |
| 118 | 119 | } |
| @@ -3352,34 +3352,41 @@ devlink_param_value_get_from_info(const struct devlink_param *param, · 3351 unmodified lines | ||
| 3352 | 3352 | struct genl_info *info, |
| 3353 | 3353 | union devlink_param_value *value) |
| 3354 | 3354 | { |
| 3355 | + struct nlattr *param_data; | |
| 3355 | 3356 | int len; |
| 3356 | 3357 | |
| 3357 | − if (param->type != DEVLINK_PARAM_TYPE_BOOL && | |
| 3358 | − !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) | |
| 3358 | + param_data = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]; | |
| 3359 | + | |
| 3360 | + if (param->type != DEVLINK_PARAM_TYPE_BOOL && !param_data) | |
| 3359 | 3361 | return -EINVAL; |
| 3360 | 3362 | |
| 3361 | 3363 | switch (param->type) { |
| 3362 | 3364 | case DEVLINK_PARAM_TYPE_U8: |
| 3363 | − value->vu8 = nla_get_u8(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); | |
| 3365 | + if (nla_len(param_data) != sizeof(u8)) | |
| 3366 | + return -EINVAL; | |
| 3367 | + value->vu8 = nla_get_u8(param_data); | |
| 3364 | 3368 | break; |
| 3365 | 3369 | case DEVLINK_PARAM_TYPE_U16: |
| 3366 | − value->vu16 = nla_get_u16(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); | |
| 3370 | + if (nla_len(param_data) != sizeof(u16)) | |
| 3371 | + return -EINVAL; | |
| 3372 | + value->vu16 = nla_get_u16(param_data); | |
| 3367 | 3373 | break; |
| 3368 | 3374 | case DEVLINK_PARAM_TYPE_U32: |
| 3369 | − value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); | |
| 3375 | + if (nla_len(param_data) != sizeof(u32)) | |
| 3376 | + return -EINVAL; | |
| 3377 | + value->vu32 = nla_get_u32(param_data); | |
| 3370 | 3378 | break; |
| 3371 | 3379 | case DEVLINK_PARAM_TYPE_STRING: |
| 3372 | − len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]), | |
| 3373 | − nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); | |
| 3374 | − if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) || | |
| 3380 | + len = strnlen(nla_data(param_data), nla_len(param_data)); | |
| 3381 | + if (len == nla_len(param_data) || | |
| 3375 | 3382 | len >= __DEVLINK_PARAM_MAX_STRING_VALUE) |
| 3376 | 3383 | return -EINVAL; |
| 3377 | − strcpy(value->vstr, | |
| 3378 | − nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); | |
| 3384 | + strcpy(value->vstr, nla_data(param_data)); | |
| 3379 | 3385 | break; |
| 3380 | 3386 | case DEVLINK_PARAM_TYPE_BOOL: |
| 3381 | − value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? | |
| 3382 | − true : false; | |
| 3387 | + if (param_data && nla_len(param_data)) | |
| 3388 | + return -EINVAL; | |
| 3389 | + value->vbool = nla_get_flag(param_data); | |
| 3383 | 3390 | break; |
| 3384 | 3391 | } |
| 3385 | 3392 | return 0; |
| @@ -5951,6 +5958,8 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { · 2565 unmodified lines | ||
| 5951 | 5958 | [DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .type = NLA_U8 }, |
| 5952 | 5959 | [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING }, |
| 5953 | 5960 | [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32 }, |
| 5961 | + [DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .type = NLA_U64 }, | |
| 5962 | + [DEVLINK_ATTR_REGION_CHUNK_LEN] = { .type = NLA_U64 }, | |
| 5954 | 5963 | [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING }, |
| 5955 | 5964 | [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64 }, |
| 5956 | 5965 | [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .type = NLA_U8 }, |
| @@ -53,30 +53,60 @@ static void cgrp_css_free(struct cgroup_subsys_state *css) · 52 unmodified lines | ||
| 53 | 53 | kfree(css_cls_state(css)); |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | +/* | |
| 57 | + * To avoid freezing of sockets creation for tasks with big number of threads | |
| 58 | + * and opened sockets lets release file_lock every 1000 iterated descriptors. | |
| 59 | + * New sockets will already have been created with new classid. | |
| 60 | + */ | |
| 61 | + | |
| 62 | +struct update_classid_context { | |
| 63 | + u32 classid; | |
| 64 | + unsigned int batch; | |
| 65 | +}; | |
| 66 | + | |
| 67 | +#define UPDATE_CLASSID_BATCH 1000 | |
| 68 | + | |
| 56 | 69 | static int update_classid_sock(const void *v, struct file *file, unsigned n) |
| 57 | 70 | { |
| 58 | 71 | int err; |
| 72 | + struct update_classid_context *ctx = (void *)v; | |
| 59 | 73 | struct socket *sock = sock_from_file(file, &err); |
| 60 | 74 | |
| 61 | 75 | if (sock) { |
| 62 | 76 | spin_lock(&cgroup_sk_update_lock); |
| 63 | − sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, | |
| 64 | − (unsigned long)v); | |
| 77 | + sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, ctx->classid); | |
| 65 | 78 | spin_unlock(&cgroup_sk_update_lock); |
| 66 | 79 | } |
| 80 | + if (--ctx->batch == 0) { | |
| 81 | + ctx->batch = UPDATE_CLASSID_BATCH; | |
| 82 | + return n + 1; | |
| 83 | + } | |
| 67 | 84 | return 0; |
| 68 | 85 | } |
| 69 | 86 | |
| 87 | +static void update_classid_task(struct task_struct *p, u32 classid) | |
| 88 | +{ | |
| 89 | + struct update_classid_context ctx = { | |
| 90 | + .classid = classid, | |
| 91 | + .batch = UPDATE_CLASSID_BATCH | |
| 92 | + }; | |
| 93 | + unsigned int fd = 0; | |
| 94 | + | |
| 95 | + do { | |
| 96 | + task_lock(p); | |
| 97 | + fd = iterate_fd(p->files, fd, update_classid_sock, &ctx); | |
| 98 | + task_unlock(p); | |
| 99 | + cond_resched(); | |
| 100 | + } while (fd); | |
| 101 | +} | |
| 102 | + | |
| 70 | 103 | static void cgrp_attach(struct cgroup_taskset *tset) |
| 71 | 104 | { |
| 72 | 105 | struct cgroup_subsys_state *css; |
| 73 | 106 | struct task_struct *p; |
| 74 | 107 | |
| 75 | 108 | cgroup_taskset_for_each(p, css, tset) { |
| 76 | − task_lock(p); | |
| 77 | − iterate_fd(p->files, 0, update_classid_sock, | |
| 78 | − (void *)(unsigned long)css_cls_state(css)->classid); | |
| 79 | − task_unlock(p); | |
| 109 | + update_classid_task(p, css_cls_state(css)->classid); | |
| 80 | 110 | } |
| 81 | 111 | } |
| 82 | 112 | |
| @@ -98,10 +128,7 @@ static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, · 15 unmodified lines | ||
| 98 | 128 | |
| 99 | 129 | css_task_iter_start(css, 0, &it); |
| 100 | 130 | while ((p = css_task_iter_next(&it))) { |
| 101 | − task_lock(p); | |
| 102 | − iterate_fd(p->files, 0, update_classid_sock, | |
| 103 | − (void *)(unsigned long)cs->classid); | |
| 104 | − task_unlock(p); | |
| 131 | + update_classid_task(p, cs->classid); | |
| 105 | 132 | cond_resched(); |
| 106 | 133 | } |
| 107 | 134 | css_task_iter_end(&it); |
| @@ -1830,7 +1830,10 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) · 1829 unmodified lines | ||
| 1830 | 1830 | atomic_set(&newsk->sk_zckey, 0); |
| 1831 | 1831 | |
| 1832 | 1832 | sock_reset_flag(newsk, SOCK_DONE); |
| 1833 | − mem_cgroup_sk_alloc(newsk); | |
| 1833 | + | |
| 1834 | + /* sk->sk_memcg will be populated at accept() time */ | |
| 1835 | + newsk->sk_memcg = NULL; | |
| 1836 | + | |
| 1834 | 1837 | cgroup_sk_alloc(&newsk->sk_cgrp_data); |
| 1835 | 1838 | |
| 1836 | 1839 | rcu_read_lock(); |
| @@ -117,7 +117,9 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev, · 116 unmodified lines | ||
| 117 | 117 | /* port.c */ |
| 118 | 118 | int dsa_port_set_state(struct dsa_port *dp, u8 state, |
| 119 | 119 | struct switchdev_trans *trans); |
| 120 | +int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy); | |
| 120 | 121 | int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); |
| 122 | +void dsa_port_disable_rt(struct dsa_port *dp); | |
| 121 | 123 | void dsa_port_disable(struct dsa_port *dp); |
| 122 | 124 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br); |
| 123 | 125 | void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br); |
| @@ -63,7 +63,7 @@ static void dsa_port_set_state_now(struct dsa_port *dp, u8 state) · 62 unmodified lines | ||
| 63 | 63 | pr_err("DSA: failed to set STP state %u (%d)\n", state, err); |
| 64 | 64 | } |
| 65 | 65 | |
| 66 | −int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) | |
| 66 | +int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy) | |
| 67 | 67 | { |
| 68 | 68 | struct dsa_switch *ds = dp->ds; |
| 69 | 69 | int port = dp->index; |
| @@ -78,14 +78,31 @@ int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) · 8 unmodified lines | ||
| 78 | 78 | if (!dp->bridge_dev) |
| 79 | 79 | dsa_port_set_state_now(dp, BR_STATE_FORWARDING); |
| 80 | 80 | |
| 81 | + if (dp->pl) | |
| 82 | + phylink_start(dp->pl); | |
| 83 | + | |
| 81 | 84 | return 0; |
| 82 | 85 | } |
| 83 | 86 | |
| 84 | −void dsa_port_disable(struct dsa_port *dp) | |
| 87 | +int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) | |
| 88 | +{ | |
| 89 | + int err; | |
| 90 | + | |
| 91 | + rtnl_lock(); | |
| 92 | + err = dsa_port_enable_rt(dp, phy); | |
| 93 | + rtnl_unlock(); | |
| 94 | + | |
| 95 | + return err; | |
| 96 | +} | |
| 97 | + | |
| 98 | +void dsa_port_disable_rt(struct dsa_port *dp) | |
| 85 | 99 | { |
| 86 | 100 | struct dsa_switch *ds = dp->ds; |
| 87 | 101 | int port = dp->index; |
| 88 | 102 | |
| 103 | + if (dp->pl) | |
| 104 | + phylink_stop(dp->pl); | |
| 105 | + | |
| 89 | 106 | if (!dp->bridge_dev) |
| 90 | 107 | dsa_port_set_state_now(dp, BR_STATE_DISABLED); |
| 91 | 108 | |
| @@ -93,6 +110,13 @@ void dsa_port_disable(struct dsa_port *dp) · 1 unmodified line | ||
| 93 | 110 | ds->ops->port_disable(ds, port); |
| 94 | 111 | } |
| 95 | 112 | |
| 113 | +void dsa_port_disable(struct dsa_port *dp) | |
| 114 | +{ | |
| 115 | + rtnl_lock(); | |
| 116 | + dsa_port_disable_rt(dp); | |
| 117 | + rtnl_unlock(); | |
| 118 | +} | |
| 119 | + | |
| 96 | 120 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br) |
| 97 | 121 | { |
| 98 | 122 | struct dsa_notifier_bridge_info info = { |
| @@ -614,10 +638,6 @@ static int dsa_port_phylink_register(struct dsa_port *dp) · 515 unmodified lines | ||
| 614 | 638 | goto err_phy_connect; |
| 615 | 639 | } |
| 616 | 640 | |
| 617 | − rtnl_lock(); | |
| 618 | − phylink_start(dp->pl); | |
| 619 | − rtnl_unlock(); | |
| 620 | − | |
| 621 | 641 | return 0; |
| 622 | 642 | |
| 623 | 643 | err_phy_connect: |
| @@ -628,9 +648,14 @@ err_phy_connect: · 4 unmodified lines | ||
| 628 | 648 | int dsa_port_link_register_of(struct dsa_port *dp) |
| 629 | 649 | { |
| 630 | 650 | struct dsa_switch *ds = dp->ds; |
| 651 | + struct device_node *phy_np; | |
| 631 | 652 | |
| 632 | − if (!ds->ops->adjust_link) | |
| 633 | − return dsa_port_phylink_register(dp); | |
| 653 | + if (!ds->ops->adjust_link) { | |
| 654 | + phy_np = of_parse_phandle(dp->dn, "phy-handle", 0); | |
| 655 | + if (of_phy_is_fixed_link(dp->dn) || phy_np) | |
| 656 | + return dsa_port_phylink_register(dp); | |
| 657 | + return 0; | |
| 658 | + } | |
| 634 | 659 | |
| 635 | 660 | dev_warn(ds->dev, |
| 636 | 661 | "Using legacy PHYLIB callbacks. Please migrate to PHYLINK!\n"); |
| @@ -645,11 +670,12 @@ void dsa_port_link_unregister_of(struct dsa_port *dp) · 8 unmodified lines | ||
| 645 | 670 | { |
| 646 | 671 | struct dsa_switch *ds = dp->ds; |
| 647 | 672 | |
| 648 | − if (!ds->ops->adjust_link) { | |
| 673 | + if (!ds->ops->adjust_link && dp->pl) { | |
| 649 | 674 | rtnl_lock(); |
| 650 | 675 | phylink_disconnect_phy(dp->pl); |
| 651 | 676 | rtnl_unlock(); |
| 652 | 677 | phylink_destroy(dp->pl); |
| 678 | + dp->pl = NULL; | |
| 653 | 679 | return; |
| 654 | 680 | } |
| 655 | 681 | |
| @@ -88,12 +88,10 @@ static int dsa_slave_open(struct net_device *dev) · 87 unmodified lines | ||
| 88 | 88 | goto clear_allmulti; |
| 89 | 89 | } |
| 90 | 90 | |
| 91 | − err = dsa_port_enable(dp, dev->phydev); | |
| 91 | + err = dsa_port_enable_rt(dp, dev->phydev); | |
| 92 | 92 | if (err) |
| 93 | 93 | goto clear_promisc; |
| 94 | 94 | |
| 95 | − phylink_start(dp->pl); | |
| 96 | − | |
| 97 | 95 | return 0; |
| 98 | 96 | |
| 99 | 97 | clear_promisc: |
| @@ -114,9 +112,7 @@ static int dsa_slave_close(struct net_device *dev) · 14 unmodified lines | ||
| 114 | 112 | struct net_device *master = dsa_slave_to_master(dev); |
| 115 | 113 | struct dsa_port *dp = dsa_slave_to_port(dev); |
| 116 | 114 | |
| 117 | − phylink_stop(dp->pl); | |
| 118 | − | |
| 119 | − dsa_port_disable(dp); | |
| 115 | + dsa_port_disable_rt(dp); | |
| 120 | 116 | |
| 121 | 117 | dev_mc_unsync(master, dev); |
| 122 | 118 | dev_uc_unsync(master, dev); |
| @@ -21,7 +21,13 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { · 20 unmodified lines | ||
| 21 | 21 | [IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, }, |
| 22 | 22 | [IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, }, |
| 23 | 23 | [IEEE802154_ATTR_CHANNEL] = { .type = NLA_U8, }, |
| 24 | + [IEEE802154_ATTR_BCN_ORD] = { .type = NLA_U8, }, | |
| 25 | + [IEEE802154_ATTR_SF_ORD] = { .type = NLA_U8, }, | |
| 26 | + [IEEE802154_ATTR_PAN_COORD] = { .type = NLA_U8, }, | |
| 27 | + [IEEE802154_ATTR_BAT_EXT] = { .type = NLA_U8, }, | |
| 28 | + [IEEE802154_ATTR_COORD_REALIGN] = { .type = NLA_U8, }, | |
| 24 | 29 | [IEEE802154_ATTR_PAGE] = { .type = NLA_U8, }, |
| 30 | + [IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, }, | |
| 25 | 31 | [IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, }, |
| 26 | 32 | [IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, }, |
| 27 | 33 | [IEEE802154_ATTR_COORD_PAN_ID] = { .type = NLA_U16, }, |
| @@ -56,7 +56,9 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version) · 55 unmodified lines | ||
| 56 | 56 | } |
| 57 | 57 | EXPORT_SYMBOL_GPL(gre_del_protocol); |
| 58 | 58 | |
| 59 | −/* Fills in tpi and returns header length to be pulled. */ | |
| 59 | +/* Fills in tpi and returns header length to be pulled. | |
| 60 | + * Note that caller must use pskb_may_pull() before pulling GRE header. | |
| 61 | + */ | |
| 60 | 62 | int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, |
| 61 | 63 | bool *csum_err, __be16 proto, int nhs) |
| 62 | 64 | { |
| @@ -110,8 +112,14 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, · 47 unmodified lines | ||
| 110 | 112 | * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header |
| 111 | 113 | */ |
| 112 | 114 | if (greh->flags == 0 && tpi->proto == htons(ETH_P_WCCP)) { |
| 115 | + u8 _val, *val; | |
| 116 | + | |
| 117 | + val = skb_header_pointer(skb, nhs + hdr_len, | |
| 118 | + sizeof(_val), &_val); | |
| 119 | + if (!val) | |
| 120 | + return -EINVAL; | |
| 113 | 121 | tpi->proto = proto; |
| 114 | − if ((*(u8 *)options & 0xF0) != 0x40) | |
| 122 | + if ((*val & 0xF0) != 0x40) | |
| 115 | 123 | hdr_len += 4; |
| 116 | 124 | } |
| 117 | 125 | tpi->hdr_len = hdr_len; |
| @@ -482,8 +482,28 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern) · 481 unmodified lines | ||
| 482 | 482 | } |
| 483 | 483 | spin_unlock_bh(&queue->fastopenq.lock); |
| 484 | 484 | } |
| 485 | + | |
| 485 | 486 | out: |
| 486 | 487 | release_sock(sk); |
| 488 | + if (newsk && mem_cgroup_sockets_enabled) { | |
| 489 | + int amt; | |
| 490 | + | |
| 491 | + /* atomically get the memory usage, set and charge the | |
| 492 | + * newsk->sk_memcg. | |
| 493 | + */ | |
| 494 | + lock_sock(newsk); | |
| 495 | + | |
| 496 | + /* The socket has not been accepted yet, no need to look at | |
| 497 | + * newsk->sk_wmem_queued. | |
| 498 | + */ | |
| 499 | + amt = sk_mem_pages(newsk->sk_forward_alloc + | |
| 500 | + atomic_read(&newsk->sk_rmem_alloc)); | |
| 501 | + mem_cgroup_sk_alloc(newsk); | |
| 502 | + if (newsk->sk_memcg && amt) | |
| 503 | + mem_cgroup_charge_skmem(newsk->sk_memcg, amt); | |
| 504 | + | |
| 505 | + release_sock(newsk); | |
| 506 | + } | |
| 487 | 507 | if (req) |
| 488 | 508 | reqsk_put(req); |
| 489 | 509 | return newsk; |
| @@ -100,13 +100,9 @@ static size_t inet_sk_attr_size(struct sock *sk, · 99 unmodified lines | ||
| 100 | 100 | aux = handler->idiag_get_aux_size(sk, net_admin); |
| 101 | 101 | |
| 102 | 102 | return nla_total_size(sizeof(struct tcp_info)) |
| 103 | − + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ | |
| 104 | − + nla_total_size(1) /* INET_DIAG_TOS */ | |
| 105 | − + nla_total_size(1) /* INET_DIAG_TCLASS */ | |
| 106 | − + nla_total_size(4) /* INET_DIAG_MARK */ | |
| 107 | − + nla_total_size(4) /* INET_DIAG_CLASS_ID */ | |
| 108 | − + nla_total_size(sizeof(struct inet_diag_meminfo)) | |
| 109 | 103 | + nla_total_size(sizeof(struct inet_diag_msg)) |
| 104 | + + inet_diag_msg_attrs_size() | |
| 105 | + + nla_total_size(sizeof(struct inet_diag_meminfo)) | |
| 110 | 106 | + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) |
| 111 | 107 | + nla_total_size(TCP_CA_NAME_MAX) |
| 112 | 108 | + nla_total_size(sizeof(struct tcpvegas_info)) |
| @@ -147,6 +143,24 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb, · 34 unmodified lines | ||
| 147 | 143 | if (net_admin && nla_put_u32(skb, INET_DIAG_MARK, sk->sk_mark)) |
| 148 | 144 | goto errout; |
| 149 | 145 | |
| 146 | + if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) || | |
| 147 | + ext & (1 << (INET_DIAG_TCLASS - 1))) { | |
| 148 | + u32 classid = 0; | |
| 149 | + | |
| 150 | +#ifdef CONFIG_SOCK_CGROUP_DATA | |
| 151 | + classid = sock_cgroup_classid(&sk->sk_cgrp_data); | |
| 152 | +#endif | |
| 153 | + /* Fallback to socket priority if class id isn't set. | |
| 154 | + * Classful qdiscs use it as direct reference to class. | |
| 155 | + * For cgroup2 classid is always zero. | |
| 156 | + */ | |
| 157 | + if (!classid) | |
| 158 | + classid = sk->sk_priority; | |
| 159 | + | |
| 160 | + if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid)) | |
| 161 | + goto errout; | |
| 162 | + } | |
| 163 | + | |
| 150 | 164 | r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk)); |
| 151 | 165 | r->idiag_inode = sock_i_ino(sk); |
| 152 | 166 | |
| @@ -284,24 +298,6 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, · 131 unmodified lines | ||
| 284 | 298 | goto errout; |
| 285 | 299 | } |
| 286 | 300 | |
| 287 | − if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) || | |
| 288 | − ext & (1 << (INET_DIAG_TCLASS - 1))) { | |
| 289 | − u32 classid = 0; | |
| 290 | − | |
| 291 | −#ifdef CONFIG_SOCK_CGROUP_DATA | |
| 292 | − classid = sock_cgroup_classid(&sk->sk_cgrp_data); | |
| 293 | −#endif | |
| 294 | − /* Fallback to socket priority if class id isn't set. | |
| 295 | − * Classful qdiscs use it as direct reference to class. | |
| 296 | − * For cgroup2 classid is always zero. | |
| 297 | − */ | |
| 298 | − if (!classid) | |
| 299 | − classid = sk->sk_priority; | |
| 300 | − | |
| 301 | − if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid)) | |
| 302 | − goto errout; | |
| 303 | − } | |
| 304 | − | |
| 305 | 301 | out: |
| 306 | 302 | nlmsg_end(skb, nlh); |
| 307 | 303 | return 0; |
| @@ -100,8 +100,9 @@ static int raw_diag_dump_one(struct sk_buff *in_skb, · 99 unmodified lines | ||
| 100 | 100 | if (IS_ERR(sk)) |
| 101 | 101 | return PTR_ERR(sk); |
| 102 | 102 | |
| 103 | − rep = nlmsg_new(sizeof(struct inet_diag_msg) + | |
| 104 | − sizeof(struct inet_diag_meminfo) + 64, | |
| 103 | + rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + | |
| 104 | + inet_diag_msg_attrs_size() + | |
| 105 | + nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, | |
| 105 | 106 | GFP_KERNEL); |
| 106 | 107 | if (!rep) { |
| 107 | 108 | sock_put(sk); |
| @@ -64,8 +64,9 @@ static int udp_dump_one(struct udp_table *tbl, struct sk_buff *in_skb, · 63 unmodified lines | ||
| 64 | 64 | goto out; |
| 65 | 65 | |
| 66 | 66 | err = -ENOMEM; |
| 67 | − rep = nlmsg_new(sizeof(struct inet_diag_msg) + | |
| 68 | − sizeof(struct inet_diag_meminfo) + 64, | |
| 67 | + rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + | |
| 68 | + inet_diag_msg_attrs_size() + | |
| 69 | + nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, | |
| 69 | 70 | GFP_KERNEL); |
| 70 | 71 | if (!rep) |
| 71 | 72 | goto out; |
| @@ -1226,11 +1226,13 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) · 1225 unmodified lines | ||
| 1226 | 1226 | } |
| 1227 | 1227 | |
| 1228 | 1228 | static void |
| 1229 | −cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) | |
| 1229 | +cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, | |
| 1230 | + bool del_rt, bool del_peer) | |
| 1230 | 1231 | { |
| 1231 | 1232 | struct fib6_info *f6i; |
| 1232 | 1233 | |
| 1233 | − f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len, | |
| 1234 | + f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr, | |
| 1235 | + ifp->prefix_len, | |
| 1234 | 1236 | ifp->idev->dev, 0, RTF_DEFAULT, true); |
| 1235 | 1237 | if (f6i) { |
| 1236 | 1238 | if (del_rt) |
| @@ -1293,7 +1295,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) · 56 unmodified lines | ||
| 1293 | 1295 | |
| 1294 | 1296 | if (action != CLEANUP_PREFIX_RT_NOP) { |
| 1295 | 1297 | cleanup_prefix_route(ifp, expires, |
| 1296 | − action == CLEANUP_PREFIX_RT_DEL); | |
| 1298 | + action == CLEANUP_PREFIX_RT_DEL, false); | |
| 1297 | 1299 | } |
| 1298 | 1300 | |
| 1299 | 1301 | /* clean up prefsrc entries */ |
| @@ -3345,6 +3347,10 @@ static void addrconf_dev_config(struct net_device *dev) · 2045 unmodified lines | ||
| 3345 | 3347 | (dev->type != ARPHRD_NONE) && |
| 3346 | 3348 | (dev->type != ARPHRD_RAWIP)) { |
| 3347 | 3349 | /* Alas, we support only Ethernet autoconfiguration. */ |
| 3350 | + idev = __in6_dev_get(dev); | |
| 3351 | + if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP && | |
| 3352 | + dev->flags & IFF_MULTICAST) | |
| 3353 | + ipv6_mc_up(idev); | |
| 3348 | 3354 | return; |
| 3349 | 3355 | } |
| 3350 | 3356 | |
| @@ -4586,12 +4592,14 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, · 1235 unmodified lines | ||
| 4586 | 4592 | } |
| 4587 | 4593 | |
| 4588 | 4594 | static int modify_prefix_route(struct inet6_ifaddr *ifp, |
| 4589 | − unsigned long expires, u32 flags) | |
| 4595 | + unsigned long expires, u32 flags, | |
| 4596 | + bool modify_peer) | |
| 4590 | 4597 | { |
| 4591 | 4598 | struct fib6_info *f6i; |
| 4592 | 4599 | u32 prio; |
| 4593 | 4600 | |
| 4594 | − f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len, | |
| 4601 | + f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, | |
| 4602 | + ifp->prefix_len, | |
| 4595 | 4603 | ifp->idev->dev, 0, RTF_DEFAULT, true); |
| 4596 | 4604 | if (!f6i) |
| 4597 | 4605 | return -ENOENT; |
| @@ -4602,7 +4610,8 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, · 4 unmodified lines | ||
| 4602 | 4610 | ip6_del_rt(dev_net(ifp->idev->dev), f6i); |
| 4603 | 4611 | |
| 4604 | 4612 | /* add new one */ |
| 4605 | − addrconf_prefix_route(&ifp->addr, ifp->prefix_len, | |
| 4613 | + addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, | |
| 4614 | + ifp->prefix_len, | |
| 4606 | 4615 | ifp->rt_priority, ifp->idev->dev, |
| 4607 | 4616 | expires, flags, GFP_KERNEL); |
| 4608 | 4617 | } else { |
| @@ -4624,6 +4633,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 15 unmodified lines | ||
| 4624 | 4633 | unsigned long timeout; |
| 4625 | 4634 | bool was_managetempaddr; |
| 4626 | 4635 | bool had_prefixroute; |
| 4636 | + bool new_peer = false; | |
| 4627 | 4637 | |
| 4628 | 4638 | ASSERT_RTNL(); |
| 4629 | 4639 | |
| @@ -4655,6 +4665,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 25 unmodified lines | ||
| 4655 | 4665 | cfg->preferred_lft = timeout; |
| 4656 | 4666 | } |
| 4657 | 4667 | |
| 4668 | + if (cfg->peer_pfx && | |
| 4669 | + memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) { | |
| 4670 | + if (!ipv6_addr_any(&ifp->peer_addr)) | |
| 4671 | + cleanup_prefix_route(ifp, expires, true, true); | |
| 4672 | + new_peer = true; | |
| 4673 | + } | |
| 4674 | + | |
| 4658 | 4675 | spin_lock_bh(&ifp->lock); |
| 4659 | 4676 | was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; |
| 4660 | 4677 | had_prefixroute = ifp->flags & IFA_F_PERMANENT && |
| @@ -4670,6 +4687,9 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 9 unmodified lines | ||
| 4670 | 4687 | if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) |
| 4671 | 4688 | ifp->rt_priority = cfg->rt_priority; |
| 4672 | 4689 | |
| 4690 | + if (new_peer) | |
| 4691 | + ifp->peer_addr = *cfg->peer_pfx; | |
| 4692 | + | |
| 4673 | 4693 | spin_unlock_bh(&ifp->lock); |
| 4674 | 4694 | if (!(ifp->flags&IFA_F_TENTATIVE)) |
| 4675 | 4695 | ipv6_ifa_notify(0, ifp); |
| @@ -4678,7 +4698,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 2 unmodified lines | ||
| 4678 | 4698 | int rc = -ENOENT; |
| 4679 | 4699 | |
| 4680 | 4700 | if (had_prefixroute) |
| 4681 | − rc = modify_prefix_route(ifp, expires, flags); | |
| 4701 | + rc = modify_prefix_route(ifp, expires, flags, false); | |
| 4682 | 4702 | |
| 4683 | 4703 | /* prefix route could have been deleted; if so restore it */ |
| 4684 | 4704 | if (rc == -ENOENT) { |
| @@ -4686,6 +4706,15 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 1 unmodified line | ||
| 4686 | 4706 | ifp->rt_priority, ifp->idev->dev, |
| 4687 | 4707 | expires, flags, GFP_KERNEL); |
| 4688 | 4708 | } |
| 4709 | + | |
| 4710 | + if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr)) | |
| 4711 | + rc = modify_prefix_route(ifp, expires, flags, true); | |
| 4712 | + | |
| 4713 | + if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) { | |
| 4714 | + addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len, | |
| 4715 | + ifp->rt_priority, ifp->idev->dev, | |
| 4716 | + expires, flags, GFP_KERNEL); | |
| 4717 | + } | |
| 4689 | 4718 | } else if (had_prefixroute) { |
| 4690 | 4719 | enum cleanup_prefix_rt_t action; |
| 4691 | 4720 | unsigned long rt_expires; |
| @@ -4696,7 +4725,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 4 unmodified lines | ||
| 4696 | 4725 | |
| 4697 | 4726 | if (action != CLEANUP_PREFIX_RT_NOP) { |
| 4698 | 4727 | cleanup_prefix_route(ifp, rt_expires, |
| 4699 | − action == CLEANUP_PREFIX_RT_DEL); | |
| 4728 | + action == CLEANUP_PREFIX_RT_DEL, false); | |
| 4700 | 4729 | } |
| 4701 | 4730 | } |
| 4702 | 4731 | |
| @@ -5983,9 +6012,9 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) · 1280 unmodified lines | ||
| 5983 | 6012 | if (ifp->idev->cnf.forwarding) |
| 5984 | 6013 | addrconf_join_anycast(ifp); |
| 5985 | 6014 | if (!ipv6_addr_any(&ifp->peer_addr)) |
| 5986 | − addrconf_prefix_route(&ifp->peer_addr, 128, 0, | |
| 5987 | − ifp->idev->dev, 0, 0, | |
| 5988 | − GFP_ATOMIC); | |
| 6015 | + addrconf_prefix_route(&ifp->peer_addr, 128, | |
| 6016 | + ifp->rt_priority, ifp->idev->dev, | |
| 6017 | + 0, 0, GFP_ATOMIC); | |
| 5989 | 6018 | break; |
| 5990 | 6019 | case RTM_DELADDR: |
| 5991 | 6020 | if (ifp->idev->cnf.forwarding) |
| @@ -268,7 +268,7 @@ static int seg6_do_srh(struct sk_buff *skb) · 267 unmodified lines | ||
| 268 | 268 | skb_mac_header_rebuild(skb); |
| 269 | 269 | skb_push(skb, skb->mac_len); |
| 270 | 270 | |
| 271 | − err = seg6_do_srh_encap(skb, tinfo->srh, NEXTHDR_NONE); | |
| 271 | + err = seg6_do_srh_encap(skb, tinfo->srh, IPPROTO_ETHERNET); | |
| 272 | 272 | if (err) |
| 273 | 273 | return err; |
| 274 | 274 | |
| @@ -282,7 +282,7 @@ static int input_action_end_dx2(struct sk_buff *skb, · 281 unmodified lines | ||
| 282 | 282 | struct net_device *odev; |
| 283 | 283 | struct ethhdr *eth; |
| 284 | 284 | |
| 285 | − if (!decap_and_validate(skb, NEXTHDR_NONE)) | |
| 285 | + if (!decap_and_validate(skb, IPPROTO_ETHERNET)) | |
| 286 | 286 | goto drop; |
| 287 | 287 | |
| 288 | 288 | if (!pskb_may_pull(skb, ETH_HLEN)) |
| @@ -1152,7 +1152,8 @@ int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata, · 1151 unmodified lines | ||
| 1152 | 1152 | } |
| 1153 | 1153 | } |
| 1154 | 1154 | |
| 1155 | − if (!(mpath->flags & MESH_PATH_RESOLVING)) | |
| 1155 | + if (!(mpath->flags & MESH_PATH_RESOLVING) && | |
| 1156 | + mesh_path_sel_is_hwmp(sdata)) | |
| 1156 | 1157 | mesh_queue_preq(mpath, PREQ_Q_F_START); |
| 1157 | 1158 | |
| 1158 | 1159 | if (skb_queue_len(&mpath->frame_queue) >= MESH_FRAME_QUEUE_LEN) |
| @@ -334,6 +334,8 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, · 333 unmodified lines | ||
| 334 | 334 | struct mptcp_sock *msk; |
| 335 | 335 | unsigned int ack_size; |
| 336 | 336 | bool ret = false; |
| 337 | + bool can_ack; | |
| 338 | + u64 ack_seq; | |
| 337 | 339 | u8 tcp_fin; |
| 338 | 340 | |
| 339 | 341 | if (skb) { |
| @@ -360,9 +362,22 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, · 20 unmodified lines | ||
| 360 | 362 | ret = true; |
| 361 | 363 | } |
| 362 | 364 | |
| 365 | + /* passive sockets msk will set the 'can_ack' after accept(), even | |
| 366 | + * if the first subflow may have the already the remote key handy | |
| 367 | + */ | |
| 368 | + can_ack = true; | |
| 363 | 369 | opts->ext_copy.use_ack = 0; |
| 364 | 370 | msk = mptcp_sk(subflow->conn); |
| 365 | − if (!msk || !READ_ONCE(msk->can_ack)) { | |
| 371 | + if (likely(msk && READ_ONCE(msk->can_ack))) { | |
| 372 | + ack_seq = msk->ack_seq; | |
| 373 | + } else if (subflow->can_ack) { | |
| 374 | + mptcp_crypto_key_sha(subflow->remote_key, NULL, &ack_seq); | |
| 375 | + ack_seq++; | |
| 376 | + } else { | |
| 377 | + can_ack = false; | |
| 378 | + } | |
| 379 | + | |
| 380 | + if (unlikely(!can_ack)) { | |
| 366 | 381 | *size = ALIGN(dss_size, 4); |
| 367 | 382 | return ret; |
| 368 | 383 | } |
| @@ -375,7 +390,7 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, · 6 unmodified lines | ||
| 375 | 390 | |
| 376 | 391 | dss_size += ack_size; |
| 377 | 392 | |
| 378 | − opts->ext_copy.data_ack = msk->ack_seq; | |
| 393 | + opts->ext_copy.data_ack = ack_seq; | |
| 379 | 394 | opts->ext_copy.ack64 = 1; |
| 380 | 395 | opts->ext_copy.use_ack = 1; |
| 381 | 396 | |
| @@ -411,7 +411,7 @@ static void *ct_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos) · 410 unmodified lines | ||
| 411 | 411 | *pos = cpu + 1; |
| 412 | 412 | return per_cpu_ptr(net->ct.stat, cpu); |
| 413 | 413 | } |
| 414 | − | |
| 414 | + (*pos)++; | |
| 415 | 415 | return NULL; |
| 416 | 416 | } |
| 417 | 417 | |
| @@ -267,7 +267,7 @@ static void *synproxy_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos) · 266 unmodified lines | ||
| 267 | 267 | *pos = cpu + 1; |
| 268 | 268 | return per_cpu_ptr(snet->stats, cpu); |
| 269 | 269 | } |
| 270 | − | |
| 270 | + (*pos)++; | |
| 271 | 271 | return NULL; |
| 272 | 272 | } |
| 273 | 273 | |
| @@ -1405,6 +1405,11 @@ static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net, · 1404 unmodified lines | ||
| 1405 | 1405 | lockdep_commit_lock_is_held(net)); |
| 1406 | 1406 | if (nft_dump_stats(skb, stats)) |
| 1407 | 1407 | goto nla_put_failure; |
| 1408 | + | |
| 1409 | + if ((chain->flags & NFT_CHAIN_HW_OFFLOAD) && | |
| 1410 | + nla_put_be32(skb, NFTA_CHAIN_FLAGS, | |
| 1411 | + htonl(NFT_CHAIN_HW_OFFLOAD))) | |
| 1412 | + goto nla_put_failure; | |
| 1408 | 1413 | } |
| 1409 | 1414 | |
| 1410 | 1415 | if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use))) |
| @@ -6300,8 +6305,13 @@ static int nf_tables_newflowtable(struct net *net, struct sock *nlsk, · 4889 unmodified lines | ||
| 6300 | 6305 | goto err4; |
| 6301 | 6306 | |
| 6302 | 6307 | err = nft_register_flowtable_net_hooks(ctx.net, table, flowtable); |
| 6303 | − if (err < 0) | |
| 6308 | + if (err < 0) { | |
| 6309 | + list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) { | |
| 6310 | + list_del_rcu(&hook->list); | |
| 6311 | + kfree_rcu(hook, rcu); | |
| 6312 | + } | |
| 6304 | 6313 | goto err4; |
| 6314 | + } | |
| 6305 | 6315 | |
| 6306 | 6316 | err = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable); |
| 6307 | 6317 | if (err < 0) |
| @@ -7378,13 +7388,8 @@ static void nf_tables_module_autoload(struct net *net) · 1070 unmodified lines | ||
| 7378 | 7388 | list_splice_init(&net->nft.module_list, &module_list); |
| 7379 | 7389 | mutex_unlock(&net->nft.commit_mutex); |
| 7380 | 7390 | list_for_each_entry_safe(req, next, &module_list, list) { |
| 7381 | − if (req->done) { | |
| 7382 | − list_del(&req->list); | |
| 7383 | − kfree(req); | |
| 7384 | − } else { | |
| 7385 | − request_module("%s", req->module); | |
| 7386 | − req->done = true; | |
| 7387 | − } | |
| 7391 | + request_module("%s", req->module); | |
| 7392 | + req->done = true; | |
| 7388 | 7393 | } |
| 7389 | 7394 | mutex_lock(&net->nft.commit_mutex); |
| 7390 | 7395 | list_splice(&module_list, &net->nft.module_list); |
| @@ -8167,6 +8172,7 @@ static void __net_exit nf_tables_exit_net(struct net *net) · 776 unmodified lines | ||
| 8167 | 8172 | __nft_release_tables(net); |
| 8168 | 8173 | mutex_unlock(&net->nft.commit_mutex); |
| 8169 | 8174 | WARN_ON_ONCE(!list_empty(&net->nft.tables)); |
| 8175 | + WARN_ON_ONCE(!list_empty(&net->nft.module_list)); | |
| 8170 | 8176 | } |
| 8171 | 8177 | |
| 8172 | 8178 | static struct pernet_operations nf_tables_net_ops = { |
| @@ -742,6 +742,8 @@ static const struct nla_policy nfnl_cthelper_policy[NFCTH_MAX+1] = { · 741 unmodified lines | ||
| 742 | 742 | [NFCTH_NAME] = { .type = NLA_NUL_STRING, |
| 743 | 743 | .len = NF_CT_HELPER_NAME_LEN-1 }, |
| 744 | 744 | [NFCTH_QUEUE_NUM] = { .type = NLA_U32, }, |
| 745 | + [NFCTH_PRIV_DATA_LEN] = { .type = NLA_U32, }, | |
| 746 | + [NFCTH_STATUS] = { .type = NLA_U32, }, | |
| 745 | 747 | }; |
| 746 | 748 | |
| 747 | 749 | static const struct nfnl_callback nfnl_cthelper_cb[NFNL_MSG_CTHELPER_MAX] = { |
| @@ -89,6 +89,7 @@ static const struct nft_chain_type nft_chain_nat_inet = { · 88 unmodified lines | ||
| 89 | 89 | .name = "nat", |
| 90 | 90 | .type = NFT_CHAIN_T_NAT, |
| 91 | 91 | .family = NFPROTO_INET, |
| 92 | + .owner = THIS_MODULE, | |
| 92 | 93 | .hook_mask = (1 << NF_INET_PRE_ROUTING) | |
| 93 | 94 | (1 << NF_INET_LOCAL_IN) | |
| 94 | 95 | (1 << NF_INET_LOCAL_OUT) | |
| @@ -129,6 +129,7 @@ static const struct nla_policy nft_payload_policy[NFTA_PAYLOAD_MAX + 1] = { · 128 unmodified lines | ||
| 129 | 129 | [NFTA_PAYLOAD_LEN] = { .type = NLA_U32 }, |
| 130 | 130 | [NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 }, |
| 131 | 131 | [NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 }, |
| 132 | + [NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 }, | |
| 132 | 133 | }; |
| 133 | 134 | |
| 134 | 135 | static int nft_payload_init(const struct nft_ctx *ctx, |
| @@ -339,6 +339,8 @@ static const struct nla_policy nft_tunnel_key_policy[NFTA_TUNNEL_KEY_MAX + 1] = · 338 unmodified lines | ||
| 339 | 339 | [NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, }, |
| 340 | 340 | [NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, }, |
| 341 | 341 | [NFTA_TUNNEL_KEY_TTL] = { .type = NLA_U8, }, |
| 342 | + [NFTA_TUNNEL_KEY_SPORT] = { .type = NLA_U16, }, | |
| 343 | + [NFTA_TUNNEL_KEY_DPORT] = { .type = NLA_U16, }, | |
| 342 | 344 | [NFTA_TUNNEL_KEY_OPTS] = { .type = NLA_NESTED, }, |
| 343 | 345 | }; |
| 344 | 346 | |
| @@ -1551,6 +1551,9 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos, · 1550 unmodified lines | ||
| 1551 | 1551 | uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file)); |
| 1552 | 1552 | struct nf_mttg_trav *trav = seq->private; |
| 1553 | 1553 | |
| 1554 | + if (ppos != NULL) | |
| 1555 | + ++(*ppos); | |
| 1556 | + | |
| 1554 | 1557 | switch (trav->class) { |
| 1555 | 1558 | case MTTG_TRAV_INIT: |
| 1556 | 1559 | trav->class = MTTG_TRAV_NFP_UNSPEC; |
| @@ -1576,9 +1579,6 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos, · 19 unmodified lines | ||
| 1576 | 1579 | default: |
| 1577 | 1580 | return NULL; |
| 1578 | 1581 | } |
| 1579 | − | |
| 1580 | − if (ppos != NULL) | |
| 1581 | − ++*ppos; | |
| 1582 | 1582 | return trav; |
| 1583 | 1583 | } |
| 1584 | 1584 | |
| @@ -492,12 +492,12 @@ static void *recent_seq_next(struct seq_file *seq, void *v, loff_t *pos) · 491 unmodified lines | ||
| 492 | 492 | const struct recent_entry *e = v; |
| 493 | 493 | const struct list_head *head = e->list.next; |
| 494 | 494 | |
| 495 | + (*pos)++; | |
| 495 | 496 | while (head == &t->iphash[st->bucket]) { |
| 496 | 497 | if (++st->bucket >= ip_list_hash_size) |
| 497 | 498 | return NULL; |
| 498 | 499 | head = t->iphash[st->bucket].next; |
| 499 | 500 | } |
| 500 | − (*pos)++; | |
| 501 | 501 | return list_entry(head, struct recent_entry, list); |
| 502 | 502 | } |
| 503 | 503 | |
| @@ -2434,7 +2434,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err, · 2433 unmodified lines | ||
| 2434 | 2434 | in_skb->len)) |
| 2435 | 2435 | WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS, |
| 2436 | 2436 | (u8 *)extack->bad_attr - |
| 2437 | − in_skb->data)); | |
| 2437 | + (u8 *)nlh)); | |
| 2438 | 2438 | } else { |
| 2439 | 2439 | if (extack->cookie_len) |
| 2440 | 2440 | WARN_ON(nla_put(skb, NLMSGERR_ATTR_COOKIE, |
| @@ -181,13 +181,20 @@ exit: · 180 unmodified lines | ||
| 181 | 181 | void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, |
| 182 | 182 | struct sk_buff *skb) |
| 183 | 183 | { |
| 184 | − u8 gate = hdev->pipes[pipe].gate; | |
| 185 | 184 | u8 status = NFC_HCI_ANY_OK; |
| 186 | 185 | struct hci_create_pipe_resp *create_info; |
| 187 | 186 | struct hci_delete_pipe_noti *delete_info; |
| 188 | 187 | struct hci_all_pipe_cleared_noti *cleared_info; |
| 188 | + u8 gate; | |
| 189 | 189 | |
| 190 | − pr_debug("from gate %x pipe %x cmd %x\n", gate, pipe, cmd); | |
| 190 | + pr_debug("from pipe %x cmd %x\n", pipe, cmd); | |
| 191 | + | |
| 192 | + if (pipe >= NFC_HCI_MAX_PIPES) { | |
| 193 | + status = NFC_HCI_ANY_E_NOK; | |
| 194 | + goto exit; | |
| 195 | + } | |
| 196 | + | |
| 197 | + gate = hdev->pipes[pipe].gate; | |
| 191 | 198 | |
| 192 | 199 | switch (cmd) { |
| 193 | 200 | case NFC_HCI_ADM_NOTIFY_PIPE_CREATED: |
| @@ -375,8 +382,14 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event, · 181 unmodified lines | ||
| 375 | 382 | struct sk_buff *skb) |
| 376 | 383 | { |
| 377 | 384 | int r = 0; |
| 378 | − u8 gate = hdev->pipes[pipe].gate; | |
| 385 | + u8 gate; | |
| 386 | + | |
| 387 | + if (pipe >= NFC_HCI_MAX_PIPES) { | |
| 388 | + pr_err("Discarded event %x to invalid pipe %x\n", event, pipe); | |
| 389 | + goto exit; | |
| 390 | + } | |
| 379 | 391 | |
| 392 | + gate = hdev->pipes[pipe].gate; | |
| 380 | 393 | if (gate == NFC_HCI_INVALID_GATE) { |
| 381 | 394 | pr_err("Discarded event %x to unopened pipe %x\n", event, pipe); |
| 382 | 395 | goto exit; |
| @@ -32,6 +32,7 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = { · 31 unmodified lines | ||
| 32 | 32 | [NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING, |
| 33 | 33 | .len = NFC_DEVICE_NAME_MAXSIZE }, |
| 34 | 34 | [NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 }, |
| 35 | + [NFC_ATTR_TARGET_INDEX] = { .type = NLA_U32 }, | |
| 35 | 36 | [NFC_ATTR_COMM_MODE] = { .type = NLA_U8 }, |
| 36 | 37 | [NFC_ATTR_RF_MODE] = { .type = NLA_U8 }, |
| 37 | 38 | [NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 }, |
| @@ -43,7 +44,10 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = { · 5 unmodified lines | ||
| 43 | 44 | [NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED }, |
| 44 | 45 | [NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING, |
| 45 | 46 | .len = NFC_FIRMWARE_NAME_MAXSIZE }, |
| 47 | + [NFC_ATTR_SE_INDEX] = { .type = NLA_U32 }, | |
| 46 | 48 | [NFC_ATTR_SE_APDU] = { .type = NLA_BINARY }, |
| 49 | + [NFC_ATTR_VENDOR_ID] = { .type = NLA_U32 }, | |
| 50 | + [NFC_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, | |
| 47 | 51 | [NFC_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, |
| 48 | 52 | |
| 49 | 53 | }; |
| @@ -645,6 +645,7 @@ static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = { · 644 unmodified lines | ||
| 645 | 645 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, |
| 646 | 646 | [OVS_PACKET_ATTR_PROBE] = { .type = NLA_FLAG }, |
| 647 | 647 | [OVS_PACKET_ATTR_MRU] = { .type = NLA_U16 }, |
| 648 | + [OVS_PACKET_ATTR_HASH] = { .type = NLA_U64 }, | |
| 648 | 649 | }; |
| 649 | 650 | |
| 650 | 651 | static const struct genl_ops dp_packet_genl_ops[] = { |
| @@ -2274,6 +2274,13 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, · 2273 unmodified lines | ||
| 2274 | 2274 | TP_STATUS_KERNEL, (macoff+snaplen)); |
| 2275 | 2275 | if (!h.raw) |
| 2276 | 2276 | goto drop_n_account; |
| 2277 | + | |
| 2278 | + if (do_vnet && | |
| 2279 | + virtio_net_hdr_from_skb(skb, h.raw + macoff - | |
| 2280 | + sizeof(struct virtio_net_hdr), | |
| 2281 | + vio_le(), true, 0)) | |
| 2282 | + goto drop_n_account; | |
| 2283 | + | |
| 2277 | 2284 | if (po->tp_version <= TPACKET_V2) { |
| 2278 | 2285 | packet_increment_rx_head(po, &po->rx_ring); |
| 2279 | 2286 | /* |
| @@ -2286,12 +2293,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, · 6 unmodified lines | ||
| 2286 | 2293 | status |= TP_STATUS_LOSING; |
| 2287 | 2294 | } |
| 2288 | 2295 | |
| 2289 | − if (do_vnet && | |
| 2290 | − virtio_net_hdr_from_skb(skb, h.raw + macoff - | |
| 2291 | − sizeof(struct virtio_net_hdr), | |
| 2292 | − vio_le(), true, 0)) | |
| 2293 | − goto drop_n_account; | |
| 2294 | − | |
| 2295 | 2296 | po->stats.stats1.tp_packets++; |
| 2296 | 2297 | if (copy_skb) { |
| 2297 | 2298 | status |= TP_STATUS_COPY; |
| @@ -744,6 +744,7 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = { · 743 unmodified lines | ||
| 744 | 744 | [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, |
| 745 | 745 | [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, |
| 746 | 746 | [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, |
| 747 | + [TCA_FQ_ORPHAN_MASK] = { .type = NLA_U32 }, | |
| 747 | 748 | [TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, |
| 748 | 749 | [TCA_FQ_CE_THRESHOLD] = { .type = NLA_U32 }, |
| 749 | 750 | }; |
| @@ -564,8 +564,10 @@ static struct sk_buff *taprio_dequeue_soft(struct Qdisc *sch) · 563 unmodified lines | ||
| 564 | 564 | prio = skb->priority; |
| 565 | 565 | tc = netdev_get_prio_tc_map(dev, prio); |
| 566 | 566 | |
| 567 | − if (!(gate_mask & BIT(tc))) | |
| 567 | + if (!(gate_mask & BIT(tc))) { | |
| 568 | + skb = NULL; | |
| 568 | 569 | continue; |
| 570 | + } | |
| 569 | 571 | |
| 570 | 572 | len = qdisc_pkt_len(skb); |
| 571 | 573 | guard = ktime_add_ns(taprio_get_time(q), |
| @@ -575,13 +577,17 @@ static struct sk_buff *taprio_dequeue_soft(struct Qdisc *sch) · 3 unmodified lines | ||
| 575 | 577 | * guard band ... |
| 576 | 578 | */ |
| 577 | 579 | if (gate_mask != TAPRIO_ALL_GATES_OPEN && |
| 578 | − ktime_after(guard, entry->close_time)) | |
| 580 | + ktime_after(guard, entry->close_time)) { | |
| 581 | + skb = NULL; | |
| 579 | 582 | continue; |
| 583 | + } | |
| 580 | 584 | |
| 581 | 585 | /* ... and no budget. */ |
| 582 | 586 | if (gate_mask != TAPRIO_ALL_GATES_OPEN && |
| 583 | − atomic_sub_return(len, &entry->budget) < 0) | |
| 587 | + atomic_sub_return(len, &entry->budget) < 0) { | |
| 588 | + skb = NULL; | |
| 584 | 589 | continue; |
| 590 | + } | |
| 585 | 591 | |
| 586 | 592 | skb = child->ops->dequeue(child); |
| 587 | 593 | if (unlikely(!skb)) |
| @@ -768,6 +774,7 @@ static const struct nla_policy taprio_policy[TCA_TAPRIO_ATTR_MAX + 1] = { · 180 unmodified lines | ||
| 768 | 774 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME] = { .type = NLA_S64 }, |
| 769 | 775 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 }, |
| 770 | 776 | [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 }, |
| 777 | + [TCA_TAPRIO_ATTR_TXTIME_DELAY] = { .type = NLA_U32 }, | |
| 771 | 778 | }; |
| 772 | 779 | |
| 773 | 780 | static int fill_sched_entry(struct nlattr **tb, struct sched_entry *entry, |
| @@ -237,15 +237,11 @@ static size_t inet_assoc_attr_size(struct sctp_association *asoc) · 236 unmodified lines | ||
| 237 | 237 | addrcnt++; |
| 238 | 238 | |
| 239 | 239 | return nla_total_size(sizeof(struct sctp_info)) |
| 240 | − + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ | |
| 241 | − + nla_total_size(1) /* INET_DIAG_TOS */ | |
| 242 | − + nla_total_size(1) /* INET_DIAG_TCLASS */ | |
| 243 | − + nla_total_size(4) /* INET_DIAG_MARK */ | |
| 244 | − + nla_total_size(4) /* INET_DIAG_CLASS_ID */ | |
| 245 | 240 | + nla_total_size(addrlen * asoc->peer.transport_count) |
| 246 | 241 | + nla_total_size(addrlen * addrcnt) |
| 247 | − + nla_total_size(sizeof(struct inet_diag_meminfo)) | |
| 248 | 242 | + nla_total_size(sizeof(struct inet_diag_msg)) |
| 243 | + + inet_diag_msg_attrs_size() | |
| 244 | + + nla_total_size(sizeof(struct inet_diag_meminfo)) | |
| 249 | 245 | + 64; |
| 250 | 246 | } |
| 251 | 247 | |
| @@ -582,6 +582,7 @@ static void smc_ib_remove_dev(struct ib_device *ibdev, void *client_data) · 581 unmodified lines | ||
| 582 | 582 | smc_smcr_terminate_all(smcibdev); |
| 583 | 583 | smc_ib_cleanup_per_ibdev(smcibdev); |
| 584 | 584 | ib_unregister_event_handler(&smcibdev->event_handler); |
| 585 | + cancel_work_sync(&smcibdev->port_event_work); | |
| 585 | 586 | kfree(smcibdev); |
| 586 | 587 | } |
| 587 | 588 | |
| @@ -1707,7 +1707,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog) · 1706 unmodified lines | ||
| 1707 | 1707 | |
| 1708 | 1708 | int __sys_accept4_file(struct file *file, unsigned file_flags, |
| 1709 | 1709 | struct sockaddr __user *upeer_sockaddr, |
| 1710 | − int __user *upeer_addrlen, int flags) | |
| 1710 | + int __user *upeer_addrlen, int flags, | |
| 1711 | + unsigned long nofile) | |
| 1711 | 1712 | { |
| 1712 | 1713 | struct socket *sock, *newsock; |
| 1713 | 1714 | struct file *newfile; |
| @@ -1738,7 +1739,7 @@ int __sys_accept4_file(struct file *file, unsigned file_flags, · 24 unmodified lines | ||
| 1738 | 1739 | */ |
| 1739 | 1740 | __module_get(newsock->ops->owner); |
| 1740 | 1741 | |
| 1741 | − newfd = get_unused_fd_flags(flags); | |
| 1742 | + newfd = __get_unused_fd_flags(flags, nofile); | |
| 1742 | 1743 | if (unlikely(newfd < 0)) { |
| 1743 | 1744 | err = newfd; |
| 1744 | 1745 | sock_release(newsock); |
| @@ -1807,7 +1808,8 @@ int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, · 62 unmodified lines | ||
| 1807 | 1808 | f = fdget(fd); |
| 1808 | 1809 | if (f.file) { |
| 1809 | 1810 | ret = __sys_accept4_file(f.file, 0, upeer_sockaddr, |
| 1810 | − upeer_addrlen, flags); | |
| 1811 | + upeer_addrlen, flags, | |
| 1812 | + rlimit(RLIMIT_NOFILE)); | |
| 1811 | 1813 | if (f.flags) |
| 1812 | 1814 | fput(f.file); |
| 1813 | 1815 | } |
| @@ -116,6 +116,7 @@ const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = { · 115 unmodified lines | ||
| 116 | 116 | [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, |
| 117 | 117 | [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, |
| 118 | 118 | [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }, |
| 119 | + [TIPC_NLA_PROP_MTU] = { .type = NLA_U32 }, | |
| 119 | 120 | [TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 }, |
| 120 | 121 | [TIPC_NLA_PROP_BROADCAST_RATIO] = { .type = NLA_U32 } |
| 121 | 122 | }; |
| @@ -470,6 +470,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { · 469 unmodified lines | ||
| 470 | 470 | [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, |
| 471 | 471 | [NL80211_ATTR_STA_PLINK_STATE] = |
| 472 | 472 | NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), |
| 473 | + [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, | |
| 474 | + [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, | |
| 473 | 475 | [NL80211_ATTR_MESH_PEER_AID] = |
| 474 | 476 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), |
| 475 | 477 | [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, |
| @@ -531,6 +533,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { · 55 unmodified lines | ||
| 531 | 533 | [NL80211_ATTR_MDID] = { .type = NLA_U16 }, |
| 532 | 534 | [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, |
| 533 | 535 | .len = IEEE80211_MAX_DATA_LEN }, |
| 536 | + [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, | |
| 537 | + [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = { .type = NLA_U16 }, | |
| 534 | 538 | [NL80211_ATTR_PEER_AID] = |
| 535 | 539 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), |
| 536 | 540 | [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, |
| @@ -561,6 +565,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { · 24 unmodified lines | ||
| 561 | 565 | NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), |
| 562 | 566 | [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, |
| 563 | 567 | [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, |
| 568 | + [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, | |
| 564 | 569 | [NL80211_ATTR_MAC_MASK] = { |
| 565 | 570 | .type = NLA_EXACT_LEN_WARN, |
| 566 | 571 | .len = ETH_ALEN |
| @@ -44,3 +44,10 @@ $(error-if,$(success, $(LD) -v | grep -q gold), gold linker '$(LD)' not supporte · 43 unmodified lines | ||
| 44 | 44 | |
| 45 | 45 | # gcc version including patch level |
| 46 | 46 | gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) |
| 47 | + | |
| 48 | +# machine bit flags | |
| 49 | +# $(m32-flag): -m32 if the compiler supports it, or an empty string otherwise. | |
| 50 | +# $(m64-flag): -m64 if the compiler supports it, or an empty string otherwise. | |
| 51 | +cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$(1)) | |
| 52 | +m32-flag := $(cc-option-bit,-m32) | |
| 53 | +m64-flag := $(cc-option-bit,-m64) | |
| @@ -48,6 +48,7 @@ KBUILD_CFLAGS += -Wno-initializer-overrides · 47 unmodified lines | ||
| 48 | 48 | KBUILD_CFLAGS += -Wno-format |
| 49 | 49 | KBUILD_CFLAGS += -Wno-sign-compare |
| 50 | 50 | KBUILD_CFLAGS += -Wno-format-zero-length |
| 51 | +KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) | |
| 51 | 52 | endif |
| 52 | 53 | |
| 53 | 54 | endif |
| @@ -94,7 +94,7 @@ if (defined $opt{'o'}) { · 93 unmodified lines | ||
| 94 | 94 | # |
| 95 | 95 | while ( <$module_symvers> ) { |
| 96 | 96 | chomp; |
| 97 | − my (undef, $symbol, $namespace, $module, $gpl) = split('\t'); | |
| 97 | + my (undef, $symbol, $module, $gpl, $namespace) = split('\t'); | |
| 98 | 98 | $SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; |
| 99 | 99 | } |
| 100 | 100 | close($module_symvers); |
| @@ -195,13 +195,13 @@ static struct sym_entry *read_symbol(FILE *in) · 194 unmodified lines | ||
| 195 | 195 | return NULL; |
| 196 | 196 | } |
| 197 | 197 | |
| 198 | − if (is_ignored_symbol(name, type)) | |
| 199 | − return NULL; | |
| 200 | − | |
| 201 | − /* Ignore most absolute/undefined (?) symbols. */ | |
| 202 | 198 | if (strcmp(name, "_text") == 0) |
| 203 | 199 | _text = addr; |
| 204 | 200 | |
| 201 | + /* Ignore most absolute/undefined (?) symbols. */ | |
| 202 | + if (is_ignored_symbol(name, type)) | |
| 203 | + return NULL; | |
| 204 | + | |
| 205 | 205 | check_symbol_range(name, addr, text_ranges, ARRAY_SIZE(text_ranges)); |
| 206 | 206 | check_symbol_range(name, addr, &percpu_range, 1); |
| 207 | 207 | |
| @@ -308,7 +308,8 @@ static const char *sec_name(struct elf_info *elf, int secindex) · 307 unmodified lines | ||
| 308 | 308 | |
| 309 | 309 | static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym) |
| 310 | 310 | { |
| 311 | − Elf_Shdr *sechdr = &info->sechdrs[sym->st_shndx]; | |
| 311 | + unsigned int secindex = get_secindex(info, sym); | |
| 312 | + Elf_Shdr *sechdr = &info->sechdrs[secindex]; | |
| 312 | 313 | unsigned long offset; |
| 313 | 314 | |
| 314 | 315 | offset = sym->st_value; |
| @@ -2427,7 +2428,7 @@ static void write_if_changed(struct buffer *b, const char *fname) · 2112 unmodified lines | ||
| 2427 | 2428 | } |
| 2428 | 2429 | |
| 2429 | 2430 | /* parse Module.symvers file. line format: |
| 2430 | − * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something] | |
| 2431 | + * 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace | |
| 2431 | 2432 | **/ |
| 2432 | 2433 | static void read_dump(const char *fname, unsigned int kernel) |
| 2433 | 2434 | { |
| @@ -2440,7 +2441,7 @@ static void read_dump(const char *fname, unsigned int kernel) · 6 unmodified lines | ||
| 2440 | 2441 | return; |
| 2441 | 2442 | |
| 2442 | 2443 | while ((line = get_next_line(&pos, file, size))) { |
| 2443 | − char *symname, *namespace, *modname, *d, *export, *end; | |
| 2444 | + char *symname, *namespace, *modname, *d, *export; | |
| 2444 | 2445 | unsigned int crc; |
| 2445 | 2446 | struct module *mod; |
| 2446 | 2447 | struct symbol *s; |
| @@ -2448,16 +2449,16 @@ static void read_dump(const char *fname, unsigned int kernel) · 1 unmodified line | ||
| 2448 | 2449 | if (!(symname = strchr(line, '\t'))) |
| 2449 | 2450 | goto fail; |
| 2450 | 2451 | *symname++ = '\0'; |
| 2451 | − if (!(namespace = strchr(symname, '\t'))) | |
| 2452 | − goto fail; | |
| 2453 | − *namespace++ = '\0'; | |
| 2454 | − if (!(modname = strchr(namespace, '\t'))) | |
| 2452 | + if (!(modname = strchr(symname, '\t'))) | |
| 2455 | 2453 | goto fail; |
| 2456 | 2454 | *modname++ = '\0'; |
| 2457 | − if ((export = strchr(modname, '\t')) != NULL) | |
| 2458 | − *export++ = '\0'; | |
| 2459 | − if (export && ((end = strchr(export, '\t')) != NULL)) | |
| 2460 | − *end = '\0'; | |
| 2455 | + if (!(export = strchr(modname, '\t'))) | |
| 2456 | + goto fail; | |
| 2457 | + *export++ = '\0'; | |
| 2458 | + if (!(namespace = strchr(export, '\t'))) | |
| 2459 | + goto fail; | |
| 2460 | + *namespace++ = '\0'; | |
| 2461 | + | |
| 2461 | 2462 | crc = strtoul(line, &d, 16); |
| 2462 | 2463 | if (*symname == '\0' || *modname == '\0' || *d != '\0') |
| 2463 | 2464 | goto fail; |
| @@ -2508,9 +2509,9 @@ static void write_dump(const char *fname) · 44 unmodified lines | ||
| 2508 | 2509 | namespace = symbol->namespace; |
| 2509 | 2510 | buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n", |
| 2510 | 2511 | symbol->crc, symbol->name, |
| 2511 | − namespace ? namespace : "", | |
| 2512 | 2512 | symbol->module->name, |
| 2513 | − export_str(symbol->export)); | |
| 2513 | + export_str(symbol->export), | |
| 2514 | + namespace ? namespace : ""); | |
| 2514 | 2515 | } |
| 2515 | 2516 | symbol = symbol->next; |
| 2516 | 2517 | } |
| @@ -111,7 +111,7 @@ int snd_pcm_plug_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t frames) · 110 unmodified lines | ||
| 111 | 111 | while (plugin->next) { |
| 112 | 112 | if (plugin->dst_frames) |
| 113 | 113 | frames = plugin->dst_frames(plugin, frames); |
| 114 | − if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) | |
| 114 | + if ((snd_pcm_sframes_t)frames <= 0) | |
| 115 | 115 | return -ENXIO; |
| 116 | 116 | plugin = plugin->next; |
| 117 | 117 | err = snd_pcm_plugin_alloc(plugin, frames); |
| @@ -123,7 +123,7 @@ int snd_pcm_plug_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t frames) · 5 unmodified lines | ||
| 123 | 123 | while (plugin->prev) { |
| 124 | 124 | if (plugin->src_frames) |
| 125 | 125 | frames = plugin->src_frames(plugin, frames); |
| 126 | − if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) | |
| 126 | + if ((snd_pcm_sframes_t)frames <= 0) | |
| 127 | 127 | return -ENXIO; |
| 128 | 128 | plugin = plugin->prev; |
| 129 | 129 | err = snd_pcm_plugin_alloc(plugin, frames); |
| @@ -209,6 +209,8 @@ snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, snd_p · 79 unmodified lines | ||
| 209 | 209 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 210 | 210 | plugin = snd_pcm_plug_last(plug); |
| 211 | 211 | while (plugin && drv_frames > 0) { |
| 212 | + if (drv_frames > plugin->buf_frames) | |
| 213 | + drv_frames = plugin->buf_frames; | |
| 212 | 214 | plugin_prev = plugin->prev; |
| 213 | 215 | if (plugin->src_frames) |
| 214 | 216 | drv_frames = plugin->src_frames(plugin, drv_frames); |
| @@ -220,6 +222,8 @@ snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, snd_p · 5 unmodified lines | ||
| 220 | 222 | plugin_next = plugin->next; |
| 221 | 223 | if (plugin->dst_frames) |
| 222 | 224 | drv_frames = plugin->dst_frames(plugin, drv_frames); |
| 225 | + if (drv_frames > plugin->buf_frames) | |
| 226 | + drv_frames = plugin->buf_frames; | |
| 223 | 227 | plugin = plugin_next; |
| 224 | 228 | } |
| 225 | 229 | } else |
| @@ -248,11 +252,15 @@ snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pc · 22 unmodified lines | ||
| 248 | 252 | if (frames < 0) |
| 249 | 253 | return frames; |
| 250 | 254 | } |
| 255 | + if (frames > plugin->buf_frames) | |
| 256 | + frames = plugin->buf_frames; | |
| 251 | 257 | plugin = plugin_next; |
| 252 | 258 | } |
| 253 | 259 | } else if (stream == SNDRV_PCM_STREAM_CAPTURE) { |
| 254 | 260 | plugin = snd_pcm_plug_last(plug); |
| 255 | 261 | while (plugin) { |
| 262 | + if (frames > plugin->buf_frames) | |
| 263 | + frames = plugin->buf_frames; | |
| 256 | 264 | plugin_prev = plugin->prev; |
| 257 | 265 | if (plugin->src_frames) { |
| 258 | 266 | frames = plugin->src_frames(plugin, frames); |
| @@ -602,6 +602,7 @@ send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq · 601 unmodified lines | ||
| 602 | 602 | len = snd_seq_oss_timer_start(dp->timer); |
| 603 | 603 | if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { |
| 604 | 604 | snd_seq_oss_readq_sysex(dp->readq, mdev->seq_device, ev); |
| 605 | + snd_midi_event_reset_decode(mdev->coder); | |
| 605 | 606 | } else { |
| 606 | 607 | len = snd_midi_event_decode(mdev->coder, msg, sizeof(msg), ev); |
| 607 | 608 | if (len > 0) |
| @@ -81,6 +81,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, · 80 unmodified lines | ||
| 81 | 81 | if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) |
| 82 | 82 | continue; |
| 83 | 83 | snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); |
| 84 | + snd_midi_event_reset_decode(vmidi->parser); | |
| 84 | 85 | } else { |
| 85 | 86 | len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); |
| 86 | 87 | if (len > 0) |
| @@ -8051,6 +8051,8 @@ static int patch_alc269(struct hda_codec *codec) · 8050 unmodified lines | ||
| 8051 | 8051 | spec->gen.mixer_nid = 0; |
| 8052 | 8052 | break; |
| 8053 | 8053 | case 0x10ec0225: |
| 8054 | + codec->power_save_node = 1; | |
| 8055 | + /* fall through */ | |
| 8054 | 8056 | case 0x10ec0295: |
| 8055 | 8057 | case 0x10ec0299: |
| 8056 | 8058 | spec->codec_variant = ALC269_TYPE_ALC225; |
| @@ -8610,6 +8612,8 @@ enum { · 553 unmodified lines | ||
| 8610 | 8612 | ALC669_FIXUP_ACER_ASPIRE_ETHOS, |
| 8611 | 8613 | ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET, |
| 8612 | 8614 | ALC671_FIXUP_HP_HEADSET_MIC2, |
| 8615 | + ALC662_FIXUP_ACER_X2660G_HEADSET_MODE, | |
| 8616 | + ALC662_FIXUP_ACER_NITRO_HEADSET_MODE, | |
| 8613 | 8617 | }; |
| 8614 | 8618 | |
| 8615 | 8619 | static const struct hda_fixup alc662_fixups[] = { |
| @@ -8955,6 +8959,25 @@ static const struct hda_fixup alc662_fixups[] = { · 339 unmodified lines | ||
| 8955 | 8959 | .type = HDA_FIXUP_FUNC, |
| 8956 | 8960 | .v.func = alc671_fixup_hp_headset_mic2, |
| 8957 | 8961 | }, |
| 8962 | + [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = { | |
| 8963 | + .type = HDA_FIXUP_PINS, | |
| 8964 | + .v.pins = (const struct hda_pintbl[]) { | |
| 8965 | + { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */ | |
| 8966 | + { } | |
| 8967 | + }, | |
| 8968 | + .chained = true, | |
| 8969 | + .chain_id = ALC662_FIXUP_USI_FUNC | |
| 8970 | + }, | |
| 8971 | + [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = { | |
| 8972 | + .type = HDA_FIXUP_PINS, | |
| 8973 | + .v.pins = (const struct hda_pintbl[]) { | |
| 8974 | + { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */ | |
| 8975 | + { 0x1b, 0x0221144f }, | |
| 8976 | + { } | |
| 8977 | + }, | |
| 8978 | + .chained = true, | |
| 8979 | + .chain_id = ALC662_FIXUP_USI_FUNC | |
| 8980 | + }, | |
| 8958 | 8981 | }; |
| 8959 | 8982 | |
| 8960 | 8983 | static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
| @@ -8966,6 +8989,8 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { · 5 unmodified lines | ||
| 8966 | 8989 | SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC), |
| 8967 | 8990 | SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC), |
| 8968 | 8991 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), |
| 8992 | + SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE), | |
| 8993 | + SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE), | |
| 8969 | 8994 | SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 8970 | 8995 | SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 8971 | 8996 | SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13), |
| @@ -305,7 +305,7 @@ static void line6_data_received(struct urb *urb) · 304 unmodified lines | ||
| 305 | 305 | line6_midibuf_read(mb, line6->buffer_message, |
| 306 | 306 | LINE6_MIDI_MESSAGE_MAXLEN); |
| 307 | 307 | |
| 308 | − if (done == 0) | |
| 308 | + if (done <= 0) | |
| 309 | 309 | break; |
| 310 | 310 | |
| 311 | 311 | line6->message_length = done; |
| @@ -159,7 +159,7 @@ int line6_midibuf_read(struct midi_buffer *this, unsigned char *data, · 158 unmodified lines | ||
| 159 | 159 | int midi_length_prev = |
| 160 | 160 | midibuf_message_length(this->command_prev); |
| 161 | 161 | |
| 162 | − if (midi_length_prev > 0) { | |
| 162 | + if (midi_length_prev > 1) { | |
| 163 | 163 | midi_length = midi_length_prev - 1; |
| 164 | 164 | repeat = 1; |
| 165 | 165 | } else |
| @@ -1,18 +1,18 @@ | ||
| 1 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | 2 | #if defined(__i386__) || defined(__x86_64__) |
| 3 | −#include "../../arch/x86/include/uapi/asm/errno.h" | |
| 3 | +#include "../../../arch/x86/include/uapi/asm/errno.h" | |
| 4 | 4 | #elif defined(__powerpc__) |
| 5 | −#include "../../arch/powerpc/include/uapi/asm/errno.h" | |
| 5 | +#include "../../../arch/powerpc/include/uapi/asm/errno.h" | |
| 6 | 6 | #elif defined(__sparc__) |
| 7 | −#include "../../arch/sparc/include/uapi/asm/errno.h" | |
| 7 | +#include "../../../arch/sparc/include/uapi/asm/errno.h" | |
| 8 | 8 | #elif defined(__alpha__) |
| 9 | −#include "../../arch/alpha/include/uapi/asm/errno.h" | |
| 9 | +#include "../../../arch/alpha/include/uapi/asm/errno.h" | |
| 10 | 10 | #elif defined(__mips__) |
| 11 | −#include "../../arch/mips/include/uapi/asm/errno.h" | |
| 11 | +#include "../../../arch/mips/include/uapi/asm/errno.h" | |
| 12 | 12 | #elif defined(__ia64__) |
| 13 | −#include "../../arch/ia64/include/uapi/asm/errno.h" | |
| 13 | +#include "../../../arch/ia64/include/uapi/asm/errno.h" | |
| 14 | 14 | #elif defined(__xtensa__) |
| 15 | −#include "../../arch/xtensa/include/uapi/asm/errno.h" | |
| 15 | +#include "../../../arch/xtensa/include/uapi/asm/errno.h" | |
| 16 | 16 | #else |
| 17 | 17 | #include <asm-generic/errno.h> |
| 18 | 18 | #endif |
| @@ -11,17 +11,17 @@ · 10 unmodified lines | ||
| 11 | 11 | #include <linux/zalloc.h> |
| 12 | 12 | #include <time.h> |
| 13 | 13 | |
| 14 | −#include "../../util/cpumap.h" | |
| 15 | −#include "../../util/event.h" | |
| 16 | −#include "../../util/evsel.h" | |
| 17 | −#include "../../util/evlist.h" | |
| 18 | −#include "../../util/session.h" | |
| 14 | +#include "../../../util/cpumap.h" | |
| 15 | +#include "../../../util/event.h" | |
| 16 | +#include "../../../util/evsel.h" | |
| 17 | +#include "../../../util/evlist.h" | |
| 18 | +#include "../../../util/session.h" | |
| 19 | 19 | #include <internal/lib.h> // page_size |
| 20 | −#include "../../util/pmu.h" | |
| 21 | −#include "../../util/debug.h" | |
| 22 | −#include "../../util/auxtrace.h" | |
| 23 | −#include "../../util/record.h" | |
| 24 | −#include "../../util/arm-spe.h" | |
| 20 | +#include "../../../util/pmu.h" | |
| 21 | +#include "../../../util/debug.h" | |
| 22 | +#include "../../../util/auxtrace.h" | |
| 23 | +#include "../../../util/record.h" | |
| 24 | +#include "../../../util/arm-spe.h" | |
| 25 | 25 | |
| 26 | 26 | #define KiB(x) ((x) * 1024) |
| 27 | 27 | #define MiB(x) ((x) * 1024 * 1024) |
| @@ -1,5 +1,5 @@ | ||
| 1 | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | −#include "../../util/perf_regs.h" | |
| 2 | +#include "../../../util/perf_regs.h" | |
| 3 | 3 | |
| 4 | 4 | const struct sample_reg sample_reg_masks[] = { |
| 5 | 5 | SMPL_REG_END |
| @@ -4,8 +4,8 @@ · 3 unmodified lines | ||
| 4 | 4 | #include <regex.h> |
| 5 | 5 | #include <linux/zalloc.h> |
| 6 | 6 | |
| 7 | −#include "../../util/perf_regs.h" | |
| 8 | −#include "../../util/debug.h" | |
| 7 | +#include "../../../util/perf_regs.h" | |
| 8 | +#include "../../../util/debug.h" | |
| 9 | 9 | |
| 10 | 10 | #include <linux/kernel.h> |
| 11 | 11 | |
| @@ -7,13 +7,13 @@ · 6 unmodified lines | ||
| 7 | 7 | #include <errno.h> |
| 8 | 8 | #include <stdbool.h> |
| 9 | 9 | |
| 10 | −#include "../../util/header.h" | |
| 11 | −#include "../../util/debug.h" | |
| 12 | −#include "../../util/pmu.h" | |
| 13 | −#include "../../util/auxtrace.h" | |
| 14 | −#include "../../util/intel-pt.h" | |
| 15 | −#include "../../util/intel-bts.h" | |
| 16 | −#include "../../util/evlist.h" | |
| 10 | +#include "../../../util/header.h" | |
| 11 | +#include "../../../util/debug.h" | |
| 12 | +#include "../../../util/pmu.h" | |
| 13 | +#include "../../../util/auxtrace.h" | |
| 14 | +#include "../../../util/intel-pt.h" | |
| 15 | +#include "../../../util/intel-bts.h" | |
| 16 | +#include "../../../util/evlist.h" | |
| 17 | 17 | |
| 18 | 18 | static |
| 19 | 19 | struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, |
| @@ -3,12 +3,12 @@ · 2 unmodified lines | ||
| 3 | 3 | #include <linux/string.h> |
| 4 | 4 | #include <linux/zalloc.h> |
| 5 | 5 | |
| 6 | −#include "../../util/event.h" | |
| 7 | −#include "../../util/synthetic-events.h" | |
| 8 | −#include "../../util/machine.h" | |
| 9 | −#include "../../util/tool.h" | |
| 10 | −#include "../../util/map.h" | |
| 11 | −#include "../../util/debug.h" | |
| 6 | +#include "../../../util/event.h" | |
| 7 | +#include "../../../util/synthetic-events.h" | |
| 8 | +#include "../../../util/machine.h" | |
| 9 | +#include "../../../util/tool.h" | |
| 10 | +#include "../../../util/map.h" | |
| 11 | +#include "../../../util/debug.h" | |
| 12 | 12 | |
| 13 | 13 | #if defined(__x86_64__) |
| 14 | 14 | |
| @@ -7,8 +7,8 @@ · 6 unmodified lines | ||
| 7 | 7 | #include <string.h> |
| 8 | 8 | #include <regex.h> |
| 9 | 9 | |
| 10 | −#include "../../util/debug.h" | |
| 11 | −#include "../../util/header.h" | |
| 10 | +#include "../../../util/debug.h" | |
| 11 | +#include "../../../util/header.h" | |
| 12 | 12 | |
| 13 | 13 | static inline void |
| 14 | 14 | cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c, |
| @@ -11,18 +11,18 @@ · 10 unmodified lines | ||
| 11 | 11 | #include <linux/log2.h> |
| 12 | 12 | #include <linux/zalloc.h> |
| 13 | 13 | |
| 14 | −#include "../../util/cpumap.h" | |
| 15 | −#include "../../util/event.h" | |
| 16 | −#include "../../util/evsel.h" | |
| 17 | −#include "../../util/evlist.h" | |
| 18 | −#include "../../util/mmap.h" | |
| 19 | −#include "../../util/session.h" | |
| 20 | −#include "../../util/pmu.h" | |
| 21 | −#include "../../util/debug.h" | |
| 22 | −#include "../../util/record.h" | |
| 23 | −#include "../../util/tsc.h" | |
| 24 | −#include "../../util/auxtrace.h" | |
| 25 | −#include "../../util/intel-bts.h" | |
| 14 | +#include "../../../util/cpumap.h" | |
| 15 | +#include "../../../util/event.h" | |
| 16 | +#include "../../../util/evsel.h" | |
| 17 | +#include "../../../util/evlist.h" | |
| 18 | +#include "../../../util/mmap.h" | |
| 19 | +#include "../../../util/session.h" | |
| 20 | +#include "../../../util/pmu.h" | |
| 21 | +#include "../../../util/debug.h" | |
| 22 | +#include "../../../util/record.h" | |
| 23 | +#include "../../../util/tsc.h" | |
| 24 | +#include "../../../util/auxtrace.h" | |
| 25 | +#include "../../../util/intel-bts.h" | |
| 26 | 26 | #include <internal/lib.h> // page_size |
| 27 | 27 | |
| 28 | 28 | #define KiB(x) ((x) * 1024) |
| @@ -13,23 +13,23 @@ · 12 unmodified lines | ||
| 13 | 13 | #include <linux/zalloc.h> |
| 14 | 14 | #include <cpuid.h> |
| 15 | 15 | |
| 16 | −#include "../../util/session.h" | |
| 17 | −#include "../../util/event.h" | |
| 18 | −#include "../../util/evlist.h" | |
| 19 | −#include "../../util/evsel.h" | |
| 20 | −#include "../../util/evsel_config.h" | |
| 21 | −#include "../../util/cpumap.h" | |
| 22 | −#include "../../util/mmap.h" | |
| 16 | +#include "../../../util/session.h" | |
| 17 | +#include "../../../util/event.h" | |
| 18 | +#include "../../../util/evlist.h" | |
| 19 | +#include "../../../util/evsel.h" | |
| 20 | +#include "../../../util/evsel_config.h" | |
| 21 | +#include "../../../util/cpumap.h" | |
| 22 | +#include "../../../util/mmap.h" | |
| 23 | 23 | #include <subcmd/parse-options.h> |
| 24 | −#include "../../util/parse-events.h" | |
| 25 | −#include "../../util/pmu.h" | |
| 26 | −#include "../../util/debug.h" | |
| 27 | −#include "../../util/auxtrace.h" | |
| 28 | −#include "../../util/record.h" | |
| 29 | −#include "../../util/target.h" | |
| 30 | −#include "../../util/tsc.h" | |
| 24 | +#include "../../../util/parse-events.h" | |
| 25 | +#include "../../../util/pmu.h" | |
| 26 | +#include "../../../util/debug.h" | |
| 27 | +#include "../../../util/auxtrace.h" | |
| 28 | +#include "../../../util/record.h" | |
| 29 | +#include "../../../util/target.h" | |
| 30 | +#include "../../../util/tsc.h" | |
| 31 | 31 | #include <internal/lib.h> // page_size |
| 32 | −#include "../../util/intel-pt.h" | |
| 32 | +#include "../../../util/intel-pt.h" | |
| 33 | 33 | |
| 34 | 34 | #define KiB(x) ((x) * 1024) |
| 35 | 35 | #define MiB(x) ((x) * 1024 * 1024) |
| @@ -5,9 +5,9 @@ · 4 unmodified lines | ||
| 5 | 5 | #include <stdlib.h> |
| 6 | 6 | |
| 7 | 7 | #include <internal/lib.h> // page_size |
| 8 | −#include "../../util/machine.h" | |
| 9 | −#include "../../util/map.h" | |
| 10 | −#include "../../util/symbol.h" | |
| 8 | +#include "../../../util/machine.h" | |
| 9 | +#include "../../../util/map.h" | |
| 10 | +#include "../../../util/symbol.h" | |
| 11 | 11 | #include <linux/ctype.h> |
| 12 | 12 | |
| 13 | 13 | #include <symbol/kallsyms.h> |
| @@ -5,10 +5,10 @@ · 4 unmodified lines | ||
| 5 | 5 | #include <linux/kernel.h> |
| 6 | 6 | #include <linux/zalloc.h> |
| 7 | 7 | |
| 8 | −#include "../../perf-sys.h" | |
| 9 | −#include "../../util/perf_regs.h" | |
| 10 | −#include "../../util/debug.h" | |
| 11 | −#include "../../util/event.h" | |
| 8 | +#include "../../../perf-sys.h" | |
| 9 | +#include "../../../util/perf_regs.h" | |
| 10 | +#include "../../../util/debug.h" | |
| 11 | +#include "../../../util/event.h" | |
| 12 | 12 | |
| 13 | 13 | const struct sample_reg sample_reg_masks[] = { |
| 14 | 14 | SMPL_REG(AX, PERF_REG_X86_AX), |
| @@ -4,9 +4,9 @@ · 3 unmodified lines | ||
| 4 | 4 | #include <linux/stddef.h> |
| 5 | 5 | #include <linux/perf_event.h> |
| 6 | 6 | |
| 7 | −#include "../../util/intel-pt.h" | |
| 8 | −#include "../../util/intel-bts.h" | |
| 9 | −#include "../../util/pmu.h" | |
| 7 | +#include "../../../util/intel-pt.h" | |
| 8 | +#include "../../../util/intel-bts.h" | |
| 9 | +#include "../../../util/pmu.h" | |
| 10 | 10 | |
| 11 | 11 | struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused) |
| 12 | 12 | { |
| @@ -2,6 +2,10 @@ · 1 unmodified line | ||
| 2 | 2 | #ifndef BENCH_H |
| 3 | 3 | #define BENCH_H |
| 4 | 4 | |
| 5 | +#include <sys/time.h> | |
| 6 | + | |
| 7 | +extern struct timeval bench__start, bench__end, bench__runtime; | |
| 8 | + | |
| 5 | 9 | /* |
| 6 | 10 | * The madvise transparent hugepage constants were added in glibc |
| 7 | 11 | * 2.13. For compatibility with older versions of glibc, define these |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | ||
| 35 | 35 | |
| 36 | 36 | static unsigned int nthreads = 0; |
| 37 | 37 | static unsigned int nsecs = 8; |
| 38 | −struct timeval start, end, runtime; | |
| 39 | 38 | static bool done, __verbose, randomize; |
| 40 | 39 | |
| 41 | 40 | /* |
| @@ -94,8 +93,8 @@ static void toggle_done(int sig __maybe_unused, · 52 unmodified lines | ||
| 94 | 93 | { |
| 95 | 94 | /* inform all threads that we're done for the day */ |
| 96 | 95 | done = true; |
| 97 | − gettimeofday(&end, NULL); | |
| 98 | − timersub(&end, &start, &runtime); | |
| 96 | + gettimeofday(&bench__end, NULL); | |
| 97 | + timersub(&bench__end, &bench__start, &bench__runtime); | |
| 99 | 98 | } |
| 100 | 99 | |
| 101 | 100 | static void nest_epollfd(void) |
| @@ -313,6 +312,7 @@ int bench_epoll_ctl(int argc, const char **argv) · 211 unmodified lines | ||
| 313 | 312 | exit(EXIT_FAILURE); |
| 314 | 313 | } |
| 315 | 314 | |
| 315 | + memset(&act, 0, sizeof(act)); | |
| 316 | 316 | sigfillset(&act.sa_mask); |
| 317 | 317 | act.sa_sigaction = toggle_done; |
| 318 | 318 | sigaction(SIGINT, &act, NULL); |
| @@ -361,7 +361,7 @@ int bench_epoll_ctl(int argc, const char **argv) · 42 unmodified lines | ||
| 361 | 361 | |
| 362 | 362 | threads_starting = nthreads; |
| 363 | 363 | |
| 364 | − gettimeofday(&start, NULL); | |
| 364 | + gettimeofday(&bench__start, NULL); | |
| 365 | 365 | |
| 366 | 366 | do_threads(worker, cpu); |
| 367 | 367 | |
| @@ -90,7 +90,6 @@ · 89 unmodified lines | ||
| 90 | 90 | |
| 91 | 91 | static unsigned int nthreads = 0; |
| 92 | 92 | static unsigned int nsecs = 8; |
| 93 | −struct timeval start, end, runtime; | |
| 94 | 93 | static bool wdone, done, __verbose, randomize, nonblocking; |
| 95 | 94 | |
| 96 | 95 | /* |
| @@ -276,8 +275,8 @@ static void toggle_done(int sig __maybe_unused, · 179 unmodified lines | ||
| 276 | 275 | { |
| 277 | 276 | /* inform all threads that we're done for the day */ |
| 278 | 277 | done = true; |
| 279 | − gettimeofday(&end, NULL); | |
| 280 | − timersub(&end, &start, &runtime); | |
| 278 | + gettimeofday(&bench__end, NULL); | |
| 279 | + timersub(&bench__end, &bench__start, &bench__runtime); | |
| 281 | 280 | } |
| 282 | 281 | |
| 283 | 282 | static void print_summary(void) |
| @@ -287,7 +286,7 @@ static void print_summary(void) · 3 unmodified lines | ||
| 287 | 286 | |
| 288 | 287 | printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 289 | 288 | avg, rel_stddev_stats(stddev, avg), |
| 290 | − (int) runtime.tv_sec); | |
| 289 | + (int)bench__runtime.tv_sec); | |
| 291 | 290 | } |
| 292 | 291 | |
| 293 | 292 | static int do_threads(struct worker *worker, struct perf_cpu_map *cpu) |
| @@ -427,6 +426,7 @@ int bench_epoll_wait(int argc, const char **argv) · 133 unmodified lines | ||
| 427 | 426 | exit(EXIT_FAILURE); |
| 428 | 427 | } |
| 429 | 428 | |
| 429 | + memset(&act, 0, sizeof(act)); | |
| 430 | 430 | sigfillset(&act.sa_mask); |
| 431 | 431 | act.sa_sigaction = toggle_done; |
| 432 | 432 | sigaction(SIGINT, &act, NULL); |
| @@ -479,7 +479,7 @@ int bench_epoll_wait(int argc, const char **argv) · 46 unmodified lines | ||
| 479 | 479 | |
| 480 | 480 | threads_starting = nthreads; |
| 481 | 481 | |
| 482 | − gettimeofday(&start, NULL); | |
| 482 | + gettimeofday(&bench__start, NULL); | |
| 483 | 483 | |
| 484 | 484 | do_threads(worker, cpu); |
| 485 | 485 | |
| @@ -519,7 +519,7 @@ int bench_epoll_wait(int argc, const char **argv) · 33 unmodified lines | ||
| 519 | 519 | qsort(worker, nthreads, sizeof(struct worker), cmpworker); |
| 520 | 520 | |
| 521 | 521 | for (i = 0; i < nthreads; i++) { |
| 522 | − unsigned long t = worker[i].ops/runtime.tv_sec; | |
| 522 | + unsigned long t = worker[i].ops / bench__runtime.tv_sec; | |
| 523 | 523 | |
| 524 | 524 | update_stats(&throughput_stats, t); |
| 525 | 525 | |
| @@ -37,7 +37,7 @@ static unsigned int nfutexes = 1024; · 36 unmodified lines | ||
| 37 | 37 | static bool fshared = false, done = false, silent = false; |
| 38 | 38 | static int futex_flag = 0; |
| 39 | 39 | |
| 40 | −struct timeval start, end, runtime; | |
| 40 | +struct timeval bench__start, bench__end, bench__runtime; | |
| 41 | 41 | static pthread_mutex_t thread_lock; |
| 42 | 42 | static unsigned int threads_starting; |
| 43 | 43 | static struct stats throughput_stats; |
| @@ -103,8 +103,8 @@ static void toggle_done(int sig __maybe_unused, · 59 unmodified lines | ||
| 103 | 103 | { |
| 104 | 104 | /* inform all threads that we're done for the day */ |
| 105 | 105 | done = true; |
| 106 | − gettimeofday(&end, NULL); | |
| 107 | − timersub(&end, &start, &runtime); | |
| 106 | + gettimeofday(&bench__end, NULL); | |
| 107 | + timersub(&bench__end, &bench__start, &bench__runtime); | |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | 110 | static void print_summary(void) |
| @@ -114,7 +114,7 @@ static void print_summary(void) · 3 unmodified lines | ||
| 114 | 114 | |
| 115 | 115 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 116 | 116 | !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), |
| 117 | − (int) runtime.tv_sec); | |
| 117 | + (int)bench__runtime.tv_sec); | |
| 118 | 118 | } |
| 119 | 119 | |
| 120 | 120 | int bench_futex_hash(int argc, const char **argv) |
| @@ -137,6 +137,7 @@ int bench_futex_hash(int argc, const char **argv) · 16 unmodified lines | ||
| 137 | 137 | if (!cpu) |
| 138 | 138 | goto errmem; |
| 139 | 139 | |
| 140 | + memset(&act, 0, sizeof(act)); | |
| 140 | 141 | sigfillset(&act.sa_mask); |
| 141 | 142 | act.sa_sigaction = toggle_done; |
| 142 | 143 | sigaction(SIGINT, &act, NULL); |
| @@ -161,7 +162,7 @@ int bench_futex_hash(int argc, const char **argv) · 18 unmodified lines | ||
| 161 | 162 | |
| 162 | 163 | threads_starting = nthreads; |
| 163 | 164 | pthread_attr_init(&thread_attr); |
| 164 | − gettimeofday(&start, NULL); | |
| 165 | + gettimeofday(&bench__start, NULL); | |
| 165 | 166 | for (i = 0; i < nthreads; i++) { |
| 166 | 167 | worker[i].tid = i; |
| 167 | 168 | worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); |
| @@ -204,7 +205,7 @@ int bench_futex_hash(int argc, const char **argv) · 36 unmodified lines | ||
| 204 | 205 | pthread_mutex_destroy(&thread_lock); |
| 205 | 206 | |
| 206 | 207 | for (i = 0; i < nthreads; i++) { |
| 207 | − unsigned long t = worker[i].ops/runtime.tv_sec; | |
| 208 | + unsigned long t = worker[i].ops / bench__runtime.tv_sec; | |
| 208 | 209 | update_stats(&throughput_stats, t); |
| 209 | 210 | if (!silent) { |
| 210 | 211 | if (nfutexes == 1) |
| @@ -37,7 +37,6 @@ static bool silent = false, multi = false; · 36 unmodified lines | ||
| 37 | 37 | static bool done = false, fshared = false; |
| 38 | 38 | static unsigned int nthreads = 0; |
| 39 | 39 | static int futex_flag = 0; |
| 40 | −struct timeval start, end, runtime; | |
| 41 | 40 | static pthread_mutex_t thread_lock; |
| 42 | 41 | static unsigned int threads_starting; |
| 43 | 42 | static struct stats throughput_stats; |
| @@ -64,7 +63,7 @@ static void print_summary(void) · 20 unmodified lines | ||
| 64 | 63 | |
| 65 | 64 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 66 | 65 | !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), |
| 67 | − (int) runtime.tv_sec); | |
| 66 | + (int)bench__runtime.tv_sec); | |
| 68 | 67 | } |
| 69 | 68 | |
| 70 | 69 | static void toggle_done(int sig __maybe_unused, |
| @@ -73,8 +72,8 @@ static void toggle_done(int sig __maybe_unused, · 2 unmodified lines | ||
| 73 | 72 | { |
| 74 | 73 | /* inform all threads that we're done for the day */ |
| 75 | 74 | done = true; |
| 76 | − gettimeofday(&end, NULL); | |
| 77 | − timersub(&end, &start, &runtime); | |
| 75 | + gettimeofday(&bench__end, NULL); | |
| 76 | + timersub(&bench__end, &bench__start, &bench__runtime); | |
| 78 | 77 | } |
| 79 | 78 | |
| 80 | 79 | static void *workerfn(void *arg) |
| @@ -161,6 +160,7 @@ int bench_futex_lock_pi(int argc, const char **argv) · 80 unmodified lines | ||
| 161 | 160 | if (!cpu) |
| 162 | 161 | err(EXIT_FAILURE, "calloc"); |
| 163 | 162 | |
| 163 | + memset(&act, 0, sizeof(act)); | |
| 164 | 164 | sigfillset(&act.sa_mask); |
| 165 | 165 | act.sa_sigaction = toggle_done; |
| 166 | 166 | sigaction(SIGINT, &act, NULL); |
| @@ -185,7 +185,7 @@ int bench_futex_lock_pi(int argc, const char **argv) · 18 unmodified lines | ||
| 185 | 185 | |
| 186 | 186 | threads_starting = nthreads; |
| 187 | 187 | pthread_attr_init(&thread_attr); |
| 188 | − gettimeofday(&start, NULL); | |
| 188 | + gettimeofday(&bench__start, NULL); | |
| 189 | 189 | |
| 190 | 190 | create_threads(worker, thread_attr, cpu); |
| 191 | 191 | pthread_attr_destroy(&thread_attr); |
| @@ -211,7 +211,7 @@ int bench_futex_lock_pi(int argc, const char **argv) · 19 unmodified lines | ||
| 211 | 211 | pthread_mutex_destroy(&thread_lock); |
| 212 | 212 | |
| 213 | 213 | for (i = 0; i < nthreads; i++) { |
| 214 | − unsigned long t = worker[i].ops/runtime.tv_sec; | |
| 214 | + unsigned long t = worker[i].ops / bench__runtime.tv_sec; | |
| 215 | 215 | |
| 216 | 216 | update_stats(&throughput_stats, t); |
| 217 | 217 | if (!silent) |
| @@ -128,6 +128,7 @@ int bench_futex_requeue(int argc, const char **argv) · 127 unmodified lines | ||
| 128 | 128 | if (!cpu) |
| 129 | 129 | err(EXIT_FAILURE, "cpu_map__new"); |
| 130 | 130 | |
| 131 | + memset(&act, 0, sizeof(act)); | |
| 131 | 132 | sigfillset(&act.sa_mask); |
| 132 | 133 | act.sa_sigaction = toggle_done; |
| 133 | 134 | sigaction(SIGINT, &act, NULL); |
| @@ -234,6 +234,7 @@ int bench_futex_wake_parallel(int argc, const char **argv) · 233 unmodified lines | ||
| 234 | 234 | exit(EXIT_FAILURE); |
| 235 | 235 | } |
| 236 | 236 | |
| 237 | + memset(&act, 0, sizeof(act)); | |
| 237 | 238 | sigfillset(&act.sa_mask); |
| 238 | 239 | act.sa_sigaction = toggle_done; |
| 239 | 240 | sigaction(SIGINT, &act, NULL); |
| @@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false; · 42 unmodified lines | ||
| 43 | 43 | static pthread_mutex_t thread_lock; |
| 44 | 44 | static pthread_cond_t thread_parent, thread_worker; |
| 45 | 45 | static struct stats waketime_stats, wakeup_stats; |
| 46 | −static unsigned int ncpus, threads_starting, nthreads = 0; | |
| 46 | +static unsigned int threads_starting, nthreads = 0; | |
| 47 | 47 | static int futex_flag = 0; |
| 48 | 48 | |
| 49 | 49 | static const struct option options[] = { |
| @@ -136,12 +136,13 @@ int bench_futex_wake(int argc, const char **argv) · 86 unmodified lines | ||
| 136 | 136 | if (!cpu) |
| 137 | 137 | err(EXIT_FAILURE, "calloc"); |
| 138 | 138 | |
| 139 | + memset(&act, 0, sizeof(act)); | |
| 139 | 140 | sigfillset(&act.sa_mask); |
| 140 | 141 | act.sa_sigaction = toggle_done; |
| 141 | 142 | sigaction(SIGINT, &act, NULL); |
| 142 | 143 | |
| 143 | 144 | if (!nthreads) |
| 144 | − nthreads = ncpus; | |
| 145 | + nthreads = cpu->nr; | |
| 145 | 146 | |
| 146 | 147 | worker = calloc(nthreads, sizeof(*worker)); |
| 147 | 148 | if (!worker) |
| @@ -1312,7 +1312,8 @@ static int cycles_printf(struct hist_entry *he, struct hist_entry *pair, · 1311 unmodified lines | ||
| 1312 | 1312 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, |
| 1313 | 1313 | he->ms.sym); |
| 1314 | 1314 | |
| 1315 | − if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) { | |
| 1315 | + if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) && | |
| 1316 | + (strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) { | |
| 1316 | 1317 | scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld", |
| 1317 | 1318 | start_line, end_line, block_he->diff.cycles); |
| 1318 | 1319 | } else { |
| @@ -684,7 +684,9 @@ repeat: · 683 unmodified lines | ||
| 684 | 684 | delay_msecs = top->delay_secs * MSEC_PER_SEC; |
| 685 | 685 | set_term_quiet_input(&save); |
| 686 | 686 | /* trash return*/ |
| 687 | − getc(stdin); | |
| 687 | + clearerr(stdin); | |
| 688 | + if (poll(&stdin_poll, 1, 0) > 0) | |
| 689 | + getc(stdin); | |
| 688 | 690 | |
| 689 | 691 | while (!done) { |
| 690 | 692 | perf_top__print_sym_table(top); |
| @@ -1082,10 +1082,9 @@ static int process_one_file(const char *fpath, const struct stat *sb, · 1081 unmodified lines | ||
| 1082 | 1082 | */ |
| 1083 | 1083 | int main(int argc, char *argv[]) |
| 1084 | 1084 | { |
| 1085 | − int rc; | |
| 1085 | + int rc, ret = 0; | |
| 1086 | 1086 | int maxfds; |
| 1087 | 1087 | char ldirname[PATH_MAX]; |
| 1088 | − | |
| 1089 | 1088 | const char *arch; |
| 1090 | 1089 | const char *output_file; |
| 1091 | 1090 | const char *start_dirname; |
| @@ -1156,7 +1155,8 @@ int main(int argc, char *argv[]) · 64 unmodified lines | ||
| 1156 | 1155 | /* Make build fail */ |
| 1157 | 1156 | fclose(eventsfp); |
| 1158 | 1157 | free_arch_std_events(); |
| 1159 | − return 1; | |
| 1158 | + ret = 1; | |
| 1159 | + goto out_free_mapfile; | |
| 1160 | 1160 | } else if (rc) { |
| 1161 | 1161 | goto empty_map; |
| 1162 | 1162 | } |
| @@ -1174,14 +1174,17 @@ int main(int argc, char *argv[]) · 11 unmodified lines | ||
| 1174 | 1174 | /* Make build fail */ |
| 1175 | 1175 | fclose(eventsfp); |
| 1176 | 1176 | free_arch_std_events(); |
| 1177 | − return 1; | |
| 1177 | + ret = 1; | |
| 1178 | 1178 | } |
| 1179 | 1179 | |
| 1180 | − return 0; | |
| 1180 | + | |
| 1181 | + goto out_free_mapfile; | |
| 1181 | 1182 | |
| 1182 | 1183 | empty_map: |
| 1183 | 1184 | fclose(eventsfp); |
| 1184 | 1185 | create_empty_mapping(output_file); |
| 1185 | 1186 | free_arch_std_events(); |
| 1186 | − return 0; | |
| 1187 | +out_free_mapfile: | |
| 1188 | + free(mapfile); | |
| 1189 | + return ret; | |
| 1187 | 1190 | } |
| @@ -19,7 +19,7 @@ · 18 unmodified lines | ||
| 19 | 19 | #include "../perf-sys.h" |
| 20 | 20 | #include "cloexec.h" |
| 21 | 21 | |
| 22 | −volatile long the_var; | |
| 22 | +static volatile long the_var; | |
| 23 | 23 | |
| 24 | 24 | static noinline int test_function(void) |
| 25 | 25 | { |
| @@ -295,7 +295,8 @@ static int block_range_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, · 294 unmodified lines | ||
| 295 | 295 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, |
| 296 | 296 | he->ms.sym); |
| 297 | 297 | |
| 298 | − if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) { | |
| 298 | + if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) && | |
| 299 | + (strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) { | |
| 299 | 300 | scnprintf(buf, sizeof(buf), "[%s -> %s]", |
| 300 | 301 | start_line, end_line); |
| 301 | 302 | } else { |
| @@ -343,11 +343,11 @@ static const char *normalize_arch(char *arch) · 342 unmodified lines | ||
| 343 | 343 | |
| 344 | 344 | const char *perf_env__arch(struct perf_env *env) |
| 345 | 345 | { |
| 346 | − struct utsname uts; | |
| 347 | 346 | char *arch_name; |
| 348 | 347 | |
| 349 | 348 | if (!env || !env->arch) { /* Assume local operation */ |
| 350 | − if (uname(&uts) < 0) | |
| 349 | + static struct utsname uts = { .machine[0] = '\0', }; | |
| 350 | + if (uts.machine[0] == '\0' && uname(&uts) < 0) | |
| 351 | 351 | return NULL; |
| 352 | 352 | arch_name = uts.machine; |
| 353 | 353 | } else |
| @@ -431,7 +431,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, · 430 unmodified lines | ||
| 431 | 431 | |
| 432 | 432 | if (map && map->dso) { |
| 433 | 433 | char *srcline = map__srcline(map, addr, NULL); |
| 434 | − if (srcline != SRCLINE_UNKNOWN) | |
| 434 | + if (strncmp(srcline, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) | |
| 435 | 435 | ret = fprintf(fp, "%s%s", prefix, srcline); |
| 436 | 436 | free_srcline(srcline); |
| 437 | 437 | } |
| @@ -257,21 +257,15 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config) · 256 unmodified lines | ||
| 257 | 257 | path = zalloc(sizeof(*path)); |
| 258 | 258 | if (!path) |
| 259 | 259 | return NULL; |
| 260 | − path->system = malloc(MAX_EVENT_LENGTH); | |
| 261 | − if (!path->system) { | |
| 260 | + if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { | |
| 262 | 261 | free(path); |
| 263 | 262 | return NULL; |
| 264 | 263 | } |
| 265 | − path->name = malloc(MAX_EVENT_LENGTH); | |
| 266 | − if (!path->name) { | |
| 264 | + if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { | |
| 267 | 265 | zfree(&path->system); |
| 268 | 266 | free(path); |
| 269 | 267 | return NULL; |
| 270 | 268 | } |
| 271 | − strncpy(path->system, sys_dirent->d_name, | |
| 272 | − MAX_EVENT_LENGTH); | |
| 273 | − strncpy(path->name, evt_dirent->d_name, | |
| 274 | − MAX_EVENT_LENGTH); | |
| 275 | 269 | return path; |
| 276 | 270 | } |
| 277 | 271 | } |
| @@ -1622,7 +1622,12 @@ int dso__load(struct dso *dso, struct map *map) · 1621 unmodified lines | ||
| 1622 | 1622 | goto out; |
| 1623 | 1623 | } |
| 1624 | 1624 | |
| 1625 | − if (dso->kernel) { | |
| 1625 | + kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE || | |
| 1626 | + dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || | |
| 1627 | + dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE || | |
| 1628 | + dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; | |
| 1629 | + | |
| 1630 | + if (dso->kernel && !kmod) { | |
| 1626 | 1631 | if (dso->kernel == DSO_TYPE_KERNEL) |
| 1627 | 1632 | ret = dso__load_kernel_sym(dso, map); |
| 1628 | 1633 | else if (dso->kernel == DSO_TYPE_GUEST_KERNEL) |
| @@ -1650,12 +1655,6 @@ int dso__load(struct dso *dso, struct map *map) · 21 unmodified lines | ||
| 1650 | 1655 | if (!name) |
| 1651 | 1656 | goto out; |
| 1652 | 1657 | |
| 1653 | − kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE || | |
| 1654 | − dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || | |
| 1655 | − dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE || | |
| 1656 | − dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; | |
| 1657 | − | |
| 1658 | − | |
| 1659 | 1658 | /* |
| 1660 | 1659 | * Read the build id if possible. This is required for |
| 1661 | 1660 | * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work |
| @@ -82,7 +82,7 @@ static struct pci_access *pci_acc; · 81 unmodified lines | ||
| 82 | 82 | static struct pci_dev *amd_fam14h_pci_dev; |
| 83 | 83 | static int nbp1_entered; |
| 84 | 84 | |
| 85 | −struct timespec start_time; | |
| 85 | +static struct timespec start_time; | |
| 86 | 86 | static unsigned long long timediff; |
| 87 | 87 | |
| 88 | 88 | #ifdef DEBUG |
| @@ -19,7 +19,7 @@ struct cpuidle_monitor cpuidle_sysfs_monitor; · 18 unmodified lines | ||
| 19 | 19 | |
| 20 | 20 | static unsigned long long **previous_count; |
| 21 | 21 | static unsigned long long **current_count; |
| 22 | −struct timespec start_time; | |
| 22 | +static struct timespec start_time; | |
| 23 | 23 | static unsigned long long timediff; |
| 24 | 24 | |
| 25 | 25 | static int cpuidle_get_count_percent(unsigned int id, double *percent, |
| @@ -27,6 +27,8 @@ struct cpuidle_monitor *all_monitors[] = { · 26 unmodified lines | ||
| 27 | 27 | 0 |
| 28 | 28 | }; |
| 29 | 29 | |
| 30 | +int cpu_count; | |
| 31 | + | |
| 30 | 32 | static struct cpuidle_monitor *monitors[MONITORS_MAX]; |
| 31 | 33 | static unsigned int avail_monitors; |
| 32 | 34 | |
| @@ -25,7 +25,7 @@ · 24 unmodified lines | ||
| 25 | 25 | #endif |
| 26 | 26 | #define CSTATE_DESC_LEN 60 |
| 27 | 27 | |
| 28 | −int cpu_count; | |
| 28 | +extern int cpu_count; | |
| 29 | 29 | |
| 30 | 30 | /* Hard to define the right names ...: */ |
| 31 | 31 | enum power_range_e { |
| @@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2 · 15 unmodified lines | ||
| 16 | 16 | |
| 17 | 17 | %: %.c |
| 18 | 18 | @mkdir -p $(BUILD_OUTPUT) |
| 19 | − $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) | |
| 19 | + $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap | |
| 20 | 20 | |
| 21 | 21 | .PHONY : clean |
| 22 | 22 | clean : |
| @@ -30,7 +30,7 @@ · 29 unmodified lines | ||
| 30 | 30 | #include <sched.h> |
| 31 | 31 | #include <time.h> |
| 32 | 32 | #include <cpuid.h> |
| 33 | −#include <linux/capability.h> | |
| 33 | +#include <sys/capability.h> | |
| 34 | 34 | #include <errno.h> |
| 35 | 35 | #include <math.h> |
| 36 | 36 | |
| @@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */ · 267 unmodified lines | ||
| 304 | 304 | |
| 305 | 305 | void setup_all_buffers(void); |
| 306 | 306 | |
| 307 | +char *sys_lpi_file; | |
| 308 | +char *sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us"; | |
| 309 | +char *sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec"; | |
| 310 | + | |
| 307 | 311 | int cpu_is_not_present(int cpu) |
| 308 | 312 | { |
| 309 | 313 | return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set); |
| @@ -2916,8 +2920,6 @@ int snapshot_gfx_mhz(void) · 2606 unmodified lines | ||
| 2916 | 2920 | * |
| 2917 | 2921 | * record snapshot of |
| 2918 | 2922 | * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us |
| 2919 | − * | |
| 2920 | − * return 1 if config change requires a restart, else return 0 | |
| 2921 | 2923 | */ |
| 2922 | 2924 | int snapshot_cpu_lpi_us(void) |
| 2923 | 2925 | { |
| @@ -2941,17 +2943,14 @@ int snapshot_cpu_lpi_us(void) · 17 unmodified lines | ||
| 2941 | 2943 | /* |
| 2942 | 2944 | * snapshot_sys_lpi() |
| 2943 | 2945 | * |
| 2944 | − * record snapshot of | |
| 2945 | − * /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us | |
| 2946 | − * | |
| 2947 | − * return 1 if config change requires a restart, else return 0 | |
| 2946 | + * record snapshot of sys_lpi_file | |
| 2948 | 2947 | */ |
| 2949 | 2948 | int snapshot_sys_lpi_us(void) |
| 2950 | 2949 | { |
| 2951 | 2950 | FILE *fp; |
| 2952 | 2951 | int retval; |
| 2953 | 2952 | |
| 2954 | − fp = fopen_or_die("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", "r"); | |
| 2953 | + fp = fopen_or_die(sys_lpi_file, "r"); | |
| 2955 | 2954 | |
| 2956 | 2955 | retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); |
| 2957 | 2956 | if (retval != 1) { |
| @@ -3151,28 +3150,42 @@ void check_dev_msr() · 193 unmodified lines | ||
| 3151 | 3150 | err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); |
| 3152 | 3151 | } |
| 3153 | 3152 | |
| 3154 | −void check_permissions() | |
| 3153 | +/* | |
| 3154 | + * check for CAP_SYS_RAWIO | |
| 3155 | + * return 0 on success | |
| 3156 | + * return 1 on fail | |
| 3157 | + */ | |
| 3158 | +int check_for_cap_sys_rawio(void) | |
| 3155 | 3159 | { |
| 3156 | − struct __user_cap_header_struct cap_header_data; | |
| 3157 | − cap_user_header_t cap_header = &cap_header_data; | |
| 3158 | − struct __user_cap_data_struct cap_data_data; | |
| 3159 | − cap_user_data_t cap_data = &cap_data_data; | |
| 3160 | − extern int capget(cap_user_header_t hdrp, cap_user_data_t datap); | |
| 3161 | − int do_exit = 0; | |
| 3162 | − char pathname[32]; | |
| 3160 | + cap_t caps; | |
| 3161 | + cap_flag_value_t cap_flag_value; | |
| 3163 | 3162 | |
| 3164 | − /* check for CAP_SYS_RAWIO */ | |
| 3165 | − cap_header->pid = getpid(); | |
| 3166 | − cap_header->version = _LINUX_CAPABILITY_VERSION; | |
| 3167 | − if (capget(cap_header, cap_data) < 0) | |
| 3168 | − err(-6, "capget(2) failed"); | |
| 3163 | + caps = cap_get_proc(); | |
| 3164 | + if (caps == NULL) | |
| 3165 | + err(-6, "cap_get_proc\n"); | |
| 3169 | 3166 | |
| 3170 | − if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) { | |
| 3171 | − do_exit++; | |
| 3167 | + if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value)) | |
| 3168 | + err(-6, "cap_get\n"); | |
| 3169 | + | |
| 3170 | + if (cap_flag_value != CAP_SET) { | |
| 3172 | 3171 | warnx("capget(CAP_SYS_RAWIO) failed," |
| 3173 | 3172 | " try \"# setcap cap_sys_rawio=ep %s\"", progname); |
| 3173 | + return 1; | |
| 3174 | 3174 | } |
| 3175 | 3175 | |
| 3176 | + if (cap_free(caps) == -1) | |
| 3177 | + err(-6, "cap_free\n"); | |
| 3178 | + | |
| 3179 | + return 0; | |
| 3180 | +} | |
| 3181 | +void check_permissions(void) | |
| 3182 | +{ | |
| 3183 | + int do_exit = 0; | |
| 3184 | + char pathname[32]; | |
| 3185 | + | |
| 3186 | + /* check for CAP_SYS_RAWIO */ | |
| 3187 | + do_exit += check_for_cap_sys_rawio(); | |
| 3188 | + | |
| 3176 | 3189 | /* test file permissions */ |
| 3177 | 3190 | sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); |
| 3178 | 3191 | if (euidaccess(pathname, R_OK)) { |
| @@ -3265,6 +3278,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) · 86 unmodified lines | ||
| 3265 | 3278 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 3266 | 3279 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 3267 | 3280 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ |
| 3281 | + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | |
| 3268 | 3282 | pkg_cstate_limits = glm_pkg_cstate_limits; |
| 3269 | 3283 | break; |
| 3270 | 3284 | default: |
| @@ -3336,6 +3350,17 @@ int is_skx(unsigned int family, unsigned int model) · 65 unmodified lines | ||
| 3336 | 3350 | } |
| 3337 | 3351 | return 0; |
| 3338 | 3352 | } |
| 3353 | +int is_ehl(unsigned int family, unsigned int model) | |
| 3354 | +{ | |
| 3355 | + if (!genuine_intel) | |
| 3356 | + return 0; | |
| 3357 | + | |
| 3358 | + switch (model) { | |
| 3359 | + case INTEL_FAM6_ATOM_TREMONT: | |
| 3360 | + return 1; | |
| 3361 | + } | |
| 3362 | + return 0; | |
| 3363 | +} | |
| 3339 | 3364 | |
| 3340 | 3365 | int has_turbo_ratio_limit(unsigned int family, unsigned int model) |
| 3341 | 3366 | { |
| @@ -3478,6 +3503,23 @@ dump_cstate_pstate_config_info(unsigned int family, unsigned int model) · 136 unmodified lines | ||
| 3478 | 3503 | dump_nhm_cst_cfg(); |
| 3479 | 3504 | } |
| 3480 | 3505 | |
| 3506 | +static void dump_sysfs_file(char *path) | |
| 3507 | +{ | |
| 3508 | + FILE *input; | |
| 3509 | + char cpuidle_buf[64]; | |
| 3510 | + | |
| 3511 | + input = fopen(path, "r"); | |
| 3512 | + if (input == NULL) { | |
| 3513 | + if (debug) | |
| 3514 | + fprintf(outf, "NSFOD %s\n", path); | |
| 3515 | + return; | |
| 3516 | + } | |
| 3517 | + if (!fgets(cpuidle_buf, sizeof(cpuidle_buf), input)) | |
| 3518 | + err(1, "%s: failed to read file", path); | |
| 3519 | + fclose(input); | |
| 3520 | + | |
| 3521 | + fprintf(outf, "%s: %s", strrchr(path, '/') + 1, cpuidle_buf); | |
| 3522 | +} | |
| 3481 | 3523 | static void |
| 3482 | 3524 | dump_sysfs_cstate_config(void) |
| 3483 | 3525 | { |
| @@ -3491,6 +3533,15 @@ dump_sysfs_cstate_config(void) · 7 unmodified lines | ||
| 3491 | 3533 | if (!DO_BIC(BIC_sysfs)) |
| 3492 | 3534 | return; |
| 3493 | 3535 | |
| 3536 | + if (access("/sys/devices/system/cpu/cpuidle", R_OK)) { | |
| 3537 | + fprintf(outf, "cpuidle not loaded\n"); | |
| 3538 | + return; | |
| 3539 | + } | |
| 3540 | + | |
| 3541 | + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_driver"); | |
| 3542 | + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor"); | |
| 3543 | + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor_ro"); | |
| 3544 | + | |
| 3494 | 3545 | for (state = 0; state < 10; ++state) { |
| 3495 | 3546 | |
| 3496 | 3547 | sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", |
| @@ -3894,6 +3945,20 @@ void rapl_probe_intel(unsigned int family, unsigned int model) · 397 unmodified lines | ||
| 3894 | 3945 | else |
| 3895 | 3946 | BIC_PRESENT(BIC_PkgWatt); |
| 3896 | 3947 | break; |
| 3948 | + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | |
| 3949 | + do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; | |
| 3950 | + if (rapl_joules) { | |
| 3951 | + BIC_PRESENT(BIC_Pkg_J); | |
| 3952 | + BIC_PRESENT(BIC_Cor_J); | |
| 3953 | + BIC_PRESENT(BIC_RAM_J); | |
| 3954 | + BIC_PRESENT(BIC_GFX_J); | |
| 3955 | + } else { | |
| 3956 | + BIC_PRESENT(BIC_PkgWatt); | |
| 3957 | + BIC_PRESENT(BIC_CorWatt); | |
| 3958 | + BIC_PRESENT(BIC_RAMWatt); | |
| 3959 | + BIC_PRESENT(BIC_GFXWatt); | |
| 3960 | + } | |
| 3961 | + break; | |
| 3897 | 3962 | case INTEL_FAM6_SKYLAKE_L: /* SKL */ |
| 3898 | 3963 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ |
| 3899 | 3964 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; |
| @@ -4295,6 +4360,7 @@ int has_snb_msrs(unsigned int family, unsigned int model) · 395 unmodified lines | ||
| 4295 | 4360 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 4296 | 4361 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 4297 | 4362 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ |
| 4363 | + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | |
| 4298 | 4364 | return 1; |
| 4299 | 4365 | } |
| 4300 | 4366 | return 0; |
| @@ -4324,6 +4390,7 @@ int has_c8910_msrs(unsigned int family, unsigned int model) · 23 unmodified lines | ||
| 4324 | 4390 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ |
| 4325 | 4391 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 4326 | 4392 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 4393 | + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | |
| 4327 | 4394 | return 1; |
| 4328 | 4395 | } |
| 4329 | 4396 | return 0; |
| @@ -4610,14 +4677,24 @@ unsigned int intel_model_duplicates(unsigned int model) · 280 unmodified lines | ||
| 4610 | 4677 | case INTEL_FAM6_SKYLAKE: |
| 4611 | 4678 | case INTEL_FAM6_KABYLAKE_L: |
| 4612 | 4679 | case INTEL_FAM6_KABYLAKE: |
| 4680 | + case INTEL_FAM6_COMETLAKE_L: | |
| 4681 | + case INTEL_FAM6_COMETLAKE: | |
| 4613 | 4682 | return INTEL_FAM6_SKYLAKE_L; |
| 4614 | 4683 | |
| 4615 | 4684 | case INTEL_FAM6_ICELAKE_L: |
| 4616 | 4685 | case INTEL_FAM6_ICELAKE_NNPI: |
| 4686 | + case INTEL_FAM6_TIGERLAKE_L: | |
| 4687 | + case INTEL_FAM6_TIGERLAKE: | |
| 4617 | 4688 | return INTEL_FAM6_CANNONLAKE_L; |
| 4618 | 4689 | |
| 4619 | 4690 | case INTEL_FAM6_ATOM_TREMONT_D: |
| 4620 | 4691 | return INTEL_FAM6_ATOM_GOLDMONT_D; |
| 4692 | + | |
| 4693 | + case INTEL_FAM6_ATOM_TREMONT_L: | |
| 4694 | + return INTEL_FAM6_ATOM_TREMONT; | |
| 4695 | + | |
| 4696 | + case INTEL_FAM6_ICELAKE_X: | |
| 4697 | + return INTEL_FAM6_SKYLAKE_X; | |
| 4621 | 4698 | } |
| 4622 | 4699 | return model; |
| 4623 | 4700 | } |
| @@ -4872,7 +4949,8 @@ void process_cpuid() · 248 unmodified lines | ||
| 4872 | 4949 | do_slm_cstates = is_slm(family, model); |
| 4873 | 4950 | do_knl_cstates = is_knl(family, model); |
| 4874 | 4951 | |
| 4875 | − if (do_slm_cstates || do_knl_cstates || is_cnl(family, model)) | |
| 4952 | + if (do_slm_cstates || do_knl_cstates || is_cnl(family, model) || | |
| 4953 | + is_ehl(family, model)) | |
| 4876 | 4954 | BIC_NOT_PRESENT(BIC_CPU_c3); |
| 4877 | 4955 | |
| 4878 | 4956 | if (!quiet) |
| @@ -4907,10 +4985,16 @@ void process_cpuid() · 28 unmodified lines | ||
| 4907 | 4985 | else |
| 4908 | 4986 | BIC_NOT_PRESENT(BIC_CPU_LPI); |
| 4909 | 4987 | |
| 4910 | − if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", R_OK)) | |
| 4988 | + if (!access(sys_lpi_file_sysfs, R_OK)) { | |
| 4989 | + sys_lpi_file = sys_lpi_file_sysfs; | |
| 4911 | 4990 | BIC_PRESENT(BIC_SYS_LPI); |
| 4912 | − else | |
| 4991 | + } else if (!access(sys_lpi_file_debugfs, R_OK)) { | |
| 4992 | + sys_lpi_file = sys_lpi_file_debugfs; | |
| 4993 | + BIC_PRESENT(BIC_SYS_LPI); | |
| 4994 | + } else { | |
| 4995 | + sys_lpi_file_sysfs = NULL; | |
| 4913 | 4996 | BIC_NOT_PRESENT(BIC_SYS_LPI); |
| 4997 | + } | |
| 4914 | 4998 | |
| 4915 | 4999 | if (!quiet) |
| 4916 | 5000 | decode_misc_feature_control(); |
| @@ -5306,7 +5390,7 @@ int get_and_dump_counters(void) · 389 unmodified lines | ||
| 5306 | 5390 | } |
| 5307 | 5391 | |
| 5308 | 5392 | void print_version() { |
| 5309 | − fprintf(outf, "turbostat version 19.08.31" | |
| 5393 | + fprintf(outf, "turbostat version 20.03.20" | |
| 5310 | 5394 | " - Len Brown <lenb@kernel.org>\n"); |
| 5311 | 5395 | } |
| 5312 | 5396 | |
| @@ -5323,9 +5407,9 @@ int add_counter(unsigned int msr_num, char *path, char *name, · 10 unmodified lines | ||
| 5323 | 5407 | } |
| 5324 | 5408 | |
| 5325 | 5409 | msrp->msr_num = msr_num; |
| 5326 | − strncpy(msrp->name, name, NAME_BYTES); | |
| 5410 | + strncpy(msrp->name, name, NAME_BYTES - 1); | |
| 5327 | 5411 | if (path) |
| 5328 | − strncpy(msrp->path, path, PATH_BYTES); | |
| 5412 | + strncpy(msrp->path, path, PATH_BYTES - 1); | |
| 5329 | 5413 | msrp->width = width; |
| 5330 | 5414 | msrp->type = type; |
| 5331 | 5415 | msrp->format = format; |
| @@ -30,7 +30,7 @@ my %default = ( · 29 unmodified lines | ||
| 30 | 30 | "EMAIL_WHEN_STARTED" => 0, |
| 31 | 31 | "NUM_TESTS" => 1, |
| 32 | 32 | "TEST_TYPE" => "build", |
| 33 | − "BUILD_TYPE" => "randconfig", | |
| 33 | + "BUILD_TYPE" => "oldconfig", | |
| 34 | 34 | "MAKE_CMD" => "make", |
| 35 | 35 | "CLOSE_CONSOLE_SIGNAL" => "INT", |
| 36 | 36 | "TIMEOUT" => 120, |
| @@ -1030,7 +1030,7 @@ sub __read_config { · 993 unmodified lines | ||
| 1030 | 1030 | } |
| 1031 | 1031 | |
| 1032 | 1032 | if (!$skip && $rest !~ /^\s*$/) { |
| 1033 | − die "$name: $.: Gargbage found after $type\n$_"; | |
| 1033 | + die "$name: $.: Garbage found after $type\n$_"; | |
| 1034 | 1034 | } |
| 1035 | 1035 | |
| 1036 | 1036 | if ($skip && $type eq "TEST_START") { |
| @@ -1063,7 +1063,7 @@ sub __read_config { · 26 unmodified lines | ||
| 1063 | 1063 | } |
| 1064 | 1064 | |
| 1065 | 1065 | if ($rest !~ /^\s*$/) { |
| 1066 | − die "$name: $.: Gargbage found after DEFAULTS\n$_"; | |
| 1066 | + die "$name: $.: Garbage found after DEFAULTS\n$_"; | |
| 1067 | 1067 | } |
| 1068 | 1068 | |
| 1069 | 1069 | } elsif (/^\s*INCLUDE\s+(\S+)/) { |
| @@ -1154,7 +1154,7 @@ sub __read_config { · 84 unmodified lines | ||
| 1154 | 1154 | # on of these sections that have SKIP defined. |
| 1155 | 1155 | # The save variable can be |
| 1156 | 1156 | # defined multiple times and the new one simply overrides |
| 1157 | − # the prevous one. | |
| 1157 | + # the previous one. | |
| 1158 | 1158 | set_variable($lvalue, $rvalue); |
| 1159 | 1159 | |
| 1160 | 1160 | } else { |
| @@ -1234,7 +1234,7 @@ sub read_config { · 73 unmodified lines | ||
| 1234 | 1234 | foreach my $option (keys %not_used) { |
| 1235 | 1235 | print "$option\n"; |
| 1236 | 1236 | } |
| 1237 | − print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n"; | |
| 1237 | + print "Set IGNORE_UNUSED = 1 to have ktest ignore unused variables\n"; | |
| 1238 | 1238 | if (!read_yn "Do you want to continue?") { |
| 1239 | 1239 | exit -1; |
| 1240 | 1240 | } |
| @@ -1345,7 +1345,7 @@ sub eval_option { · 104 unmodified lines | ||
| 1345 | 1345 | # Check for recursive evaluations. |
| 1346 | 1346 | # 100 deep should be more than enough. |
| 1347 | 1347 | if ($r++ > 100) { |
| 1348 | − die "Over 100 evaluations accurred with $option\n" . | |
| 1348 | + die "Over 100 evaluations occurred with $option\n" . | |
| 1349 | 1349 | "Check for recursive variables\n"; |
| 1350 | 1350 | } |
| 1351 | 1351 | $prev = $option; |
| @@ -1383,7 +1383,7 @@ sub reboot { · 31 unmodified lines | ||
| 1383 | 1383 | |
| 1384 | 1384 | } else { |
| 1385 | 1385 | # Make sure everything has been written to disk |
| 1386 | − run_ssh("sync"); | |
| 1386 | + run_ssh("sync", 10); | |
| 1387 | 1387 | |
| 1388 | 1388 | if (defined($time)) { |
| 1389 | 1389 | start_monitor; |
| @@ -1461,7 +1461,7 @@ sub get_test_name() { · 71 unmodified lines | ||
| 1461 | 1461 | |
| 1462 | 1462 | sub dodie { |
| 1463 | 1463 | |
| 1464 | − # avoid recusion | |
| 1464 | + # avoid recursion | |
| 1465 | 1465 | return if ($in_die); |
| 1466 | 1466 | $in_die = 1; |
| 1467 | 1467 | |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | ||
| 10 | 10 | # |
| 11 | 11 | |
| 12 | 12 | # Options set in the beginning of the file are considered to be |
| 13 | −# default options. These options can be overriden by test specific | |
| 13 | +# default options. These options can be overridden by test specific | |
| 14 | 14 | # options, with the following exceptions: |
| 15 | 15 | # |
| 16 | 16 | # LOG_FILE |
| @@ -204,7 +204,7 @@ · 187 unmodified lines | ||
| 204 | 204 | # |
| 205 | 205 | # This config file can also contain "config variables". |
| 206 | 206 | # These are assigned with ":=" instead of the ktest option |
| 207 | −# assigment "=". | |
| 207 | +# assignment "=". | |
| 208 | 208 | # |
| 209 | 209 | # The difference between ktest options and config variables |
| 210 | 210 | # is that config variables can be used multiple times, |
| @@ -263,7 +263,7 @@ · 52 unmodified lines | ||
| 263 | 263 | #### Using options in other options #### |
| 264 | 264 | # |
| 265 | 265 | # Options that are defined in the config file may also be used |
| 266 | −# by other options. All options are evaulated at time of | |
| 266 | +# by other options. All options are evaluated at time of | |
| 267 | 267 | # use (except that config variables are evaluated at config |
| 268 | 268 | # processing time). |
| 269 | 269 | # |
| @@ -505,7 +505,7 @@ · 235 unmodified lines | ||
| 505 | 505 | #TEST = ssh user@machine /root/run_test |
| 506 | 506 | |
| 507 | 507 | # The build type is any make config type or special command |
| 508 | −# (default randconfig) | |
| 508 | +# (default oldconfig) | |
| 509 | 509 | # nobuild - skip the clean and build step |
| 510 | 510 | # useconfig:/path/to/config - use the given config and run |
| 511 | 511 | # oldconfig on it. |
| @@ -707,7 +707,7 @@ · 195 unmodified lines | ||
| 707 | 707 | |
| 708 | 708 | # Line to define a successful boot up in console output. |
| 709 | 709 | # This is what the line contains, not the entire line. If you need |
| 710 | −# the entire line to match, then use regural expression syntax like: | |
| 710 | +# the entire line to match, then use regular expression syntax like: | |
| 711 | 711 | # (do not add any quotes around it) |
| 712 | 712 | # |
| 713 | 713 | # SUCCESS_LINE = ^MyBox Login:$ |
| @@ -839,7 +839,7 @@ · 125 unmodified lines | ||
| 839 | 839 | # (ignored if POWEROFF_ON_SUCCESS is set) |
| 840 | 840 | #REBOOT_ON_SUCCESS = 1 |
| 841 | 841 | |
| 842 | −# In case there are isses with rebooting, you can specify this | |
| 842 | +# In case there are issues with rebooting, you can specify this | |
| 843 | 843 | # to always powercycle after this amount of time after calling |
| 844 | 844 | # reboot. |
| 845 | 845 | # Note, POWERCYCLE_AFTER_REBOOT = 0 does NOT disable it. It just |
| @@ -848,7 +848,7 @@ · 2 unmodified lines | ||
| 848 | 848 | # (default undefined) |
| 849 | 849 | #POWERCYCLE_AFTER_REBOOT = 5 |
| 850 | 850 | |
| 851 | −# In case there's isses with halting, you can specify this | |
| 851 | +# In case there's issues with halting, you can specify this | |
| 852 | 852 | # to always poweroff after this amount of time after calling |
| 853 | 853 | # halt. |
| 854 | 854 | # Note, POWEROFF_AFTER_HALT = 0 does NOT disable it. It just |
| @@ -972,7 +972,7 @@ · 117 unmodified lines | ||
| 972 | 972 | # |
| 973 | 973 | # PATCHCHECK_START is required and is the first patch to |
| 974 | 974 | # test (the SHA1 of the commit). You may also specify anything |
| 975 | −# that git checkout allows (branch name, tage, HEAD~3). | |
| 975 | +# that git checkout allows (branch name, tag, HEAD~3). | |
| 976 | 976 | # |
| 977 | 977 | # PATCHCHECK_END is the last patch to check (default HEAD) |
| 978 | 978 | # |
| @@ -994,7 +994,7 @@ · 15 unmodified lines | ||
| 994 | 994 | # IGNORE_WARNINGS is set for the given commit's sha1 |
| 995 | 995 | # |
| 996 | 996 | # IGNORE_WARNINGS can be used to disable the failure of patchcheck |
| 997 | −# on a particuler commit (SHA1). You can add more than one commit | |
| 997 | +# on a particular commit (SHA1). You can add more than one commit | |
| 998 | 998 | # by adding a list of SHA1s that are space delimited. |
| 999 | 999 | # |
| 1000 | 1000 | # If BUILD_NOCLEAN is set, then make mrproper will not be run on |
| @@ -1093,7 +1093,7 @@ · 92 unmodified lines | ||
| 1093 | 1093 | # whatever reason. (Can't reboot, want to inspect each iteration) |
| 1094 | 1094 | # Doing a BISECT_MANUAL will have the test wait for you to |
| 1095 | 1095 | # tell it if the test passed or failed after each iteration. |
| 1096 | −# This is basicall the same as running git bisect yourself | |
| 1096 | +# This is basically the same as running git bisect yourself | |
| 1097 | 1097 | # but ktest will rebuild and install the kernel for you. |
| 1098 | 1098 | # |
| 1099 | 1099 | # BISECT_CHECK = 1 (optional, default 0) |
| @@ -1239,7 +1239,7 @@ · 139 unmodified lines | ||
| 1239 | 1239 | # |
| 1240 | 1240 | # CONFIG_BISECT_EXEC (optional) |
| 1241 | 1241 | # The config bisect is a separate program that comes with ktest.pl. |
| 1242 | −# By befault, it will look for: | |
| 1242 | +# By default, it will look for: | |
| 1243 | 1243 | # `pwd`/config-bisect.pl # the location ktest.pl was executed from. |
| 1244 | 1244 | # If it does not find it there, it will look for: |
| 1245 | 1245 | # `dirname <ktest.pl>`/config-bisect.pl # The directory that holds ktest.pl |
| @@ -1041,6 +1041,27 @@ ipv6_addr_metric_test() · 1040 unmodified lines | ||
| 1041 | 1041 | fi |
| 1042 | 1042 | log_test $rc 0 "Prefix route with metric on link up" |
| 1043 | 1043 | |
| 1044 | + # verify peer metric added correctly | |
| 1045 | + set -e | |
| 1046 | + run_cmd "$IP -6 addr flush dev dummy2" | |
| 1047 | + run_cmd "$IP -6 addr add dev dummy2 2001:db8:104::1 peer 2001:db8:104::2 metric 260" | |
| 1048 | + set +e | |
| 1049 | + | |
| 1050 | + check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 260" | |
| 1051 | + log_test $? 0 "Set metric with peer route on local side" | |
| 1052 | + log_test $? 0 "User specified metric on local address" | |
| 1053 | + check_route6 "2001:db8:104::2 dev dummy2 proto kernel metric 260" | |
| 1054 | + log_test $? 0 "Set metric with peer route on peer side" | |
| 1055 | + | |
| 1056 | + set -e | |
| 1057 | + run_cmd "$IP -6 addr change dev dummy2 2001:db8:104::1 peer 2001:db8:104::3 metric 261" | |
| 1058 | + set +e | |
| 1059 | + | |
| 1060 | + check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 261" | |
| 1061 | + log_test $? 0 "Modify metric and peer address on local side" | |
| 1062 | + check_route6 "2001:db8:104::3 dev dummy2 proto kernel metric 261" | |
| 1063 | + log_test $? 0 "Modify metric and peer address on peer side" | |
| 1064 | + | |
| 1044 | 1065 | $IP li del dummy1 |
| 1045 | 1066 | $IP li del dummy2 |
| 1046 | 1067 | cleanup |
| @@ -1457,13 +1478,20 @@ ipv4_addr_metric_test() · 410 unmodified lines | ||
| 1457 | 1478 | |
| 1458 | 1479 | run_cmd "$IP addr flush dev dummy2" |
| 1459 | 1480 | run_cmd "$IP addr add dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 260" |
| 1460 | − run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 261" | |
| 1461 | 1481 | rc=$? |
| 1462 | 1482 | if [ $rc -eq 0 ]; then |
| 1463 | − check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261" | |
| 1483 | + check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 260" | |
| 1484 | + rc=$? | |
| 1485 | + fi | |
| 1486 | + log_test $rc 0 "Set metric of address with peer route" | |
| 1487 | + | |
| 1488 | + run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.3 metric 261" | |
| 1489 | + rc=$? | |
| 1490 | + if [ $rc -eq 0 ]; then | |
| 1491 | + check_route "172.16.104.3 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261" | |
| 1464 | 1492 | rc=$? |
| 1465 | 1493 | fi |
| 1466 | − log_test $rc 0 "Modify metric of address with peer route" | |
| 1494 | + log_test $rc 0 "Modify metric and peer address for peer route" | |
| 1467 | 1495 | |
| 1468 | 1496 | $IP li del dummy1 |
| 1469 | 1497 | $IP li del dummy2 |
| @@ -57,3 +57,4 @@ CONFIG_NET_IFE_SKBMARK=m · 56 unmodified lines | ||
| 57 | 57 | CONFIG_NET_IFE_SKBPRIO=m |
| 58 | 58 | CONFIG_NET_IFE_SKBTCINDEX=m |
| 59 | 59 | CONFIG_NET_SCH_FIFO=y |
| 60 | +CONFIG_NET_SCH_ETS=m | |
| @@ -124,17 +124,6 @@ choice · 123 unmodified lines | ||
| 124 | 124 | |
| 125 | 125 | If in doubt, select 'None' |
| 126 | 126 | |
| 127 | −config INITRAMFS_COMPRESSION_NONE | |
| 128 | − bool "None" | |
| 129 | − help | |
| 130 | − Do not compress the built-in initramfs at all. This may sound wasteful | |
| 131 | − in space, but, you should be aware that the built-in initramfs will be | |
| 132 | − compressed at a later stage anyways along with the rest of the kernel, | |
| 133 | − on those architectures that support this. However, not compressing the | |
| 134 | − initramfs may lead to slightly higher memory consumption during a | |
| 135 | − short time at boot, while both the cpio image and the unpacked | |
| 136 | − filesystem image will be present in memory simultaneously | |
| 137 | − | |
| 138 | 127 | config INITRAMFS_COMPRESSION_GZIP |
| 139 | 128 | bool "Gzip" |
| 140 | 129 | depends on RD_GZIP |
| @@ -207,4 +196,15 @@ config INITRAMFS_COMPRESSION_LZ4 · 66 unmodified lines | ||
| 207 | 196 | If you choose this, keep in mind that most distros don't provide lz4 |
| 208 | 197 | by default which could cause a build failure. |
| 209 | 198 | |
| 199 | +config INITRAMFS_COMPRESSION_NONE | |
| 200 | + bool "None" | |
| 201 | + help | |
| 202 | + Do not compress the built-in initramfs at all. This may sound wasteful | |
| 203 | + in space, but, you should be aware that the built-in initramfs will be | |
| 204 | + compressed at a later stage anyways along with the rest of the kernel, | |
| 205 | + on those architectures that support this. However, not compressing the | |
| 206 | + initramfs may lead to slightly higher memory consumption during a | |
| 207 | + short time at boot, while both the cpio image and the unpacked | |
| 208 | + filesystem image will be present in memory simultaneously | |
| 209 | + | |
| 210 | 210 | endchoice |