We need the char/misc driver fixes in here as well.
Unified · Split
| @@ -86,6 +86,8 @@ ForEachMacros: · 85 unmodified lines | |||
| 86 | - 'bio_for_each_segment_all' | 86 | - 'bio_for_each_segment_all' |
| 87 | - 'bio_list_for_each' | 87 | - 'bio_list_for_each' |
| 88 | - 'bip_for_each_vec' | 88 | - 'bip_for_each_vec' |
| 89 | - 'bitmap_for_each_clear_region' | ||
| 90 | - 'bitmap_for_each_set_region' | ||
| 89 | - 'blkg_for_each_descendant_post' | 91 | - 'blkg_for_each_descendant_post' |
| 90 | - 'blkg_for_each_descendant_pre' | 92 | - 'blkg_for_each_descendant_pre' |
| 91 | - 'blk_queue_for_each_rl' | 93 | - 'blk_queue_for_each_rl' |
| @@ -115,6 +117,7 @@ ForEachMacros: · 23 unmodified lines | |||
| 115 | - 'drm_client_for_each_connector_iter' | 117 | - 'drm_client_for_each_connector_iter' |
| 116 | - 'drm_client_for_each_modeset' | 118 | - 'drm_client_for_each_modeset' |
| 117 | - 'drm_connector_for_each_possible_encoder' | 119 | - 'drm_connector_for_each_possible_encoder' |
| 120 | - 'drm_for_each_bridge_in_chain' | ||
| 118 | - 'drm_for_each_connector_iter' | 121 | - 'drm_for_each_connector_iter' |
| 119 | - 'drm_for_each_crtc' | 122 | - 'drm_for_each_crtc' |
| 120 | - 'drm_for_each_encoder' | 123 | - 'drm_for_each_encoder' |
| @@ -136,9 +139,10 @@ ForEachMacros: · 15 unmodified lines | |||
| 136 | - 'for_each_bio' | 139 | - 'for_each_bio' |
| 137 | - 'for_each_board_func_rsrc' | 140 | - 'for_each_board_func_rsrc' |
| 138 | - 'for_each_bvec' | 141 | - 'for_each_bvec' |
| 142 | - 'for_each_card_auxs' | ||
| 143 | - 'for_each_card_auxs_safe' | ||
| 139 | - 'for_each_card_components' | 144 | - 'for_each_card_components' |
| 140 | - 'for_each_card_links' | 145 | - 'for_each_card_pre_auxs' |
| 141 | - 'for_each_card_links_safe' | ||
| 142 | - 'for_each_card_prelinks' | 146 | - 'for_each_card_prelinks' |
| 143 | - 'for_each_card_rtds' | 147 | - 'for_each_card_rtds' |
| 144 | - 'for_each_card_rtds_safe' | 148 | - 'for_each_card_rtds_safe' |
| @@ -166,6 +170,7 @@ ForEachMacros: · 21 unmodified lines | |||
| 166 | - 'for_each_dpcm_fe' | 170 | - 'for_each_dpcm_fe' |
| 167 | - 'for_each_drhd_unit' | 171 | - 'for_each_drhd_unit' |
| 168 | - 'for_each_dss_dev' | 172 | - 'for_each_dss_dev' |
| 173 | - 'for_each_efi_handle' | ||
| 169 | - 'for_each_efi_memory_desc' | 174 | - 'for_each_efi_memory_desc' |
| 170 | - 'for_each_efi_memory_desc_in_map' | 175 | - 'for_each_efi_memory_desc_in_map' |
| 171 | - 'for_each_element' | 176 | - 'for_each_element' |
| @@ -190,6 +195,7 @@ ForEachMacros: · 18 unmodified lines | |||
| 190 | - 'for_each_lru' | 195 | - 'for_each_lru' |
| 191 | - 'for_each_matching_node' | 196 | - 'for_each_matching_node' |
| 192 | - 'for_each_matching_node_and_match' | 197 | - 'for_each_matching_node_and_match' |
| 198 | - 'for_each_member' | ||
| 193 | - 'for_each_memblock' | 199 | - 'for_each_memblock' |
| 194 | - 'for_each_memblock_type' | 200 | - 'for_each_memblock_type' |
| 195 | - 'for_each_memcg_cache_index' | 201 | - 'for_each_memcg_cache_index' |
| @@ -200,9 +206,11 @@ ForEachMacros: · 4 unmodified lines | |||
| 200 | - 'for_each_msi_entry' | 206 | - 'for_each_msi_entry' |
| 201 | - 'for_each_msi_entry_safe' | 207 | - 'for_each_msi_entry_safe' |
| 202 | - 'for_each_net' | 208 | - 'for_each_net' |
| 209 | - 'for_each_net_continue_reverse' | ||
| 203 | - 'for_each_netdev' | 210 | - 'for_each_netdev' |
| 204 | - 'for_each_netdev_continue' | 211 | - 'for_each_netdev_continue' |
| 205 | - 'for_each_netdev_continue_rcu' | 212 | - 'for_each_netdev_continue_rcu' |
| 213 | - 'for_each_netdev_continue_reverse' | ||
| 206 | - 'for_each_netdev_feature' | 214 | - 'for_each_netdev_feature' |
| 207 | - 'for_each_netdev_in_bond_rcu' | 215 | - 'for_each_netdev_in_bond_rcu' |
| 208 | - 'for_each_netdev_rcu' | 216 | - 'for_each_netdev_rcu' |
| @@ -254,10 +262,10 @@ ForEachMacros: · 45 unmodified lines | |||
| 254 | - 'for_each_reserved_mem_region' | 262 | - 'for_each_reserved_mem_region' |
| 255 | - 'for_each_rtd_codec_dai' | 263 | - 'for_each_rtd_codec_dai' |
| 256 | - 'for_each_rtd_codec_dai_rollback' | 264 | - 'for_each_rtd_codec_dai_rollback' |
| 257 | - 'for_each_rtdcom' | 265 | - 'for_each_rtd_components' |
| 258 | - 'for_each_rtdcom_safe' | ||
| 259 | - 'for_each_set_bit' | 266 | - 'for_each_set_bit' |
| 260 | - 'for_each_set_bit_from' | 267 | - 'for_each_set_bit_from' |
| 268 | - 'for_each_set_clump8' | ||
| 261 | - 'for_each_sg' | 269 | - 'for_each_sg' |
| 262 | - 'for_each_sg_dma_page' | 270 | - 'for_each_sg_dma_page' |
| 263 | - 'for_each_sg_page' | 271 | - 'for_each_sg_page' |
| @@ -267,6 +275,7 @@ ForEachMacros: · 3 unmodified lines | |||
| 267 | - 'for_each_subelement_id' | 275 | - 'for_each_subelement_id' |
| 268 | - '__for_each_thread' | 276 | - '__for_each_thread' |
| 269 | - 'for_each_thread' | 277 | - 'for_each_thread' |
| 278 | - 'for_each_wakeup_source' | ||
| 270 | - 'for_each_zone' | 279 | - 'for_each_zone' |
| 271 | - 'for_each_zone_zonelist' | 280 | - 'for_each_zone_zonelist' |
| 272 | - 'for_each_zone_zonelist_nodemask' | 281 | - 'for_each_zone_zonelist_nodemask' |
| @@ -330,6 +339,7 @@ ForEachMacros: · 57 unmodified lines | |||
| 330 | - 'list_for_each' | 339 | - 'list_for_each' |
| 331 | - 'list_for_each_codec' | 340 | - 'list_for_each_codec' |
| 332 | - 'list_for_each_codec_safe' | 341 | - 'list_for_each_codec_safe' |
| 342 | - 'list_for_each_continue' | ||
| 333 | - 'list_for_each_entry' | 343 | - 'list_for_each_entry' |
| 334 | - 'list_for_each_entry_continue' | 344 | - 'list_for_each_entry_continue' |
| 335 | - 'list_for_each_entry_continue_rcu' | 345 | - 'list_for_each_entry_continue_rcu' |
| @@ -351,6 +361,7 @@ ForEachMacros: · 15 unmodified lines | |||
| 351 | - 'llist_for_each_entry' | 361 | - 'llist_for_each_entry' |
| 352 | - 'llist_for_each_entry_safe' | 362 | - 'llist_for_each_entry_safe' |
| 353 | - 'llist_for_each_safe' | 363 | - 'llist_for_each_safe' |
| 364 | - 'mci_for_each_dimm' | ||
| 354 | - 'media_device_for_each_entity' | 365 | - 'media_device_for_each_entity' |
| 355 | - 'media_device_for_each_intf' | 366 | - 'media_device_for_each_intf' |
| 356 | - 'media_device_for_each_link' | 367 | - 'media_device_for_each_link' |
| @@ -444,10 +455,16 @@ ForEachMacros: · 87 unmodified lines | |||
| 444 | - 'virtio_device_for_each_vq' | 455 | - 'virtio_device_for_each_vq' |
| 445 | - 'xa_for_each' | 456 | - 'xa_for_each' |
| 446 | - 'xa_for_each_marked' | 457 | - 'xa_for_each_marked' |
| 458 | - 'xa_for_each_range' | ||
| 447 | - 'xa_for_each_start' | 459 | - 'xa_for_each_start' |
| 448 | - 'xas_for_each' | 460 | - 'xas_for_each' |
| 449 | - 'xas_for_each_conflict' | 461 | - 'xas_for_each_conflict' |
| 450 | - 'xas_for_each_marked' | 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 | - 'zorro_for_each_dev' | 468 | - 'zorro_for_each_dev' |
| 452 | 469 | ||
| 453 | #IncludeBlocks: Preserve # Unknown to clang-format-5.0 | 470 | #IncludeBlocks: Preserve # Unknown to clang-format-5.0 |
| @@ -110,6 +110,8 @@ stable kernels. · 109 unmodified lines | |||
| 110 | +----------------+-----------------+-----------------+-----------------------------+ | 110 | +----------------+-----------------+-----------------+-----------------------------+ |
| 111 | | Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 | | 111 | | Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 | |
| 112 | +----------------+-----------------+-----------------+-----------------------------+ | 112 | +----------------+-----------------+-----------------+-----------------------------+ |
| 113 | | Cavium | ThunderX GICv3 | #38539 | N/A | | ||
| 114 | +----------------+-----------------+-----------------+-----------------------------+ | ||
| 113 | | Cavium | ThunderX Core | #27456 | CAVIUM_ERRATUM_27456 | | 115 | | Cavium | ThunderX Core | #27456 | CAVIUM_ERRATUM_27456 | |
| 114 | +----------------+-----------------+-----------------+-----------------------------+ | 116 | +----------------+-----------------+-----------------+-----------------------------+ |
| 115 | | Cavium | ThunderX Core | #30115 | CAVIUM_ERRATUM_30115 | | 117 | | Cavium | ThunderX Core | #30115 | CAVIUM_ERRATUM_30115 | |
| @@ -110,6 +110,13 @@ PROPERTIES · 109 unmodified lines | |||
| 110 | Usage: required | 110 | Usage: required |
| 111 | Definition: See soc/fsl/qman.txt and soc/fsl/bman.txt | 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 | FMan MURAM Node | 121 | FMan MURAM Node |
| 115 | 122 | ||
| @@ -850,3 +850,11 @@ business doing so. · 849 unmodified lines | |||
| 850 | d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are | 850 | d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are |
| 851 | very suspect (and won't work in modules). Such uses are very likely to | 851 | very suspect (and won't work in modules). Such uses are very likely to |
| 852 | be misspelled d_alloc_anon(). | 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 | KBUILD_EXTRA_SYMBOLS | 237 | KBUILD_EXTRA_SYMBOLS |
| 238 | -------------------- | 238 | -------------------- |
| 239 | For modules that use symbols from other modules. | 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 | ALLSOURCE_ARCHS | 242 | ALLSOURCE_ARCHS |
| 243 | --------------- | 243 | --------------- |
| @@ -44,7 +44,7 @@ intermediate:: · 43 unmodified lines | |||
| 44 | def_bool y | 44 | def_bool y |
| 45 | 45 | ||
| 46 | Then, Kconfig moves onto the evaluation stage to resolve inter-symbol | 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 | Variables | 50 | Variables |
| @@ -924,7 +924,7 @@ When kbuild executes, the following steps are followed (roughly): · 923 unmodified lines | |||
| 924 | $(KBUILD_AFLAGS_MODULE) is used to add arch-specific options that | 924 | $(KBUILD_AFLAGS_MODULE) is used to add arch-specific options that |
| 925 | are used for assembler. | 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 | KBUILD_CFLAGS_KERNEL | 929 | KBUILD_CFLAGS_KERNEL |
| 930 | $(CC) options specific for built-in | 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 | $(KBUILD_CFLAGS_MODULE) is used to add arch-specific options that | 938 | $(KBUILD_CFLAGS_MODULE) is used to add arch-specific options that |
| 939 | are used for $(CC). | 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 | KBUILD_LDFLAGS_MODULE | 942 | KBUILD_LDFLAGS_MODULE |
| 943 | Options for $(LD) when linking modules | 943 | Options for $(LD) when linking modules |
| @@ -945,7 +945,7 @@ When kbuild executes, the following steps are followed (roughly): · 1 unmodified line | |||
| 945 | $(KBUILD_LDFLAGS_MODULE) is used to add arch-specific options | 945 | $(KBUILD_LDFLAGS_MODULE) is used to add arch-specific options |
| 946 | used when linking modules. This is often a linker script. | 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 | KBUILD_LDS | 950 | KBUILD_LDS |
| 951 | 951 | ||
| @@ -470,9 +470,9 @@ build. · 469 unmodified lines | |||
| 470 | 470 | ||
| 471 | The syntax of the Module.symvers file is:: | 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 | The fields are separated by tabs and values may be empty (e.g. | 477 | The fields are separated by tabs and values may be empty (e.g. |
| 478 | if no namespace is defined for an exported symbol). | 478 | if no namespace is defined for an exported symbol). |
| @@ -40,9 +40,6 @@ example usage · 39 unmodified lines | |||
| 40 | # Delete a snapshot using: | 40 | # Delete a snapshot using: |
| 41 | $ devlink region del pci/0000:00:05.0/cr-space snapshot 1 | 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 | # Dump a snapshot: | 43 | # Dump a snapshot: |
| 47 | $ devlink region dump pci/0000:00:05.0/fw-health snapshot 1 | 44 | $ devlink region dump pci/0000:00:05.0/fw-health snapshot 1 |
| 48 | 0000000000000000 0014 95dc 0014 9514 0035 1670 0034 db30 | 45 | 0000000000000000 0014 95dc 0014 9514 0035 1670 0034 db30 |
| @@ -8,9 +8,9 @@ Overview · 7 unmodified lines | |||
| 8 | ======== | 8 | ======== |
| 9 | 9 | ||
| 10 | The net_failover driver provides an automated failover mechanism via APIs | 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 | standby slave netdevs that get registered via the generic failover | 12 | standby slave netdevs that get registered via the generic failover |
| 13 | infrastructrure. | 13 | infrastructure. |
| 14 | 14 | ||
| 15 | The failover netdev acts a master device and controls 2 slave devices. The | 15 | The failover netdev acts a master device and controls 2 slave devices. The |
| 16 | original paravirtual interface is registered as 'standby' slave netdev and | 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 | net_failover enables hypervisor controlled accelerated datapath to virtio-net | 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 | To support this, the hypervisor needs to enable VIRTIO_NET_F_STANDBY | 34 | To support this, the hypervisor needs to enable VIRTIO_NET_F_STANDBY |
| 35 | feature on the virtio-net interface and assign the same MAC address to both | 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 | set SO_RDS_TRANSPORT on a socket for which the transport has | 159 | set SO_RDS_TRANSPORT on a socket for which the transport has |
| 160 | been previously attached explicitly (by SO_RDS_TRANSPORT) or | 160 | been previously attached explicitly (by SO_RDS_TRANSPORT) or |
| 161 | implicitly (via bind(2)) will return an error of EOPNOTSUPP. | 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 | always return EINVAL. | 163 | always return EINVAL. |
| 164 | 164 | ||
| 165 | RDMA for RDS | 165 | RDMA for RDS |
| @@ -4076,7 +4076,6 @@ F: drivers/scsi/snic/ · 4075 unmodified lines | |||
| 4076 | CISCO VIC ETHERNET NIC DRIVER | 4076 | CISCO VIC ETHERNET NIC DRIVER |
| 4077 | M: Christian Benvenuti <benve@cisco.com> | 4077 | M: Christian Benvenuti <benve@cisco.com> |
| 4078 | M: Govindarajulu Varadarajan <_govind@gmx.com> | 4078 | M: Govindarajulu Varadarajan <_govind@gmx.com> |
| 4079 | M: Parvi Kaustubhi <pkaustub@cisco.com> | ||
| 4080 | S: Supported | 4079 | S: Supported |
| 4081 | F: drivers/net/ethernet/cisco/enic/ | 4080 | F: drivers/net/ethernet/cisco/enic/ |
| 4082 | 4081 | ||
| @@ -4575,7 +4574,7 @@ F: drivers/infiniband/hw/cxgb4/ · 492 unmodified lines | |||
| 4575 | F: include/uapi/rdma/cxgb4-abi.h | 4574 | F: include/uapi/rdma/cxgb4-abi.h |
| 4576 | 4575 | ||
| 4577 | CXGB4VF ETHERNET DRIVER (CXGB4VF) | 4576 | CXGB4VF ETHERNET DRIVER (CXGB4VF) |
| 4578 | M: Casey Leedom <leedom@chelsio.com> | 4577 | M: Vishal Kulkarni <vishal@gmail.com> |
| 4579 | L: netdev@vger.kernel.org | 4578 | L: netdev@vger.kernel.org |
| 4580 | W: http://www.chelsio.com | 4579 | W: http://www.chelsio.com |
| 4581 | S: Supported | 4580 | S: Supported |
| @@ -6201,7 +6200,6 @@ S: Supported · 1619 unmodified lines | |||
| 6201 | F: drivers/scsi/be2iscsi/ | 6200 | F: drivers/scsi/be2iscsi/ |
| 6202 | 6201 | ||
| 6203 | Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER (be2net) | 6202 | Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER (be2net) |
| 6204 | M: Sathya Perla <sathya.perla@broadcom.com> | ||
| 6205 | M: Ajit Khaparde <ajit.khaparde@broadcom.com> | 6203 | M: Ajit Khaparde <ajit.khaparde@broadcom.com> |
| 6206 | M: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com> | 6204 | M: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com> |
| 6207 | M: Somnath Kotur <somnath.kotur@broadcom.com> | 6205 | M: Somnath Kotur <somnath.kotur@broadcom.com> |
| @@ -11132,7 +11130,7 @@ M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> · 4924 unmodified lines | |||
| 11132 | L: linux-mips@vger.kernel.org | 11130 | L: linux-mips@vger.kernel.org |
| 11133 | W: http://www.linux-mips.org/ | 11131 | W: http://www.linux-mips.org/ |
| 11134 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git | 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 | S: Maintained | 11134 | S: Maintained |
| 11137 | F: Documentation/devicetree/bindings/mips/ | 11135 | F: Documentation/devicetree/bindings/mips/ |
| 11138 | F: Documentation/mips/ | 11136 | F: Documentation/mips/ |
| @@ -2,7 +2,7 @@ · 1 unmodified line | |||
| 2 | VERSION = 5 | 2 | VERSION = 5 |
| 3 | PATCHLEVEL = 6 | 3 | PATCHLEVEL = 6 |
| 4 | SUBLEVEL = 0 | 4 | SUBLEVEL = 0 |
| 5 | EXTRAVERSION = -rc5 | 5 | EXTRAVERSION = -rc7 |
| 6 | NAME = Kleptomaniac Octopus | 6 | NAME = Kleptomaniac Octopus |
| 7 | 7 | ||
| 8 | # *DOCUMENTATION* | 8 | # *DOCUMENTATION* |
| @@ -1804,7 +1804,7 @@ existing-targets := $(wildcard $(sort $(targets))) · 1795 unmodified lines | |||
| 1804 | 1804 | ||
| 1805 | -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) | 1805 | -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) |
| 1806 | 1806 | ||
| 1807 | endif # config-targets | 1807 | endif # config-build |
| 1808 | endif # mixed-build | 1808 | endif # mixed-build |
| 1809 | endif # need-sub-make | 1809 | endif # need-sub-make |
| 1810 | 1810 | ||
| @@ -154,7 +154,7 @@ config ARC_CPU_HS · 153 unmodified lines | |||
| 154 | help | 154 | help |
| 155 | Support for ARC HS38x Cores based on ARCv2 ISA | 155 | Support for ARC HS38x Cores based on ARCv2 ISA |
| 156 | The notable features are: | 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 | - Optional L2 Cache and IO-Coherency | 158 | - Optional L2 Cache and IO-Coherency |
| 159 | - Revised Interrupt Architecture (multiple priorites, reg banks, | 159 | - Revised Interrupt Architecture (multiple priorites, reg banks, |
| 160 | auto stack switch, auto regfile save/restore) | 160 | auto stack switch, auto regfile save/restore) |
| @@ -192,7 +192,7 @@ config ARC_SMP_HALT_ON_RESET · 31 unmodified lines | |||
| 192 | help | 192 | help |
| 193 | In SMP configuration cores can be configured as Halt-on-reset | 193 | In SMP configuration cores can be configured as Halt-on-reset |
| 194 | or they could all start at same time. For Halt-on-reset, non | 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 | at designated entry point. For other case, all jump to common | 196 | at designated entry point. For other case, all jump to common |
| 197 | entry point and spin wait for Master's signal. | 197 | entry point and spin wait for Master's signal. |
| 198 | 198 | ||
| @@ -21,8 +21,6 @@ CONFIG_MODULES=y · 20 unmodified lines | |||
| 21 | CONFIG_MODULE_FORCE_LOAD=y | 21 | CONFIG_MODULE_FORCE_LOAD=y |
| 22 | CONFIG_MODULE_UNLOAD=y | 22 | CONFIG_MODULE_UNLOAD=y |
| 23 | # CONFIG_BLK_DEV_BSG is not set | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 25 | # CONFIG_IOSCHED_CFQ is not set | ||
| 26 | CONFIG_ARC_PLAT_EZNPS=y | 24 | CONFIG_ARC_PLAT_EZNPS=y |
| 27 | CONFIG_SMP=y | 25 | CONFIG_SMP=y |
| 28 | CONFIG_NR_CPUS=4096 | 26 | CONFIG_NR_CPUS=4096 |
| @@ -20,8 +20,6 @@ CONFIG_ISA_ARCOMPACT=y · 19 unmodified lines | |||
| 20 | CONFIG_KPROBES=y | 20 | CONFIG_KPROBES=y |
| 21 | CONFIG_MODULES=y | 21 | CONFIG_MODULES=y |
| 22 | # CONFIG_BLK_DEV_BSG is not set | 22 | # CONFIG_BLK_DEV_BSG is not set |
| 23 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 24 | # CONFIG_IOSCHED_CFQ is not set | ||
| 25 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci" | 23 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci" |
| 26 | # CONFIG_COMPACTION is not set | 24 | # CONFIG_COMPACTION is not set |
| 27 | CONFIG_NET=y | 25 | CONFIG_NET=y |
| @@ -19,8 +19,6 @@ CONFIG_PERF_EVENTS=y · 18 unmodified lines | |||
| 19 | CONFIG_KPROBES=y | 19 | CONFIG_KPROBES=y |
| 20 | CONFIG_MODULES=y | 20 | CONFIG_MODULES=y |
| 21 | # CONFIG_BLK_DEV_BSG is not set | 21 | # CONFIG_BLK_DEV_BSG is not set |
| 22 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 23 | # CONFIG_IOSCHED_CFQ is not set | ||
| 24 | CONFIG_ISA_ARCV2=y | 22 | CONFIG_ISA_ARCV2=y |
| 25 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs" | 23 | CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs" |
| 26 | # CONFIG_COMPACTION is not set | 24 | # CONFIG_COMPACTION is not set |
| @@ -14,8 +14,6 @@ CONFIG_PERF_EVENTS=y · 13 unmodified lines | |||
| 14 | CONFIG_KPROBES=y | 14 | CONFIG_KPROBES=y |
| 15 | CONFIG_MODULES=y | 15 | CONFIG_MODULES=y |
| 16 | # CONFIG_BLK_DEV_BSG is not set | 16 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 18 | # CONFIG_IOSCHED_CFQ is not set | ||
| 19 | CONFIG_ISA_ARCV2=y | 17 | CONFIG_ISA_ARCV2=y |
| 20 | CONFIG_SMP=y | 18 | CONFIG_SMP=y |
| 21 | # CONFIG_ARC_TIMERS_64BIT is not set | 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 | #endif /* !CONFIG_ISA_ARCOMPACT */ | 44 | #endif /* !CONFIG_ISA_ARCOMPACT */ |
| 45 | 45 | ||
| 46 | struct task_struct; | ||
| 47 | |||
| 46 | extern void fpu_save_restore(struct task_struct *p, struct task_struct *n); | 48 | extern void fpu_save_restore(struct task_struct *p, struct task_struct *n); |
| 47 | 49 | ||
| 48 | #else /* !CONFIG_ARC_FPU_SAVE_RESTORE */ | 50 | #else /* !CONFIG_ARC_FPU_SAVE_RESTORE */ |
| @@ -29,6 +29,8 @@ · 28 unmodified lines | |||
| 29 | .endm | 29 | .endm |
| 30 | 30 | ||
| 31 | #define ASM_NL ` /* use '`' to mark new line in macro */ | 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 | /* annotation for data we want in DCCM - if enabled in .config */ | 35 | /* annotation for data we want in DCCM - if enabled in .config */ |
| 34 | .macro ARCFP_DATA nm | 36 | .macro ARCFP_DATA nm |
| @@ -8,11 +8,11 @@ · 7 unmodified lines | |||
| 8 | #include <linux/delay.h> | 8 | #include <linux/delay.h> |
| 9 | #include <linux/root_dev.h> | 9 | #include <linux/root_dev.h> |
| 10 | #include <linux/clk.h> | 10 | #include <linux/clk.h> |
| 11 | #include <linux/clk-provider.h> | ||
| 12 | #include <linux/clocksource.h> | 11 | #include <linux/clocksource.h> |
| 13 | #include <linux/console.h> | 12 | #include <linux/console.h> |
| 14 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 15 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
| 15 | #include <linux/of_clk.h> | ||
| 16 | #include <linux/of_fdt.h> | 16 | #include <linux/of_fdt.h> |
| 17 | #include <linux/of.h> | 17 | #include <linux/of.h> |
| 18 | #include <linux/cache.h> | 18 | #include <linux/cache.h> |
| @@ -104,8 +104,7 @@ static void show_faulting_vma(unsigned long address) · 103 unmodified lines | |||
| 104 | if (IS_ERR(nm)) | 104 | if (IS_ERR(nm)) |
| 105 | nm = "?"; | 105 | nm = "?"; |
| 106 | } | 106 | } |
| 107 | pr_info(" @off 0x%lx in [%s]\n" | 107 | pr_info(" @off 0x%lx in [%s] VMA: 0x%08lx to 0x%08lx\n", |
| 108 | " VMA: 0x%08lx to 0x%08lx\n", | ||
| 109 | vma->vm_start < TASK_UNMAPPED_BASE ? | 108 | vma->vm_start < TASK_UNMAPPED_BASE ? |
| 110 | address : address - vma->vm_start, | 109 | address : address - vma->vm_start, |
| 111 | nm, vma->vm_start, vma->vm_end); | 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 | unsigned int vec, cause_code; | 119 | unsigned int vec, cause_code; |
| 121 | unsigned long address; | 120 | unsigned long address; |
| 122 | 121 | ||
| 123 | pr_info("\n[ECR ]: 0x%08lx => ", regs->event); | ||
| 124 | |||
| 125 | /* For Data fault, this is data address not instruction addr */ | 122 | /* For Data fault, this is data address not instruction addr */ |
| 126 | address = current->thread.fault_address; | 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 | /* For DTLB Miss or ProtV, display the memory involved too */ | 128 | /* For DTLB Miss or ProtV, display the memory involved too */ |
| 132 | if (vec == ECR_V_DTLB_MISS) { | 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 | (cause_code == 0x01) ? "Read" : | 131 | (cause_code == 0x01) ? "Read" : |
| 135 | ((cause_code == 0x02) ? "Write" : "EX"), | 132 | ((cause_code == 0x02) ? "Write" : "EX"), |
| 136 | address, regs->ret); | 133 | address, (void *)regs->ret); |
| 137 | } else if (vec == ECR_V_ITLB_MISS) { | 134 | } else if (vec == ECR_V_ITLB_MISS) { |
| 138 | pr_cont("Insn could not be fetched\n"); | 135 | pr_cont("Insn could not be fetched\n"); |
| 139 | } else if (vec == ECR_V_MACH_CHK) { | 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 | show_ecr_verbose(regs); | 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 | if (user_mode(regs)) | 191 | if (user_mode(regs)) |
| 199 | show_faulting_vma(regs->ret); /* faulting code, not data */ | 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 | #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" | 199 | #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" |
| 204 | 200 | ||
| 205 | #ifdef CONFIG_ISA_ARCOMPACT | 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 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", | 203 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", |
| 208 | STS_BIT(regs, DE), STS_BIT(regs, AE), | 204 | STS_BIT(regs, DE), STS_BIT(regs, AE), |
| 209 | STS_BIT(regs, A2), STS_BIT(regs, A1), | 205 | STS_BIT(regs, A2), STS_BIT(regs, A1), |
| 210 | STS_BIT(regs, E2), STS_BIT(regs, E1)); | 206 | STS_BIT(regs, E2), STS_BIT(regs, E1)); |
| 211 | #else | 207 | #else |
| 212 | pr_cont(" : %2s%2s%2s%2s\n", | 208 | pr_cont(" [%2s%2s%2s%2s]", |
| 213 | STS_BIT(regs, IE), | 209 | STS_BIT(regs, IE), |
| 214 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", | 210 | (regs->status32 & STATUS_U_MASK) ? "U " : "K ", |
| 215 | STS_BIT(regs, DE), STS_BIT(regs, AE)); | 211 | STS_BIT(regs, DE), STS_BIT(regs, AE)); |
| 216 | #endif | 212 | #endif |
| 217 | pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", | 213 | pr_cont(" BTA: 0x%08lx\n", regs->bta); |
| 218 | regs->bta, regs->sp, regs->fp); | 214 | pr_info("BLK: %pS\n SP: 0x%08lx FP: 0x%08lx\n", |
| 215 | (void *)regs->blink, regs->sp, regs->fp); | ||
| 219 | pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", | 216 | pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", |
| 220 | regs->lp_start, regs->lp_end, regs->lp_count); | 217 | regs->lp_start, regs->lp_end, regs->lp_count); |
| 221 | 218 | ||
| @@ -307,13 +307,15 @@ endif · 306 unmodified lines | |||
| 307 | ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y) | 307 | ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y) |
| 308 | prepare: stack_protector_prepare | 308 | prepare: stack_protector_prepare |
| 309 | stack_protector_prepare: prepare0 | 309 | stack_protector_prepare: prepare0 |
| 310 | $(eval KBUILD_CFLAGS += \ | 310 | $(eval SSP_PLUGIN_CFLAGS := \ |
| 311 | -fplugin-arg-arm_ssp_per_task_plugin-tso=$(shell \ | 311 | -fplugin-arg-arm_ssp_per_task_plugin-tso=$(shell \ |
| 312 | awk '{if ($$2 == "THREAD_SZ_ORDER") print $$3;}'\ | 312 | awk '{if ($$2 == "THREAD_SZ_ORDER") print $$3;}'\ |
| 313 | include/generated/asm-offsets.h) \ | 313 | include/generated/asm-offsets.h) \ |
| 314 | -fplugin-arg-arm_ssp_per_task_plugin-offset=$(shell \ | 314 | -fplugin-arg-arm_ssp_per_task_plugin-offset=$(shell \ |
| 315 | awk '{if ($$2 == "TI_STACK_CANARY") print $$3;}'\ | 315 | awk '{if ($$2 == "TI_STACK_CANARY") print $$3;}'\ |
| 316 | include/generated/asm-offsets.h)) | 316 | include/generated/asm-offsets.h)) |
| 317 | $(eval KBUILD_CFLAGS += $(SSP_PLUGIN_CFLAGS)) | ||
| 318 | $(eval GCC_PLUGINS_CFLAGS += $(SSP_PLUGIN_CFLAGS)) | ||
| 317 | endif | 319 | endif |
| 318 | 320 | ||
| 319 | all: $(notdir $(KBUILD_IMAGE)) | 321 | all: $(notdir $(KBUILD_IMAGE)) |
| @@ -101,7 +101,6 @@ clean-files += piggy_data lib1funcs.S ashldi3.S bswapsdi2.S \ · 100 unmodified lines | |||
| 101 | $(libfdt) $(libfdt_hdrs) hyp-stub.S | 101 | $(libfdt) $(libfdt_hdrs) hyp-stub.S |
| 102 | 102 | ||
| 103 | KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING | 103 | KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING |
| 104 | KBUILD_CFLAGS += $(DISABLE_ARM_SSP_PER_TASK_PLUGIN) | ||
| 105 | 104 | ||
| 106 | ifeq ($(CONFIG_FUNCTION_TRACER),y) | 105 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| 107 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 106 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| @@ -117,7 +116,8 @@ CFLAGS_fdt_ro.o := $(nossp-flags-y) · 9 unmodified lines | |||
| 117 | CFLAGS_fdt_rw.o := $(nossp-flags-y) | 116 | CFLAGS_fdt_rw.o := $(nossp-flags-y) |
| 118 | CFLAGS_fdt_wip.o := $(nossp-flags-y) | 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 | asflags-y := -DZIMAGE | 121 | asflags-y := -DZIMAGE |
| 122 | 122 | ||
| 123 | # Supply kernel BSS size to the decompressor via a linker symbol. | 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 | * this. | 94 | * this. |
| 95 | */ | 95 | */ |
| 96 | np = of_find_compatible_node(NULL, NULL, "arm,armv7-timer"); | 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 | if (!np) | 99 | if (!np) |
| 98 | goto out_put; | 100 | goto out_put; |
| 99 | 101 | ||
| @@ -118,7 +118,7 @@ ENTRY(arm_copy_from_user) · 117 unmodified lines | |||
| 118 | 118 | ||
| 119 | ENDPROC(arm_copy_from_user) | 119 | ENDPROC(arm_copy_from_user) |
| 120 | 120 | ||
| 121 | .pushsection .fixup,"ax" | 121 | .pushsection .text.fixup,"ax" |
| 122 | .align 0 | 122 | .align 0 |
| 123 | copy_abort_preamble | 123 | copy_abort_preamble |
| 124 | ldmfd sp!, {r1, r2, r3} | 124 | ldmfd sp!, {r1, r2, r3} |
| @@ -20,6 +20,8 @@ · 19 unmodified lines | |||
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | &fman0 { | 22 | &fman0 { |
| 23 | fsl,erratum-a050385; | ||
| 24 | |||
| 23 | /* these aliases provide the FMan ports mapping */ | 25 | /* these aliases provide the FMan ports mapping */ |
| 24 | enet0: ethernet@e0000 { | 26 | enet0: ethernet@e0000 { |
| 25 | }; | 27 | }; |
| @@ -29,11 +29,9 @@ typedef struct { · 28 unmodified lines | |||
| 29 | */ | 29 | */ |
| 30 | #define ASID(mm) ((mm)->context.id.counter & 0xffff) | 30 | #define ASID(mm) ((mm)->context.id.counter & 0xffff) |
| 31 | 31 | ||
| 32 | extern bool arm64_use_ng_mappings; | ||
| 33 | |||
| 34 | static inline bool arm64_kernel_unmapped_at_el0(void) | 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 | typedef void (*bp_hardening_cb_t)(void); | 37 | typedef void (*bp_hardening_cb_t)(void); |
| @@ -23,11 +23,13 @@ · 22 unmodified lines | |||
| 23 | 23 | ||
| 24 | #include <asm/pgtable-types.h> | 24 | #include <asm/pgtable-types.h> |
| 25 | 25 | ||
| 26 | extern bool arm64_use_ng_mappings; | ||
| 27 | |||
| 26 | #define _PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED) | 28 | #define _PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED) |
| 27 | #define _PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S) | 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) | 31 | #define PTE_MAYBE_NG (arm64_use_ng_mappings ? PTE_NG : 0) |
| 30 | #define PMD_MAYBE_NG (arm64_kernel_unmapped_at_el0() ? PMD_SECT_NG : 0) | 32 | #define PMD_MAYBE_NG (arm64_use_ng_mappings ? PMD_SECT_NG : 0) |
| 31 | 33 | ||
| 32 | #define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG) | 34 | #define PROT_DEFAULT (_PROT_DEFAULT | PTE_MAYBE_NG) |
| 33 | #define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG) | 35 | #define PROT_SECT_DEFAULT (_PROT_SECT_DEFAULT | PMD_MAYBE_NG) |
| @@ -25,8 +25,8 @@ · 24 unmodified lines | |||
| 25 | #define __NR_compat_gettimeofday 78 | 25 | #define __NR_compat_gettimeofday 78 |
| 26 | #define __NR_compat_sigreturn 119 | 26 | #define __NR_compat_sigreturn 119 |
| 27 | #define __NR_compat_rt_sigreturn 173 | 27 | #define __NR_compat_rt_sigreturn 173 |
| 28 | #define __NR_compat_clock_getres 247 | ||
| 29 | #define __NR_compat_clock_gettime 263 | 28 | #define __NR_compat_clock_gettime 263 |
| 29 | #define __NR_compat_clock_getres 264 | ||
| 30 | #define __NR_compat_clock_gettime64 403 | 30 | #define __NR_compat_clock_gettime64 403 |
| 31 | #define __NR_compat_clock_getres_time64 406 | 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 | #endif | 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 | void smp_send_stop(void) | 972 | void smp_send_stop(void) |
| 962 | { | 973 | { |
| 963 | unsigned long timeout; | 974 | unsigned long timeout; |
| 964 | 975 | ||
| 965 | if (num_online_cpus() > 1) { | 976 | if (num_other_online_cpus()) { |
| 966 | cpumask_t mask; | 977 | cpumask_t mask; |
| 967 | 978 | ||
| 968 | cpumask_copy(&mask, cpu_online_mask); | 979 | cpumask_copy(&mask, cpu_online_mask); |
| @@ -975,10 +986,10 @@ void smp_send_stop(void) · 6 unmodified lines | |||
| 975 | 986 | ||
| 976 | /* Wait up to one second for other CPUs to stop */ | 987 | /* Wait up to one second for other CPUs to stop */ |
| 977 | timeout = USEC_PER_SEC; | 988 | timeout = USEC_PER_SEC; |
| 978 | while (num_online_cpus() > 1 && timeout--) | 989 | while (num_other_online_cpus() && timeout--) |
| 979 | udelay(1); | 990 | udelay(1); |
| 980 | 991 | ||
| 981 | if (num_online_cpus() > 1) | 992 | if (num_other_online_cpus()) |
| 982 | pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", | 993 | pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", |
| 983 | cpumask_pr_args(cpu_online_mask)); | 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 | cpus_stopped = 1; | 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 | sdei_mask_local_cpu(); | 1020 | sdei_mask_local_cpu(); |
| 1006 | return; | 1021 | return; |
| 1007 | } | 1022 | } |
| @@ -1009,7 +1024,7 @@ void crash_smp_send_stop(void) · 1 unmodified line | |||
| 1009 | cpumask_copy(&mask, cpu_online_mask); | 1024 | cpumask_copy(&mask, cpu_online_mask); |
| 1010 | cpumask_clear_cpu(smp_processor_id(), &mask); | 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 | pr_crit("SMP: stopping secondary CPUs\n"); | 1029 | pr_crit("SMP: stopping secondary CPUs\n"); |
| 1015 | smp_cross_call(&mask, IPI_CPU_CRASH_STOP); | 1030 | smp_cross_call(&mask, IPI_CPU_CRASH_STOP); |
| @@ -4,6 +4,8 @@ · 3 unmodified lines | |||
| 4 | #include "jz4780.dtsi" | 4 | #include "jz4780.dtsi" |
| 5 | #include <dt-bindings/clock/ingenic,tcu.h> | 5 | #include <dt-bindings/clock/ingenic,tcu.h> |
| 6 | #include <dt-bindings/gpio/gpio.h> | 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 | compatible = "img,ci20", "ingenic,jz4780"; | 11 | compatible = "img,ci20", "ingenic,jz4780"; |
| @@ -163,63 +165,71 @@ · 153 unmodified lines | |||
| 163 | 165 | ||
| 164 | regulators { | 166 | regulators { |
| 165 | vddcore: SUDCDC1 { | 167 | vddcore: SUDCDC1 { |
| 166 | regulator-name = "VDDCORE"; | 168 | regulator-name = "DCDC_REG1"; |
| 167 | regulator-min-microvolt = <1100000>; | 169 | regulator-min-microvolt = <1100000>; |
| 168 | regulator-max-microvolt = <1100000>; | 170 | regulator-max-microvolt = <1100000>; |
| 169 | regulator-always-on; | 171 | regulator-always-on; |
| 170 | }; | 172 | }; |
| 171 | vddmem: SUDCDC2 { | 173 | vddmem: SUDCDC2 { |
| 172 | regulator-name = "VDDMEM"; | 174 | regulator-name = "DCDC_REG2"; |
| 173 | regulator-min-microvolt = <1500000>; | 175 | regulator-min-microvolt = <1500000>; |
| 174 | regulator-max-microvolt = <1500000>; | 176 | regulator-max-microvolt = <1500000>; |
| 175 | regulator-always-on; | 177 | regulator-always-on; |
| 176 | }; | 178 | }; |
| 177 | vcc_33: SUDCDC3 { | 179 | vcc_33: SUDCDC3 { |
| 178 | regulator-name = "VCC33"; | 180 | regulator-name = "DCDC_REG3"; |
| 179 | regulator-min-microvolt = <3300000>; | 181 | regulator-min-microvolt = <3300000>; |
| 180 | regulator-max-microvolt = <3300000>; | 182 | regulator-max-microvolt = <3300000>; |
| 181 | regulator-always-on; | 183 | regulator-always-on; |
| 182 | }; | 184 | }; |
| 183 | vcc_50: SUDCDC4 { | 185 | vcc_50: SUDCDC4 { |
| 184 | regulator-name = "VCC50"; | 186 | regulator-name = "SUDCDC_REG4"; |
| 185 | regulator-min-microvolt = <5000000>; | 187 | regulator-min-microvolt = <5000000>; |
| 186 | regulator-max-microvolt = <5000000>; | 188 | regulator-max-microvolt = <5000000>; |
| 187 | regulator-always-on; | 189 | regulator-always-on; |
| 188 | }; | 190 | }; |
| 189 | vcc_25: LDO_REG5 { | 191 | vcc_25: LDO_REG5 { |
| 190 | regulator-name = "VCC25"; | 192 | regulator-name = "LDO_REG5"; |
| 191 | regulator-min-microvolt = <2500000>; | 193 | regulator-min-microvolt = <2500000>; |
| 192 | regulator-max-microvolt = <2500000>; | 194 | regulator-max-microvolt = <2500000>; |
| 193 | regulator-always-on; | 195 | regulator-always-on; |
| 194 | }; | 196 | }; |
| 195 | wifi_io: LDO_REG6 { | 197 | wifi_io: LDO_REG6 { |
| 196 | regulator-name = "WIFIIO"; | 198 | regulator-name = "LDO_REG6"; |
| 197 | regulator-min-microvolt = <2500000>; | 199 | regulator-min-microvolt = <2500000>; |
| 198 | regulator-max-microvolt = <2500000>; | 200 | regulator-max-microvolt = <2500000>; |
| 199 | regulator-always-on; | 201 | regulator-always-on; |
| 200 | }; | 202 | }; |
| 201 | vcc_28: LDO_REG7 { | 203 | vcc_28: LDO_REG7 { |
| 202 | regulator-name = "VCC28"; | 204 | regulator-name = "LDO_REG7"; |
| 203 | regulator-min-microvolt = <2800000>; | 205 | regulator-min-microvolt = <2800000>; |
| 204 | regulator-max-microvolt = <2800000>; | 206 | regulator-max-microvolt = <2800000>; |
| 205 | regulator-always-on; | 207 | regulator-always-on; |
| 206 | }; | 208 | }; |
| 207 | vcc_15: LDO_REG8 { | 209 | vcc_15: LDO_REG8 { |
| 208 | regulator-name = "VCC15"; | 210 | regulator-name = "LDO_REG8"; |
| 209 | regulator-min-microvolt = <1500000>; | 211 | regulator-min-microvolt = <1500000>; |
| 210 | regulator-max-microvolt = <1500000>; | 212 | regulator-max-microvolt = <1500000>; |
| 211 | regulator-always-on; | 213 | regulator-always-on; |
| 212 | }; | 214 | }; |
| 213 | vcc_18: LDO_REG9 { | 215 | vrtc_18: LDO_REG9 { |
| 214 | regulator-name = "VCC18"; | 216 | regulator-name = "LDO_REG9"; |
| 215 | regulator-min-microvolt = <1800000>; | 217 | /* Despite the datasheet stating 3.3V |
| 216 | regulator-max-microvolt = <1800000>; | 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 | regulator-always-on; | 227 | regulator-always-on; |
| 218 | }; | 228 | }; |
| 219 | vcc_11: LDO_REG10 { | 229 | vcc_11: LDO_REG10 { |
| 220 | regulator-name = "VCC11"; | 230 | regulator-name = "LDO_REG10"; |
| 221 | regulator-min-microvolt = <1100000>; | 231 | regulator-min-microvolt = <1200000>; |
| 222 | regulator-max-microvolt = <1100000>; | 232 | regulator-max-microvolt = <1200000>; |
| 223 | regulator-always-on; | 233 | regulator-always-on; |
| 224 | }; | 234 | }; |
| 225 | }; | 235 | }; |
| @@ -261,7 +271,9 @@ · 35 unmodified lines | |||
| 261 | rtc@51 { | 271 | rtc@51 { |
| 262 | compatible = "nxp,pcf8563"; | 272 | compatible = "nxp,pcf8563"; |
| 263 | reg = <0x51>; | 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 | * If we're configured to take boot arguments from DT, look for those | 605 | * If we're configured to take boot arguments from DT, look for those |
| 606 | * now. | 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 | of_scan_flat_dt(bootcmdline_scan_chosen, &dt_bootargs); | 610 | of_scan_flat_dt(bootcmdline_scan_chosen, &dt_bootargs); |
| 610 | #endif | 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 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); | 1818 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); |
| 1819 | 1819 | ||
| 1820 | kvmppc_mmu_destroy_pr(vcpu); | ||
| 1820 | free_page((unsigned long)vcpu->arch.shared & PAGE_MASK); | 1821 | free_page((unsigned long)vcpu->arch.shared & PAGE_MASK); |
| 1821 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER | 1822 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER |
| 1822 | kfree(vcpu->arch.shadow_vcpu); | 1823 | kfree(vcpu->arch.shadow_vcpu); |
| @@ -759,7 +759,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) · 758 unmodified lines | |||
| 759 | return 0; | 759 | return 0; |
| 760 | 760 | ||
| 761 | out_vcpu_uninit: | 761 | out_vcpu_uninit: |
| 762 | kvmppc_mmu_destroy(vcpu); | ||
| 763 | kvmppc_subarch_vcpu_uninit(vcpu); | 762 | kvmppc_subarch_vcpu_uninit(vcpu); |
| 764 | return err; | 763 | return err; |
| 765 | } | 764 | } |
| @@ -792,7 +791,6 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) · 26 unmodified lines | |||
| 792 | 791 | ||
| 793 | kvmppc_core_vcpu_free(vcpu); | 792 | kvmppc_core_vcpu_free(vcpu); |
| 794 | 793 | ||
| 795 | kvmppc_mmu_destroy(vcpu); | ||
| 796 | kvmppc_subarch_vcpu_uninit(vcpu); | 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 | unsigned long k_cur; | 120 | unsigned long k_cur; |
| 121 | phys_addr_t pa = __pa(kasan_early_shadow_page); | 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 | for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) { | 123 | for (k_cur = k_start & PAGE_MASK; k_cur < k_end; k_cur += PAGE_SIZE) { |
| 130 | pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); | 124 | pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); |
| 131 | pte_t *ptep = pte_offset_kernel(pmd, k_cur); | 125 | pte_t *ptep = pte_offset_kernel(pmd, k_cur); |
| @@ -143,7 +137,8 @@ void __init kasan_mmu_init(void) · 11 unmodified lines | |||
| 143 | int ret; | 137 | int ret; |
| 144 | struct memblock_region *reg; | 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 | ret = kasan_init_shadow_page_tables(KASAN_SHADOW_START, KASAN_SHADOW_END); | 142 | ret = kasan_init_shadow_page_tables(KASAN_SHADOW_START, KASAN_SHADOW_END); |
| 148 | 143 | ||
| 149 | if (ret) | 144 | if (ret) |
| @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) · 3267 unmodified lines | |||
| 3268 | /* Initial reset is a superset of the normal reset */ | 3268 | /* Initial reset is a superset of the normal reset */ |
| 3269 | kvm_arch_vcpu_ioctl_normal_reset(vcpu); | 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 | vcpu->arch.sie_block->gpsw.mask = 0; | 3275 | vcpu->arch.sie_block->gpsw.mask = 0; |
| 3273 | vcpu->arch.sie_block->gpsw.addr = 0; | 3276 | vcpu->arch.sie_block->gpsw.addr = 0; |
| 3274 | kvm_s390_set_prefix(vcpu, 0); | 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 | memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); | 3281 | memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); |
| 3279 | vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; | 3282 | vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; |
| 3280 | vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK; | 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 | vcpu->run->s.regs.fpc = 0; | 3297 | vcpu->run->s.regs.fpc = 0; |
| 3282 | vcpu->arch.sie_block->gbea = 1; | 3298 | vcpu->arch.sie_block->gbea = 1; |
| 3283 | vcpu->arch.sie_block->pp = 0; | 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 | avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1) | 194 | avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1) |
| 195 | sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1) | 195 | sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1) |
| 196 | sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1) | 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_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr) |
| 199 | KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_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 | KBUILD_LDFLAGS := -m elf_$(UTS_MACHINE) | 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 | avx512_supported :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,yes,no) | 11 | avx512_supported :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,yes,no) |
| 12 | sha1_ni_supported :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,yes,no) | 12 | sha1_ni_supported :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,yes,no) |
| 13 | sha256_ni_supported :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,yes,no) | 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 | obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o | 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 | obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o | 41 | obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o |
| 41 | obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o | 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 | # These modules require assembler to support AVX. | 49 | # These modules require assembler to support AVX. |
| 45 | ifeq ($(avx_supported),yes) | 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 | * NB and Last level cache counters (MSRs) are shared across all cores | 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 | 193 | * that share the same NB / Last level cache. On family 16h and below, |
| 194 | * to a single target core, however, event counts generated by processes | 194 | * Interrupts can be directed to a single target core, however, event |
| 195 | * running on other cores cannot be masked out. So we do not support | 195 | * counts generated by processes running on other cores cannot be masked |
| 196 | * sampling and per-thread events. | 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 | hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; | 199 | hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; |
| 203 | hwc->idx = -1; | 200 | hwc->idx = -1; |
| 204 | 201 | ||
| @@ -306,7 +303,7 @@ static struct pmu amd_nb_pmu = { · 101 unmodified lines | |||
| 306 | .start = amd_uncore_start, | 303 | .start = amd_uncore_start, |
| 307 | .stop = amd_uncore_stop, | 304 | .stop = amd_uncore_stop, |
| 308 | .read = amd_uncore_read, | 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 | static struct pmu amd_llc_pmu = { | 309 | static struct pmu amd_llc_pmu = { |
| @@ -317,7 +314,7 @@ static struct pmu amd_llc_pmu = { · 4 unmodified lines | |||
| 317 | .start = amd_uncore_start, | 314 | .start = amd_uncore_start, |
| 318 | .stop = amd_uncore_stop, | 315 | .stop = amd_uncore_stop, |
| 319 | .read = amd_uncore_read, | 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 | static struct amd_uncore *amd_uncore_alloc(unsigned int cpu) | 320 | static struct amd_uncore *amd_uncore_alloc(unsigned int cpu) |
| @@ -360,7 +360,6 @@ struct x86_emulate_ctxt { · 359 unmodified lines | |||
| 360 | u64 d; | 360 | u64 d; |
| 361 | unsigned long _eip; | 361 | unsigned long _eip; |
| 362 | struct operand memop; | 362 | struct operand memop; |
| 363 | /* Fields above regs are cleared together. */ | ||
| 364 | unsigned long _regs[NR_VCPU_REGS]; | 363 | unsigned long _regs[NR_VCPU_REGS]; |
| 365 | struct operand *memopp; | 364 | struct operand *memopp; |
| 366 | struct fetch_cache fetch; | 365 | struct fetch_cache fetch; |
| @@ -838,13 +838,15 @@ static void free_moved_vector(struct apic_chip_data *apicd) · 837 unmodified lines | |||
| 838 | bool managed = apicd->is_managed; | 838 | bool managed = apicd->is_managed; |
| 839 | 839 | ||
| 840 | /* | 840 | /* |
| 841 | * This should never happen. Managed interrupts are not | 841 | * Managed interrupts are usually not migrated away |
| 842 | * migrated except on CPU down, which does not involve the | 842 | * from an online CPU, but CPU isolation 'managed_irq' |
| 843 | * cleanup vector. But try to keep the accounting correct | 843 | * can make that happen. |
| 844 | * nevertheless. | 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 | trace_vector_free_moved(apicd->irq, cpu, vector, managed); | 850 | trace_vector_free_moved(apicd->irq, cpu, vector, managed); |
| 849 | irq_matrix_free(vector_matrix, cpu, vector, managed); | 851 | irq_matrix_free(vector_matrix, cpu, vector, managed); |
| 850 | per_cpu(vector_irq, cpu)[vector] = VECTOR_UNUSED; | 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 | return; | 493 | return; |
| 494 | 494 | ||
| 495 | if ((val & 3UL) == 1UL) { | 495 | if ((val & 3UL) == 1UL) { |
| 496 | /* PPIN available but disabled: */ | 496 | /* PPIN locked in disabled mode */ |
| 497 | return; | 497 | return; |
| 498 | } | 498 | } |
| 499 | 499 | ||
| 500 | /* If PPIN is disabled, but not locked, try to enable: */ | 500 | /* If PPIN is disabled, try to enable */ |
| 501 | if (!(val & 3UL)) { | 501 | if (!(val & 2UL)) { |
| 502 | wrmsrl_safe(MSR_PPIN_CTL, val | 2UL); | 502 | wrmsrl_safe(MSR_PPIN_CTL, val | 2UL); |
| 503 | rdmsrl_safe(MSR_PPIN_CTL, &val); | 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 | set_cpu_cap(c, X86_FEATURE_INTEL_PPIN); | 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 | struct thermal_state *state = &per_cpu(thermal_state, cpu); | 487 | struct thermal_state *state = &per_cpu(thermal_state, cpu); |
| 488 | struct device *dev = get_cpu_device(cpu); | 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); | 495 | cancel_delayed_work_sync(&state->package_throttle.therm_work); |
| 491 | cancel_delayed_work(&state->core_throttle.therm_work); | 496 | cancel_delayed_work_sync(&state->core_throttle.therm_work); |
| 492 | 497 | ||
| 493 | state->package_throttle.rate_control_active = false; | 498 | state->package_throttle.rate_control_active = false; |
| 494 | state->core_throttle.rate_control_active = false; | 499 | state->core_throttle.rate_control_active = false; |
| @@ -68,7 +68,7 @@ config KVM_WERROR · 67 unmodified lines | |||
| 68 | depends on (X86_64 && !KASAN) || !COMPILE_TEST | 68 | depends on (X86_64 && !KASAN) || !COMPILE_TEST |
| 69 | depends on EXPERT | 69 | depends on EXPERT |
| 70 | help | 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 | If in doubt, say "N". | 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 | ctxt->fetch.ptr = ctxt->fetch.data; | 5173 | ctxt->fetch.ptr = ctxt->fetch.data; |
| 5174 | ctxt->fetch.end = ctxt->fetch.data + insn_len; | 5174 | ctxt->fetch.end = ctxt->fetch.data + insn_len; |
| 5175 | ctxt->opcode_len = 1; | 5175 | ctxt->opcode_len = 1; |
| 5176 | ctxt->intercept = x86_intercept_none; | ||
| 5176 | if (insn_len > 0) | 5177 | if (insn_len > 0) |
| 5177 | memcpy(ctxt->fetch.data, insn, insn_len); | 5178 | memcpy(ctxt->fetch.data, insn, insn_len); |
| 5178 | else { | 5179 | else { |
| @@ -378,12 +378,15 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) · 377 unmodified lines | |||
| 378 | if (e->fields.delivery_mode == APIC_DM_FIXED) { | 378 | if (e->fields.delivery_mode == APIC_DM_FIXED) { |
| 379 | struct kvm_lapic_irq irq; | 379 | struct kvm_lapic_irq irq; |
| 380 | 380 | ||
| 381 | irq.shorthand = APIC_DEST_NOSHORT; | ||
| 382 | irq.vector = e->fields.vector; | 381 | irq.vector = e->fields.vector; |
| 383 | irq.delivery_mode = e->fields.delivery_mode << 8; | 382 | irq.delivery_mode = e->fields.delivery_mode << 8; |
| 384 | irq.dest_id = e->fields.dest_id; | ||
| 385 | irq.dest_mode = | 383 | irq.dest_mode = |
| 386 | kvm_lapic_irq_dest_mode(!!e->fields.dest_mode); | 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 | bitmap_zero(&vcpu_bitmap, 16); | 390 | bitmap_zero(&vcpu_bitmap, 16); |
| 388 | kvm_bitmap_or_dest_vcpus(ioapic->kvm, &irq, | 391 | kvm_bitmap_or_dest_vcpus(ioapic->kvm, &irq, |
| 389 | &vcpu_bitmap); | 392 | &vcpu_bitmap); |
| @@ -6312,7 +6312,8 @@ static void svm_handle_exit_irqoff(struct kvm_vcpu *vcpu, · 6311 unmodified lines | |||
| 6312 | enum exit_fastpath_completion *exit_fastpath) | 6312 | enum exit_fastpath_completion *exit_fastpath) |
| 6313 | { | 6313 | { |
| 6314 | if (!is_guest_mode(vcpu) && | 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 | *exit_fastpath = handle_fastpath_set_msr_irqoff(vcpu); | 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 | return; | 224 | return; |
| 225 | 225 | ||
| 226 | kvm_vcpu_unmap(vcpu, &vmx->nested.hv_evmcs_map, true); | 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 | vmx->nested.hv_evmcs = NULL; | 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 | if (!nested_enlightened_vmentry(vcpu, &evmcs_gpa)) | 1923 | if (!nested_enlightened_vmentry(vcpu, &evmcs_gpa)) |
| 1924 | return 1; | 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 | if (!vmx->nested.hv_evmcs) | 1928 | if (!vmx->nested.hv_evmcs) |
| 1928 | vmx->nested.current_vmptr = -1ull; | 1929 | vmx->nested.current_vmptr = -1ull; |
| 1929 | 1930 | ||
| @@ -2338,6 +2338,17 @@ static void hardware_disable(void) · 2337 unmodified lines | |||
| 2338 | kvm_cpu_vmxoff(); | 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 | static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, | 2352 | static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, |
| 2342 | u32 msr, u32 *result) | 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 | SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | | 2429 | SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | |
| 2419 | SECONDARY_EXEC_PT_USE_GPA | | 2430 | SECONDARY_EXEC_PT_USE_GPA | |
| 2420 | SECONDARY_EXEC_PT_CONCEAL_VMX | | 2431 | SECONDARY_EXEC_PT_CONCEAL_VMX | |
| 2421 | SECONDARY_EXEC_ENABLE_VMFUNC | | 2432 | SECONDARY_EXEC_ENABLE_VMFUNC; |
| 2422 | SECONDARY_EXEC_ENCLS_EXITING; | 2433 | if (cpu_has_sgx()) |
| 2434 | opt2 |= SECONDARY_EXEC_ENCLS_EXITING; | ||
| 2423 | if (adjust_vmx_controls(min2, opt2, | 2435 | if (adjust_vmx_controls(min2, opt2, |
| 2424 | MSR_IA32_VMX_PROCBASED_CTLS2, | 2436 | MSR_IA32_VMX_PROCBASED_CTLS2, |
| 2425 | &_cpu_based_2nd_exec_control) < 0) | 2437 | &_cpu_based_2nd_exec_control) < 0) |
| @@ -7195,10 +7195,12 @@ static void kvm_timer_init(void) · 7194 unmodified lines | |||
| 7195 | 7195 | ||
| 7196 | cpu = get_cpu(); | 7196 | cpu = get_cpu(); |
| 7197 | policy = cpufreq_cpu_get(cpu); | 7197 | policy = cpufreq_cpu_get(cpu); |
| 7198 | if (policy && policy->cpuinfo.max_freq) | 7198 | if (policy) { |
| 7199 | max_tsc_khz = policy->cpuinfo.max_freq; | 7199 | if (policy->cpuinfo.max_freq) |
| 7200 | max_tsc_khz = policy->cpuinfo.max_freq; | ||
| 7201 | cpufreq_cpu_put(policy); | ||
| 7202 | } | ||
| 7200 | put_cpu(); | 7203 | put_cpu(); |
| 7201 | cpufreq_cpu_put(policy); | ||
| 7202 | #endif | 7204 | #endif |
| 7203 | cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block, | 7205 | cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block, |
| 7204 | CPUFREQ_TRANSITION_NOTIFIER); | 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 | return pmd_k; | 190 | return pmd_k; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | void vmalloc_sync_all(void) | 193 | static void vmalloc_sync(void) |
| 194 | { | 194 | { |
| 195 | unsigned long address; | 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 | * 32-bit: | 231 | * 32-bit: |
| 222 | * | 232 | * |
| @@ -319,11 +329,23 @@ out: · 96 unmodified lines | |||
| 319 | 329 | ||
| 320 | #else /* CONFIG_X86_64: */ | 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 | sync_global_pgds(VMALLOC_START & PGDIR_MASK, VMALLOC_END); | 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 | * 64-bit: | 350 | * 64-bit: |
| 329 | * | 351 | * |
| @@ -106,6 +106,19 @@ static unsigned int __ioremap_check_encrypted(struct resource *res) · 105 unmodified lines | |||
| 106 | return 0; | 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 | static int __ioremap_collect_map_flags(struct resource *res, void *arg) | 122 | static int __ioremap_collect_map_flags(struct resource *res, void *arg) |
| 110 | { | 123 | { |
| 111 | struct ioremap_desc *desc = arg; | 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 | * To avoid multiple resource walks, this function walks resources marked as | 137 | * To avoid multiple resource walks, this function walks resources marked as |
| 125 | * IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a | 138 | * IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a |
| 126 | * resource described not as IORES_DESC_NONE (e.g. IORES_DESC_ACPI_TABLES). | 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 | static void __ioremap_check_mem(resource_size_t addr, unsigned long size, | 144 | static void __ioremap_check_mem(resource_size_t addr, unsigned long size, |
| 129 | struct ioremap_desc *desc) | 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 | memset(desc, 0, sizeof(struct ioremap_desc)); | 151 | memset(desc, 0, sizeof(struct ioremap_desc)); |
| 136 | 152 | ||
| 137 | walk_mem_res(start, end, desc, __ioremap_collect_map_flags); | 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 | return false; | 1318 | return false; |
| 1319 | 1319 | ||
| 1320 | /* is something in flight? */ | 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 | return false; | 1322 | return false; |
| 1323 | 1323 | ||
| 1324 | return true; | 1324 | return true; |
| @@ -398,6 +398,28 @@ void blk_mq_sched_insert_request(struct request *rq, bool at_head, · 397 unmodified lines | |||
| 398 | WARN_ON(e && (rq->tag != -1)); | 398 | WARN_ON(e && (rq->tag != -1)); |
| 399 | 399 | ||
| 400 | if (blk_mq_sched_bypass_insert(hctx, !!e, rq)) { | 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 | blk_mq_request_bypass_insert(rq, at_head, false); | 423 | blk_mq_request_bypass_insert(rq, at_head, false); |
| 402 | goto run; | 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 | EXPORT_SYMBOL_GPL(disk_map_sector_rcu); | 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 | * Can be deleted altogether. Later. | 341 | * Can be deleted altogether. Later. |
| 306 | * | 342 | * |
| @@ -171,7 +171,7 @@ int ghes_estatus_pool_init(int num_ghes) · 170 unmodified lines | |||
| 171 | * New allocation must be visible in all pgd before it can be found by | 171 | * New allocation must be visible in all pgd before it can be found by |
| 172 | * an NMI allocating from the pool. | 172 | * an NMI allocating from the pool. |
| 173 | */ | 173 | */ |
| 174 | vmalloc_sync_all(); | 174 | vmalloc_sync_mappings(); |
| 175 | 175 | ||
| 176 | rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); | 176 | rc = gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); |
| 177 | if (rc) | 177 | if (rc) |
| @@ -439,6 +439,7 @@ static int binderfs_binder_ctl_create(struct super_block *sb) · 438 unmodified lines | |||
| 439 | inode->i_uid = info->root_uid; | 439 | inode->i_uid = info->root_uid; |
| 440 | inode->i_gid = info->root_gid; | 440 | inode->i_gid = info->root_gid; |
| 441 | 441 | ||
| 442 | refcount_set(&device->ref, 1); | ||
| 442 | device->binderfs_inode = inode; | 443 | device->binderfs_inode = inode; |
| 443 | device->miscdev.minor = minor; | 444 | device->miscdev.minor = minor; |
| 444 | 445 | ||
| @@ -91,7 +91,7 @@ · 90 unmodified lines | |||
| 91 | #ifdef GENERAL_DEBUG | 91 | #ifdef GENERAL_DEBUG |
| 92 | #define PRINTK(args...) printk(args) | 92 | #define PRINTK(args...) printk(args) |
| 93 | #else | 93 | #else |
| 94 | #define PRINTK(args...) | 94 | #define PRINTK(args...) do {} while (0) |
| 95 | #endif /* GENERAL_DEBUG */ | 95 | #endif /* GENERAL_DEBUG */ |
| 96 | 96 | ||
| 97 | #ifdef EXTRA_DEBUG | 97 | #ifdef EXTRA_DEBUG |
| @@ -111,7 +111,7 @@ config CFAG12864B · 110 unmodified lines | |||
| 111 | If unsure, say N. | 111 | If unsure, say N. |
| 112 | 112 | ||
| 113 | config CFAG12864B_RATE | 113 | config CFAG12864B_RATE |
| 114 | int "Refresh rate (hertz)" | 114 | int "Refresh rate (hertz)" |
| 115 | depends on CFAG12864B | 115 | depends on CFAG12864B |
| 116 | default "20" | 116 | default "20" |
| 117 | ---help--- | 117 | ---help--- |
| @@ -329,7 +329,7 @@ config PANEL_LCD_PROTO · 211 unmodified lines | |||
| 329 | 329 | ||
| 330 | config PANEL_LCD_PIN_E | 330 | config PANEL_LCD_PIN_E |
| 331 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" | 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 | range -17 17 | 333 | range -17 17 |
| 334 | default 14 | 334 | default 14 |
| 335 | ---help--- | 335 | ---help--- |
| @@ -344,7 +344,7 @@ config PANEL_LCD_PIN_E · 8 unmodified lines | |||
| 344 | 344 | ||
| 345 | config PANEL_LCD_PIN_RS | 345 | config PANEL_LCD_PIN_RS |
| 346 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" | 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 | range -17 17 | 348 | range -17 17 |
| 349 | default 17 | 349 | default 17 |
| 350 | ---help--- | 350 | ---help--- |
| @@ -359,7 +359,7 @@ config PANEL_LCD_PIN_RS · 8 unmodified lines | |||
| 359 | 359 | ||
| 360 | config PANEL_LCD_PIN_RW | 360 | config PANEL_LCD_PIN_RW |
| 361 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0" | 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 | range -17 17 | 363 | range -17 17 |
| 364 | default 16 | 364 | default 16 |
| 365 | ---help--- | 365 | ---help--- |
| @@ -374,7 +374,7 @@ config PANEL_LCD_PIN_RW · 8 unmodified lines | |||
| 374 | 374 | ||
| 375 | config PANEL_LCD_PIN_SCL | 375 | config PANEL_LCD_PIN_SCL |
| 376 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0" | 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 | range -17 17 | 378 | range -17 17 |
| 379 | default 1 | 379 | default 1 |
| 380 | ---help--- | 380 | ---help--- |
| @@ -389,7 +389,7 @@ config PANEL_LCD_PIN_SCL · 8 unmodified lines | |||
| 389 | 389 | ||
| 390 | config PANEL_LCD_PIN_SDA | 390 | config PANEL_LCD_PIN_SDA |
| 391 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0" | 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 | range -17 17 | 393 | range -17 17 |
| 394 | default 2 | 394 | default 2 |
| 395 | ---help--- | 395 | ---help--- |
| @@ -404,12 +404,12 @@ config PANEL_LCD_PIN_SDA · 8 unmodified lines | |||
| 404 | 404 | ||
| 405 | config PANEL_LCD_PIN_BL | 405 | config PANEL_LCD_PIN_BL |
| 406 | depends on PANEL_PROFILE="0" && PANEL_LCD="1" | 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 | range -17 17 | 408 | range -17 17 |
| 409 | default 0 | 409 | default 0 |
| 410 | ---help--- | 410 | ---help--- |
| 411 | This describes the number of the parallel port pin to which the LCD 'BL' signal | 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 | 0 : no connection (eg: connected to ground) | 414 | 0 : no connection (eg: connected to ground) |
| 415 | 1..17 : directly connected to any of these pins on the DB25 plug | 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 | int len; | 86 | int len; |
| 87 | } esc_seq; | 87 | } esc_seq; |
| 88 | 88 | ||
| 89 | unsigned long long drvdata[0]; | 89 | unsigned long long drvdata[]; |
| 90 | }; | 90 | }; |
| 91 | 91 | ||
| 92 | #define charlcd_to_priv(p) container_of(p, struct charlcd_priv, lcd) | 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 | const struct of_device_id *match; | 356 | const struct of_device_id *match; |
| 357 | const struct img_ascii_lcd_config *cfg; | 357 | const struct img_ascii_lcd_config *cfg; |
| 358 | struct img_ascii_lcd_ctx *ctx; | 358 | struct img_ascii_lcd_ctx *ctx; |
| 359 | struct resource *res; | ||
| 360 | int err; | 359 | int err; |
| 361 | 360 | ||
| 362 | match = of_match_device(img_ascii_lcd_matches, &pdev->dev); | 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 | &ctx->offset)) | 377 | &ctx->offset)) |
| 379 | return -EINVAL; | 378 | return -EINVAL; |
| 380 | } else { | 379 | } else { |
| 381 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 380 | ctx->base = devm_platform_ioremap_resource(pdev, 0); |
| 382 | ctx->base = devm_ioremap_resource(&pdev->dev, res); | ||
| 383 | if (IS_ERR(ctx->base)) | 381 | if (IS_ERR(ctx->base)) |
| 384 | return PTR_ERR(ctx->base); | 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 | if (!pdev->dev.coherent_dma_mask) | 364 | if (!pdev->dev.coherent_dma_mask) |
| 365 | pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); | 365 | pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); |
| 366 | if (!pdev->dma_mask) | 366 | if (!pdev->dev.dma_mask) { |
| 367 | pdev->dma_mask = DMA_BIT_MASK(32); | 367 | pdev->platform_dma_mask = DMA_BIT_MASK(32); |
| 368 | if (!pdev->dev.dma_mask) | 368 | pdev->dev.dma_mask = &pdev->platform_dma_mask; |
| 369 | pdev->dev.dma_mask = &pdev->dma_mask; | 369 | } |
| 370 | }; | 370 | }; |
| 371 | 371 | ||
| 372 | /** | 372 | /** |
| @@ -662,20 +662,8 @@ struct platform_device *platform_device_register_full( · 289 unmodified lines | |||
| 662 | pdev->dev.of_node_reused = pdevinfo->of_node_reused; | 662 | pdev->dev.of_node_reused = pdevinfo->of_node_reused; |
| 663 | 663 | ||
| 664 | if (pdevinfo->dma_mask) { | 664 | if (pdevinfo->dma_mask) { |
| 665 | /* | 665 | pdev->platform_dma_mask = pdevinfo->dma_mask; |
| 666 | * This memory isn't freed when the device is put, | 666 | pdev->dev.dma_mask = &pdev->platform_dma_mask; |
| 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; | ||
| 679 | pdev->dev.coherent_dma_mask = pdevinfo->dma_mask; | 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 | if (ret) { | 688 | if (ret) { |
| 701 | err: | 689 | err: |
| 702 | ACPI_COMPANION_SET(&pdev->dev, NULL); | 690 | ACPI_COMPANION_SET(&pdev->dev, NULL); |
| 703 | kfree(pdev->dev.dma_mask); | ||
| 704 | platform_device_put(pdev); | 691 | platform_device_put(pdev); |
| 705 | return ERR_PTR(ret); | 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 | err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num); | 245 | err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num); |
| 246 | if (err) { | 246 | if (err) { |
| 247 | virtqueue_kick(vblk->vqs[qid].vq); | 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 | spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); | 253 | spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); |
| 250 | /* Out of mem doesn't actually happen, since we fall back | 254 | switch (err) { |
| 251 | * to direct descriptors */ | 255 | case -ENOSPC: |
| 252 | if (err == -ENOMEM || err == -ENOSPC) | ||
| 253 | return BLK_STS_DEV_RESOURCE; | 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 | if (bd->last && virtqueue_kick_prepare(vblk->vqs[qid].vq)) | 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 | else | 194 | else |
| 195 | io.slave_addr = slave_addr; | 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 | if (io.irq > 0) | 198 | if (io.irq > 0) |
| 199 | io.irq_setup = ipmi_std_irq_setup; | 199 | io.irq_setup = ipmi_std_irq_setup; |
| 200 | else | 200 | else |
| @@ -378,7 +378,7 @@ static int acpi_ipmi_probe(struct platform_device *pdev) · 177 unmodified lines | |||
| 378 | io.irq = tmp; | 378 | io.irq = tmp; |
| 379 | io.irq_setup = acpi_gpe_irq_setup; | 379 | io.irq_setup = acpi_gpe_irq_setup; |
| 380 | } else { | 380 | } else { |
| 381 | int irq = platform_get_irq(pdev, 0); | 381 | int irq = platform_get_irq_optional(pdev, 0); |
| 382 | 382 | ||
| 383 | if (irq > 0) { | 383 | if (irq > 0) { |
| 384 | io.irq = irq; | 384 | io.irq = irq; |
| @@ -4713,7 +4713,7 @@ EXPORT_SYMBOL(of_clk_get_by_name); · 4712 unmodified lines | |||
| 4713 | * | 4713 | * |
| 4714 | * Returns: The number of clocks that are possible parents of this node | 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 | int count; | 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 | EXPORT_SYMBOL_GPL(of_clk_get_parent_count); | 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 | struct of_phandle_args clkspec; | 4730 | struct of_phandle_args clkspec; |
| 4731 | struct property *prop; | 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 | static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { | 595 | static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { |
| 614 | .halt_reg = 0x4008, | 596 | .halt_reg = 0x4008, |
| 615 | .halt_check = BRANCH_HALT, | 597 | .halt_check = BRANCH_HALT, |
| @@ -687,7 +669,6 @@ static struct clk_regmap *disp_cc_sc7180_clocks[] = { · 71 unmodified lines | |||
| 687 | [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, | 669 | [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, |
| 688 | [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, | 670 | [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, |
| 689 | [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr, | 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 | [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, | 672 | [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, |
| 692 | [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, | 673 | [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, |
| 693 | [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, | 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 | static struct clk_branch video_cc_vcodec0_core_clk = { | 98 | static struct clk_branch video_cc_vcodec0_core_clk = { |
| 99 | .halt_reg = 0x890, | 99 | .halt_reg = 0x890, |
| 100 | .halt_check = BRANCH_HALT, | 100 | .halt_check = BRANCH_HALT_VOTED, |
| 101 | .clkr = { | 101 | .clkr = { |
| 102 | .enable_reg = 0x890, | 102 | .enable_reg = 0x890, |
| 103 | .enable_mask = BIT(0), | 103 | .enable_mask = BIT(0), |
| @@ -83,13 +83,16 @@ static ssize_t · 82 unmodified lines | |||
| 83 | efivar_attr_read(struct efivar_entry *entry, char *buf) | 83 | efivar_attr_read(struct efivar_entry *entry, char *buf) |
| 84 | { | 84 | { |
| 85 | struct efi_variable *var = &entry->var; | 85 | struct efi_variable *var = &entry->var; |
| 86 | unsigned long size = sizeof(var->Data); | ||
| 86 | char *str = buf; | 87 | char *str = buf; |
| 88 | int ret; | ||
| 87 | 89 | ||
| 88 | if (!entry || !buf) | 90 | if (!entry || !buf) |
| 89 | return -EINVAL; | 91 | return -EINVAL; |
| 90 | 92 | ||
| 91 | var->DataSize = 1024; | 93 | ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); |
| 92 | if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | 94 | var->DataSize = size; |
| 95 | if (ret) | ||
| 93 | return -EIO; | 96 | return -EIO; |
| 94 | 97 | ||
| 95 | if (var->Attributes & EFI_VARIABLE_NON_VOLATILE) | 98 | if (var->Attributes & EFI_VARIABLE_NON_VOLATILE) |
| @@ -116,13 +119,16 @@ static ssize_t · 20 unmodified lines | |||
| 116 | efivar_size_read(struct efivar_entry *entry, char *buf) | 119 | efivar_size_read(struct efivar_entry *entry, char *buf) |
| 117 | { | 120 | { |
| 118 | struct efi_variable *var = &entry->var; | 121 | struct efi_variable *var = &entry->var; |
| 122 | unsigned long size = sizeof(var->Data); | ||
| 119 | char *str = buf; | 123 | char *str = buf; |
| 124 | int ret; | ||
| 120 | 125 | ||
| 121 | if (!entry || !buf) | 126 | if (!entry || !buf) |
| 122 | return -EINVAL; | 127 | return -EINVAL; |
| 123 | 128 | ||
| 124 | var->DataSize = 1024; | 129 | ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); |
| 125 | if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | 130 | var->DataSize = size; |
| 131 | if (ret) | ||
| 126 | return -EIO; | 132 | return -EIO; |
| 127 | 133 | ||
| 128 | str += sprintf(str, "0x%lx\n", var->DataSize); | 134 | str += sprintf(str, "0x%lx\n", var->DataSize); |
| @@ -133,12 +139,15 @@ static ssize_t · 4 unmodified lines | |||
| 133 | efivar_data_read(struct efivar_entry *entry, char *buf) | 139 | efivar_data_read(struct efivar_entry *entry, char *buf) |
| 134 | { | 140 | { |
| 135 | struct efi_variable *var = &entry->var; | 141 | struct efi_variable *var = &entry->var; |
| 142 | unsigned long size = sizeof(var->Data); | ||
| 143 | int ret; | ||
| 136 | 144 | ||
| 137 | if (!entry || !buf) | 145 | if (!entry || !buf) |
| 138 | return -EINVAL; | 146 | return -EINVAL; |
| 139 | 147 | ||
| 140 | var->DataSize = 1024; | 148 | ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); |
| 141 | if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) | 149 | var->DataSize = size; |
| 150 | if (ret) | ||
| 142 | return -EIO; | 151 | return -EIO; |
| 143 | 152 | ||
| 144 | memcpy(buf, var->Data, var->DataSize); | 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 | u8 *data; | 208 | u8 *data; |
| 200 | int err; | 209 | int err; |
| 201 | 210 | ||
| 211 | if (!entry || !buf) | ||
| 212 | return -EINVAL; | ||
| 213 | |||
| 202 | if (in_compat_syscall()) { | 214 | if (in_compat_syscall()) { |
| 203 | struct compat_efi_variable *compat; | 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 | struct efi_variable *var = &entry->var; | 263 | struct efi_variable *var = &entry->var; |
| 252 | struct compat_efi_variable *compat; | 264 | struct compat_efi_variable *compat; |
| 265 | unsigned long datasize = sizeof(var->Data); | ||
| 253 | size_t size; | 266 | size_t size; |
| 267 | int ret; | ||
| 254 | 268 | ||
| 255 | if (!entry || !buf) | 269 | if (!entry || !buf) |
| 256 | return 0; | 270 | return 0; |
| 257 | 271 | ||
| 258 | var->DataSize = 1024; | 272 | ret = efivar_entry_get(entry, &var->Attributes, &datasize, var->Data); |
| 259 | if (efivar_entry_get(entry, &entry->var.Attributes, | 273 | var->DataSize = datasize; |
| 260 | &entry->var.DataSize, entry->var.Data)) | 274 | if (ret) |
| 261 | return -EIO; | 275 | return -EIO; |
| 262 | 276 | ||
| 263 | if (in_compat_syscall()) { | 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 | ssize_t result = 0; | 781 | ssize_t result = 0; |
| 782 | uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; | 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 | return -EINVAL; | 785 | return -EINVAL; |
| 786 | 786 | ||
| 787 | /* decode offset */ | 787 | /* decode offset */ |
| 788 | offset = *pos & GENMASK_ULL(11, 0); | 788 | offset = (*pos & GENMASK_ULL(11, 0)) >> 2; |
| 789 | se = (*pos & GENMASK_ULL(19, 12)) >> 12; | 789 | se = (*pos & GENMASK_ULL(19, 12)) >> 12; |
| 790 | sh = (*pos & GENMASK_ULL(27, 20)) >> 20; | 790 | sh = (*pos & GENMASK_ULL(27, 20)) >> 20; |
| 791 | cu = (*pos & GENMASK_ULL(35, 28)) >> 28; | 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 | while (size) { | 823 | while (size) { |
| 824 | uint32_t value; | 824 | uint32_t value; |
| 825 | 825 | ||
| 826 | value = data[offset++]; | 826 | value = data[result >> 2]; |
| 827 | r = put_user(value, (uint32_t *)buf); | 827 | r = put_user(value, (uint32_t *)buf); |
| 828 | if (r) { | 828 | if (r) { |
| 829 | result = r; | 829 | result = r; |
| @@ -3913,6 +3913,8 @@ static int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive, · 3912 unmodified lines | |||
| 3913 | if (r) | 3913 | if (r) |
| 3914 | goto out; | 3914 | goto out; |
| 3915 | 3915 | ||
| 3916 | amdgpu_fbdev_set_suspend(tmp_adev, 0); | ||
| 3917 | |||
| 3916 | /* must succeed. */ | 3918 | /* must succeed. */ |
| 3917 | amdgpu_ras_resume(tmp_adev); | 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 | amdgpu_unregister_gpu_instance(tmp_adev); | 4089 | amdgpu_unregister_gpu_instance(tmp_adev); |
| 4088 | 4090 | ||
| 4091 | amdgpu_fbdev_set_suspend(adev, 1); | ||
| 4092 | |||
| 4089 | /* disable ras on ALL IPs */ | 4093 | /* disable ras on ALL IPs */ |
| 4090 | if (!(in_ras_intr && !use_baco) && | 4094 | if (!(in_ras_intr && !use_baco) && |
| 4091 | amdgpu_device_ip_need_full_reset(tmp_adev)) | 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 | bool enable = (state == AMD_CG_STATE_GATE); | 693 | bool enable = (state == AMD_CG_STATE_GATE); |
| 694 | 694 | ||
| 695 | if (enable) { | 695 | if (enable) { |
| 696 | if (jpeg_v2_0_is_idle(handle)) | 696 | if (!jpeg_v2_0_is_idle(handle)) |
| 697 | return -EBUSY; | 697 | return -EBUSY; |
| 698 | jpeg_v2_0_enable_clock_gating(adev); | 698 | jpeg_v2_0_enable_clock_gating(adev); |
| 699 | } else { | 699 | } else { |
| @@ -477,7 +477,7 @@ static int jpeg_v2_5_set_clockgating_state(void *handle, · 476 unmodified lines | |||
| 477 | continue; | 477 | continue; |
| 478 | 478 | ||
| 479 | if (enable) { | 479 | if (enable) { |
| 480 | if (jpeg_v2_5_is_idle(handle)) | 480 | if (!jpeg_v2_5_is_idle(handle)) |
| 481 | return -EBUSY; | 481 | return -EBUSY; |
| 482 | jpeg_v2_5_enable_clock_gating(adev, i); | 482 | jpeg_v2_5_enable_clock_gating(adev, i); |
| 483 | } else { | 483 | } else { |
| @@ -89,6 +89,13 @@ · 88 unmodified lines | |||
| 89 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L | 89 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK 0x00010000L |
| 90 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L | 90 | #define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK 0x00020000L |
| 91 | #define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 | 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 | * Indirect registers accessor | 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 | u32 *dw_ptr; | 317 | u32 *dw_ptr; |
| 311 | u32 i, length_dw; | 318 | u32 i, length_dw; |
| 319 | uint32_t rom_index_offset; | ||
| 320 | uint32_t rom_data_offset; | ||
| 312 | 321 | ||
| 313 | if (bios == NULL) | 322 | if (bios == NULL) |
| 314 | return false; | 323 | return false; |
| @@ -321,11 +330,23 @@ static bool soc15_read_bios_from_rom(struct amdgpu_device *adev, · 6 unmodified lines | |||
| 321 | dw_ptr = (u32 *)bios; | 330 | dw_ptr = (u32 *)bios; |
| 322 | length_dw = ALIGN(length_bytes, 4) / 4; | 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 | /* set rom index to 0 */ | 345 | /* set rom index to 0 */ |
| 325 | WREG32(SOC15_REG_OFFSET(SMUIO, 0, mmROM_INDEX), 0); | 346 | WREG32(rom_index_offset, 0); |
| 326 | /* read out the rom data */ | 347 | /* read out the rom data */ |
| 327 | for (i = 0; i < length_dw; i++) | 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 | return true; | 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 | if (enable) { | 1353 | if (enable) { |
| 1354 | /* wait for STATUS to clear */ | 1354 | /* wait for STATUS to clear */ |
| 1355 | if (vcn_v1_0_is_idle(handle)) | 1355 | if (!vcn_v1_0_is_idle(handle)) |
| 1356 | return -EBUSY; | 1356 | return -EBUSY; |
| 1357 | vcn_v1_0_enable_clock_gating(adev); | 1357 | vcn_v1_0_enable_clock_gating(adev); |
| 1358 | } else { | 1358 | } else { |
| @@ -1217,7 +1217,7 @@ static int vcn_v2_0_set_clockgating_state(void *handle, · 1216 unmodified lines | |||
| 1217 | 1217 | ||
| 1218 | if (enable) { | 1218 | if (enable) { |
| 1219 | /* wait for STATUS to clear */ | 1219 | /* wait for STATUS to clear */ |
| 1220 | if (vcn_v2_0_is_idle(handle)) | 1220 | if (!vcn_v2_0_is_idle(handle)) |
| 1221 | return -EBUSY; | 1221 | return -EBUSY; |
| 1222 | vcn_v2_0_enable_clock_gating(adev); | 1222 | vcn_v2_0_enable_clock_gating(adev); |
| 1223 | } else { | 1223 | } else { |
| @@ -1672,7 +1672,7 @@ static int vcn_v2_5_set_clockgating_state(void *handle, · 1671 unmodified lines | |||
| 1672 | return 0; | 1672 | return 0; |
| 1673 | 1673 | ||
| 1674 | if (enable) { | 1674 | if (enable) { |
| 1675 | if (vcn_v2_5_is_idle(handle)) | 1675 | if (!vcn_v2_5_is_idle(handle)) |
| 1676 | return -EBUSY; | 1676 | return -EBUSY; |
| 1677 | vcn_v2_5_enable_clock_gating(adev); | 1677 | vcn_v2_5_enable_clock_gating(adev); |
| 1678 | } else { | 1678 | } else { |
| @@ -522,8 +522,9 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params) · 521 unmodified lines | |||
| 522 | 522 | ||
| 523 | acrtc_state = to_dm_crtc_state(acrtc->base.state); | 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, | 525 | DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d, planes:%d\n", acrtc->crtc_id, |
| 526 | amdgpu_dm_vrr_active(acrtc_state)); | 526 | amdgpu_dm_vrr_active(acrtc_state), |
| 527 | acrtc_state->active_planes); | ||
| 527 | 528 | ||
| 528 | amdgpu_dm_crtc_handle_crc_irq(&acrtc->base); | 529 | amdgpu_dm_crtc_handle_crc_irq(&acrtc->base); |
| 529 | drm_crtc_handle_vblank(&acrtc->base); | 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 | &acrtc_state->vrr_params.adjust); | 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 | if (acrtc->event) { | 559 | if (acrtc->event) { |
| 548 | drm_crtc_send_vblank_event(&acrtc->base, acrtc->event); | 560 | drm_crtc_send_vblank_event(&acrtc->base, acrtc->event); |
| 549 | acrtc->event = NULL; | 561 | acrtc->event = NULL; |
| @@ -3401,6 +3401,17 @@ static bool retrieve_link_cap(struct dc_link *link) · 3400 unmodified lines | |||
| 3401 | sink_id.ieee_device_id, | 3401 | sink_id.ieee_device_id, |
| 3402 | sizeof(sink_id.ieee_device_id)); | 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 | core_link_read_dpcd( | 3415 | core_link_read_dpcd( |
| 3405 | link, | 3416 | link, |
| 3406 | DP_SINK_HW_REVISION_START, | 3417 | DP_SINK_HW_REVISION_START, |
| @@ -108,7 +108,6 @@ static const struct hwseq_private_funcs dcn20_private_funcs = { · 107 unmodified lines | |||
| 108 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, | 108 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, |
| 109 | .dpp_pg_control = dcn20_dpp_pg_control, | 109 | .dpp_pg_control = dcn20_dpp_pg_control, |
| 110 | .hubp_pg_control = dcn20_hubp_pg_control, | 110 | .hubp_pg_control = dcn20_hubp_pg_control, |
| 111 | .dsc_pg_control = NULL, | ||
| 112 | .update_odm = dcn20_update_odm, | 111 | .update_odm = dcn20_update_odm, |
| 113 | .dsc_pg_control = dcn20_dsc_pg_control, | 112 | .dsc_pg_control = dcn20_dsc_pg_control, |
| 114 | .get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color, | 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 | .use_urgent_burst_bw = 0 | 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 | struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc = { 0 }; | 449 | struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc = { 0 }; |
| 339 | 450 | ||
| 340 | #ifndef mmDP0_DP_DPHY_INTERNAL_CTRL | 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 | static struct _vcs_dpi_soc_bounding_box_st *get_asic_rev_soc_bb( | 3402 | static struct _vcs_dpi_soc_bounding_box_st *get_asic_rev_soc_bb( |
| 3292 | uint32_t hw_internal_rev) | 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 | if (ASICREV_IS_NAVI12_P(hw_internal_rev)) | 3408 | if (ASICREV_IS_NAVI12_P(hw_internal_rev)) |
| 3295 | return &dcn2_0_nv12_soc; | 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 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, | 116 | .enable_power_gating_plane = dcn20_enable_power_gating_plane, |
| 117 | .dpp_pg_control = dcn20_dpp_pg_control, | 117 | .dpp_pg_control = dcn20_dpp_pg_control, |
| 118 | .hubp_pg_control = dcn20_hubp_pg_control, | 118 | .hubp_pg_control = dcn20_hubp_pg_control, |
| 119 | .dsc_pg_control = NULL, | ||
| 120 | .update_odm = dcn20_update_odm, | 119 | .update_odm = dcn20_update_odm, |
| 121 | .dsc_pg_control = dcn20_dsc_pg_control, | 120 | .dsc_pg_control = dcn20_dsc_pg_control, |
| 122 | .get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color, | 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 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && | 2006 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && |
| 2007 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) { | 2007 | smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) { |
| 2008 | smu_set_watermarks_table(smu, table, clock_ranges); | 2008 | smu_set_watermarks_table(smu, table, clock_ranges); |
| 2009 | smu->watermarks_bitmap |= WATERMARKS_EXIST; | 2009 | |
| 2010 | smu->watermarks_bitmap &= ~WATERMARKS_LOADED; | 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 | mutex_unlock(&smu->mutex); | 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 | int ret = 0; | 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 | if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && | 1065 | if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && |
| 1075 | smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && | 1066 | smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) && |
| 1076 | smu_feature_is_supported(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) { | 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 | *clock_ranges) | 1484 | *clock_ranges) |
| 1494 | { | 1485 | { |
| 1495 | int i; | 1486 | int i; |
| 1487 | int ret = 0; | ||
| 1496 | Watermarks_t *table = watermarks; | 1488 | Watermarks_t *table = watermarks; |
| 1497 | 1489 | ||
| 1498 | if (!table || !clock_ranges) | 1490 | if (!table || !clock_ranges) |
| @@ -1544,6 +1536,18 @@ static int navi10_set_watermarks_table(struct smu_context *smu, · 45 unmodified lines | |||
| 1544 | clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; | 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 | return 0; | 1551 | return 0; |
| 1548 | } | 1552 | } |
| 1549 | 1553 | ||
| @@ -806,9 +806,10 @@ static int renoir_set_watermarks_table( · 805 unmodified lines | |||
| 806 | clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; | 806 | clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; |
| 807 | } | 807 | } |
| 808 | 808 | ||
| 809 | smu->watermarks_bitmap |= WATERMARKS_EXIST; | ||
| 810 | |||
| 809 | /* pass data to smu controller */ | 811 | /* pass data to smu controller */ |
| 810 | if ((smu->watermarks_bitmap & WATERMARKS_EXIST) && | 812 | if (!(smu->watermarks_bitmap & WATERMARKS_LOADED)) { |
| 811 | !(smu->watermarks_bitmap & WATERMARKS_LOADED)) { | ||
| 812 | ret = smu_write_watermarks_table(smu); | 813 | ret = smu_write_watermarks_table(smu); |
| 813 | if (ret) { | 814 | if (ret) { |
| 814 | pr_err("Failed to update WMTABLE!"); | 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 | MODULE_DEVICE_TABLE(of, komeda_of_match); | 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 | struct komeda_drv *mdrv = dev_get_drvdata(dev); | 151 | struct komeda_drv *mdrv = dev_get_drvdata(dev); |
| 152 | 152 | ||
| 153 | return komeda_dev_suspend(mdrv->mdev); | 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 | struct komeda_drv *mdrv = dev_get_drvdata(dev); | 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 | size = min(size, mem); | 156 | size = min(size, mem); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | if (pci_request_region(pdev, 0, "bochs-drm") != 0) { | 159 | if (pci_request_region(pdev, 0, "bochs-drm") != 0) |
| 160 | DRM_ERROR("Cannot request framebuffer\n"); | 160 | DRM_WARN("Cannot request framebuffer, boot fb still active?\n"); |
| 161 | return -EBUSY; | ||
| 162 | } | ||
| 163 | 161 | ||
| 164 | bochs->fb_map = ioremap(addr, size); | 162 | bochs->fb_map = ioremap(addr, size); |
| 165 | if (bochs->fb_map == NULL) { | 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 | frame.colorspace = HDMI_COLORSPACE_RGB; | 1624 | frame.colorspace = HDMI_COLORSPACE_RGB; |
| 1625 | 1625 | ||
| 1626 | /* Set up colorimetry */ | 1626 | /* Set up colorimetry */ |
| 1627 | switch (hdmi->hdmi_data.enc_out_encoding) { | 1627 | if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { |
| 1628 | case V4L2_YCBCR_ENC_601: | 1628 | switch (hdmi->hdmi_data.enc_out_encoding) { |
| 1629 | if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) | 1629 | case V4L2_YCBCR_ENC_601: |
| 1630 | frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; | 1630 | if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) |
| 1631 | else | 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 | frame.colorimetry = HDMI_COLORIMETRY_ITU_601; | 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 | frame.extended_colorimetry = | 1653 | frame.extended_colorimetry = |
| 1634 | HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; | 1654 | 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; | ||
| 1649 | } | 1655 | } |
| 1650 | 1656 | ||
| 1651 | frame.scan_mode = HDMI_SCAN_MODE_NONE; | 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 | return parent_lct + 1; | 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 | switch (pdt) { | 1940 | switch (pdt) { |
| 1941 | case DP_PEER_DEVICE_DP_LEGACY_CONV: | 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 | /* Teardown the old pdt, if there is one */ | 1966 | /* Teardown the old pdt, if there is one */ |
| 1967 | if (port->pdt != DP_PEER_DEVICE_NONE) { | 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 | * If the new PDT would also have an i2c bus, | 1970 | * If the new PDT would also have an i2c bus, |
| 1971 | * don't bother with reregistering it | 1971 | * don't bother with reregistering it |
| 1972 | */ | 1972 | */ |
| 1973 | if (new_pdt != DP_PEER_DEVICE_NONE && | 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 | port->pdt = new_pdt; | 1975 | port->pdt = new_pdt; |
| 1976 | port->mcs = new_mcs; | 1976 | port->mcs = new_mcs; |
| 1977 | return 0; | 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 | port->mcs = new_mcs; | 1991 | port->mcs = new_mcs; |
| 1992 | 1992 | ||
| 1993 | if (port->pdt != DP_PEER_DEVICE_NONE) { | 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 | /* add i2c over sideband */ | 1995 | /* add i2c over sideband */ |
| 1996 | ret = drm_dp_mst_register_i2c_bus(&port->aux); | 1996 | ret = drm_dp_mst_register_i2c_bus(&port->aux); |
| 1997 | } else { | 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 | if (port->pdt != DP_PEER_DEVICE_NONE && | 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 | port->cached_edid = drm_get_edid(port->connector, | 2176 | port->cached_edid = drm_get_edid(port->connector, |
| 2177 | &port->aux.ddc); | 2177 | &port->aux.ddc); |
| 2178 | drm_connector_set_tile_property(port->connector); | 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 | mutex_unlock(&mgr->lock); | 2302 | mutex_unlock(&mgr->lock); |
| 2303 | } | 2303 | } |
| 2304 | 2304 | ||
| 2305 | if (old_ddps != port->ddps) { | 2305 | /* |
| 2306 | if (port->ddps) { | 2306 | * Reprobe PBN caps on both hotplug, and when re-probing the link |
| 2307 | if (!port->input) { | 2307 | * for our parent mstb |
| 2308 | drm_dp_send_enum_path_resources(mgr, mstb, | 2308 | */ |
| 2309 | port); | 2309 | if (old_ddps != port->ddps || !created) { |
| 2310 | } | 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 | } else { | 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 | port->ddps = conn_stat->displayport_device_plug_status; | 2405 | port->ddps = conn_stat->displayport_device_plug_status; |
| 2402 | 2406 | ||
| 2403 | if (old_ddps != port->ddps) { | 2407 | if (old_ddps != port->ddps) { |
| 2404 | if (port->ddps) { | 2408 | if (port->ddps && !port->input) |
| 2405 | dowork = true; | 2409 | drm_dp_send_enum_path_resources(mgr, mstb, port); |
| 2406 | } else { | 2410 | else |
| 2407 | port->available_pbn = 0; | 2411 | port->full_pbn = 0; |
| 2408 | } | ||
| 2409 | } | 2412 | } |
| 2410 | 2413 | ||
| 2411 | new_pdt = port->input ? DP_PEER_DEVICE_NONE : conn_stat->peer_device_type; | 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 | if (port->input || !port->ddps) | 2559 | if (port->input || !port->ddps) |
| 2557 | continue; | 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 | if (port->mstb) | 2562 | if (port->mstb) |
| 2567 | mstb_child = drm_dp_mst_topology_get_mstb_validated( | 2563 | mstb_child = drm_dp_mst_topology_get_mstb_validated( |
| 2568 | mgr, port->mstb); | 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 | ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); | 2987 | ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); |
| 2992 | if (ret > 0) { | 2988 | if (ret > 0) { |
| 2989 | ret = 0; | ||
| 2993 | path_res = &txmsg->reply.u.path_resources; | 2990 | path_res = &txmsg->reply.u.path_resources; |
| 2994 | 2991 | ||
| 2995 | if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) { | 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 | path_res->port_number, | 2999 | path_res->port_number, |
| 3003 | path_res->full_payload_bw_number, | 3000 | path_res->full_payload_bw_number, |
| 3004 | path_res->avail_payload_bw_number); | 3001 | path_res->avail_payload_bw_number); |
| 3005 | port->available_pbn = | 3002 | |
| 3006 | path_res->avail_payload_bw_number; | 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 | port->fec_capable = path_res->fec_capable; | 3012 | port->fec_capable = path_res->fec_capable; |
| 3008 | } | 3013 | } |
| 3009 | } | 3014 | } |
| 3010 | 3015 | ||
| 3011 | kfree(txmsg); | 3016 | kfree(txmsg); |
| 3012 | return 0; | 3017 | return ret; |
| 3013 | } | 3018 | } |
| 3014 | 3019 | ||
| 3015 | static struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb) | 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 | /* The link address will need to be re-sent on resume */ | 3601 | /* The link address will need to be re-sent on resume */ |
| 3597 | mstb->link_address_sent = false; | 3602 | mstb->link_address_sent = false; |
| 3598 | 3603 | ||
| 3599 | list_for_each_entry(port, &mstb->ports, next) { | 3604 | 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 | |||
| 3603 | if (port->mstb) | 3605 | if (port->mstb) |
| 3604 | drm_dp_mst_topology_mgr_invalidate_mstb(port->mstb); | 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 | return false; | 4830 | return false; |
| 4830 | } | 4831 | } |
| 4831 | 4832 | ||
| 4832 | static inline | 4833 | static int |
| 4833 | int drm_dp_mst_atomic_check_bw_limit(struct drm_dp_mst_branch *branch, | 4834 | drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port, |
| 4834 | struct drm_dp_mst_topology_state *mst_state) | 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 | struct drm_dp_vcpi_allocation *vcpi; | 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) { | 4846 | /* Check that we have at least one port in our state that's downstream |
| 4841 | if (port->mstb) | 4847 | * of this branch, otherwise we can skip this branch |
| 4842 | if (drm_dp_mst_atomic_check_bw_limit(port->mstb, mst_state)) | 4848 | */ |
| 4843 | return -ENOSPC; | 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) | 4854 | found = true; |
| 4846 | pbn_limit = port->available_pbn; | 4855 | break; |
| 4847 | } | 4856 | } |
| 4848 | DRM_DEBUG_ATOMIC("[MST BRANCH:%p] branch has %d PBN available\n", | 4857 | if (!found) |
| 4849 | branch, pbn_limit); | 4858 | return 0; |
| 4850 | 4859 | ||
| 4851 | list_for_each_entry(vcpi, &mst_state->vcpis, next) { | 4860 | if (mstb->port_parent) |
| 4852 | if (!vcpi->pbn) | 4861 | DRM_DEBUG_ATOMIC("[MSTB:%p] [MST PORT:%p] Checking bandwidth limits on [MSTB:%p]\n", |
| 4853 | continue; | 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)) | 4873 | pbn_used += ret; |
| 4856 | pbn_used += vcpi->pbn; | ||
| 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) { | 4876 | return pbn_used; |
| 4862 | DRM_DEBUG_ATOMIC("[MST BRANCH:%p] No available bandwidth\n", | 4877 | } |
| 4863 | branch); | 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 | return -ENOSPC; | 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 | static inline int | 4931 | static inline int |
| @@ -5061,9 +5123,15 @@ int drm_dp_mst_atomic_check(struct drm_atomic_state *state) · 191 unmodified lines | |||
| 5061 | ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state); | 5123 | ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state); |
| 5062 | if (ret) | 5124 | if (ret) |
| 5063 | break; | 5125 | break; |
| 5064 | ret = drm_dp_mst_atomic_check_bw_limit(mgr->mst_primary, mst_state); | 5126 | |
| 5065 | if (ret) | 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 | break; | 5132 | break; |
| 5133 | else | ||
| 5134 | ret = 0; | ||
| 5067 | } | 5135 | } |
| 5068 | 5136 | ||
| 5069 | return ret; | 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 | DRM_DEBUG_LEASE("Creating lease\n"); | 544 | DRM_DEBUG_LEASE("Creating lease\n"); |
| 545 | /* lessee will take the ownership of leases */ | ||
| 545 | lessee = drm_lease_create(lessor, &leases); | 546 | lessee = drm_lease_create(lessor, &leases); |
| 546 | 547 | ||
| 547 | if (IS_ERR(lessee)) { | 548 | if (IS_ERR(lessee)) { |
| 548 | ret = PTR_ERR(lessee); | 549 | ret = PTR_ERR(lessee); |
| 550 | idr_destroy(&leases); | ||
| 549 | goto out_leases; | 551 | goto out_leases; |
| 550 | } | 552 | } |
| 551 | 553 | ||
| @@ -580,7 +582,6 @@ out_lessee: · 28 unmodified lines | |||
| 580 | 582 | ||
| 581 | out_leases: | 583 | out_leases: |
| 582 | put_unused_fd(fd); | 584 | put_unused_fd(fd); |
| 583 | idr_destroy(&leases); | ||
| 584 | 585 | ||
| 585 | DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl failed: %d\n", ret); | 586 | DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl failed: %d\n", ret); |
| 586 | return ret; | 587 | return ret; |
| @@ -55,6 +55,7 @@ static const char * const decon_clks_name[] = { · 54 unmodified lines | |||
| 55 | struct decon_context { | 55 | struct decon_context { |
| 56 | struct device *dev; | 56 | struct device *dev; |
| 57 | struct drm_device *drm_dev; | 57 | struct drm_device *drm_dev; |
| 58 | void *dma_priv; | ||
| 58 | struct exynos_drm_crtc *crtc; | 59 | struct exynos_drm_crtc *crtc; |
| 59 | struct exynos_drm_plane planes[WINDOWS_NR]; | 60 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 60 | struct exynos_drm_plane_config configs[WINDOWS_NR]; | 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 | decon_clear_channels(ctx->crtc); | 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 | static void decon_unbind(struct device *dev, struct device *master, void *data) | 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 | decon_atomic_disable(ctx->crtc); | 655 | decon_atomic_disable(ctx->crtc); |
| 655 | 656 | ||
| 656 | /* detach this sub driver from iommu mapping if supported. */ | 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 | static const struct component_ops decon_component_ops = { | 661 | static const struct component_ops decon_component_ops = { |
| @@ -40,6 +40,7 @@ · 39 unmodified lines | |||
| 40 | struct decon_context { | 40 | struct decon_context { |
| 41 | struct device *dev; | 41 | struct device *dev; |
| 42 | struct drm_device *drm_dev; | 42 | struct drm_device *drm_dev; |
| 43 | void *dma_priv; | ||
| 43 | struct exynos_drm_crtc *crtc; | 44 | struct exynos_drm_crtc *crtc; |
| 44 | struct exynos_drm_plane planes[WINDOWS_NR]; | 45 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 45 | struct exynos_drm_plane_config configs[WINDOWS_NR]; | 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 | decon_clear_channels(ctx->crtc); | 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 | static void decon_ctx_remove(struct decon_context *ctx) | 134 | static void decon_ctx_remove(struct decon_context *ctx) |
| 134 | { | 135 | { |
| 135 | /* detach this sub driver from iommu mapping if supported. */ | 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 | static u32 decon_calc_clkdiv(struct decon_context *ctx, | 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 | * mapping. | 58 | * mapping. |
| 59 | */ | 59 | */ |
| 60 | static int drm_iommu_attach_device(struct drm_device *drm_dev, | 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 | struct exynos_drm_private *priv = drm_dev->dev_private; | 63 | struct exynos_drm_private *priv = drm_dev->dev_private; |
| 64 | int ret; | 64 | int ret; |
| @@ -74,7 +74,14 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev, · 9 unmodified lines | |||
| 74 | return ret; | 74 | return ret; |
| 75 | 75 | ||
| 76 | if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) { | 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 | arm_iommu_detach_device(subdrv_dev); | 85 | arm_iommu_detach_device(subdrv_dev); |
| 79 | 86 | ||
| 80 | ret = arm_iommu_attach_device(subdrv_dev, priv->mapping); | 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 | * mapping | 105 | * mapping |
| 99 | */ | 106 | */ |
| 100 | static void drm_iommu_detach_device(struct drm_device *drm_dev, | 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 | struct exynos_drm_private *priv = drm_dev->dev_private; | 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 | arm_iommu_detach_device(subdrv_dev); | 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 | iommu_detach_device(priv->mapping, subdrv_dev); | 116 | iommu_detach_device(priv->mapping, subdrv_dev); |
| 109 | 117 | ||
| 110 | clear_dma_max_seg_size(subdrv_dev); | 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 | struct exynos_drm_private *priv = drm->dev_private; | 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 | priv->mapping = mapping; | 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 | if (IS_ENABLED(CONFIG_EXYNOS_IOMMU)) | 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 | void exynos_drm_cleanup_dma(struct drm_device *drm) | 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 | return priv->mapping ? true : false; | 223 | return priv->mapping ? true : false; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | int exynos_drm_register_dma(struct drm_device *drm, struct device *dev); | 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); | 227 | void **dma_priv); |
| 228 | void exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev, | ||
| 229 | void **dma_priv); | ||
| 228 | void exynos_drm_cleanup_dma(struct drm_device *drm); | 230 | void exynos_drm_cleanup_dma(struct drm_device *drm); |
| 229 | 231 | ||
| 230 | #ifdef CONFIG_DRM_EXYNOS_DPI | 232 | #ifdef CONFIG_DRM_EXYNOS_DPI |
| @@ -97,6 +97,7 @@ struct fimc_scaler { · 96 unmodified lines | |||
| 97 | struct fimc_context { | 97 | struct fimc_context { |
| 98 | struct exynos_drm_ipp ipp; | 98 | struct exynos_drm_ipp ipp; |
| 99 | struct drm_device *drm_dev; | 99 | struct drm_device *drm_dev; |
| 100 | void *dma_priv; | ||
| 100 | struct device *dev; | 101 | struct device *dev; |
| 101 | struct exynos_drm_ipp_task *task; | 102 | struct exynos_drm_ipp_task *task; |
| 102 | struct exynos_drm_ipp_formats *formats; | 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 | ctx->drm_dev = drm_dev; | 1135 | ctx->drm_dev = drm_dev; |
| 1135 | ipp->drm_dev = drm_dev; | 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 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, | 1139 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 1139 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | | 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 | struct exynos_drm_ipp *ipp = &ctx->ipp; | 1154 | struct exynos_drm_ipp *ipp = &ctx->ipp; |
| 1154 | 1155 | ||
| 1155 | exynos_drm_ipp_unregister(dev, ipp); | 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 | static const struct component_ops fimc_component_ops = { | 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 | struct fimd_context { | 167 | struct fimd_context { |
| 168 | struct device *dev; | 168 | struct device *dev; |
| 169 | struct drm_device *drm_dev; | 169 | struct drm_device *drm_dev; |
| 170 | void *dma_priv; | ||
| 170 | struct exynos_drm_crtc *crtc; | 171 | struct exynos_drm_crtc *crtc; |
| 171 | struct exynos_drm_plane planes[WINDOWS_NR]; | 172 | struct exynos_drm_plane planes[WINDOWS_NR]; |
| 172 | struct exynos_drm_plane_config configs[WINDOWS_NR]; | 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 | if (is_drm_iommu_supported(drm_dev)) | 1091 | if (is_drm_iommu_supported(drm_dev)) |
| 1091 | fimd_clear_channels(ctx->crtc); | 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 | static void fimd_unbind(struct device *dev, struct device *master, | 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 | fimd_atomic_disable(ctx->crtc); | 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 | if (ctx->encoder) | 1106 | if (ctx->encoder) |
| 1106 | exynos_dpi_remove(ctx->encoder); | 1107 | exynos_dpi_remove(ctx->encoder); |
| @@ -232,6 +232,7 @@ struct g2d_runqueue_node { · 231 unmodified lines | |||
| 232 | 232 | ||
| 233 | struct g2d_data { | 233 | struct g2d_data { |
| 234 | struct device *dev; | 234 | struct device *dev; |
| 235 | void *dma_priv; | ||
| 235 | struct clk *gate_clk; | 236 | struct clk *gate_clk; |
| 236 | void __iomem *regs; | 237 | void __iomem *regs; |
| 237 | int irq; | 238 | int irq; |
| @@ -1409,7 +1410,7 @@ static int g2d_bind(struct device *dev, struct device *master, void *data) · 1171 unmodified lines | |||
| 1409 | return ret; | 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 | if (ret < 0) { | 1414 | if (ret < 0) { |
| 1414 | dev_err(dev, "failed to enable iommu.\n"); | 1415 | dev_err(dev, "failed to enable iommu.\n"); |
| 1415 | g2d_fini_cmdlist(g2d); | 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 | priv->g2d_dev = NULL; | 1435 | priv->g2d_dev = NULL; |
| 1435 | 1436 | ||
| 1436 | cancel_work_sync(&g2d->runqueue_work); | 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 | static const struct component_ops g2d_component_ops = { | 1441 | static const struct component_ops g2d_component_ops = { |
| @@ -97,6 +97,7 @@ struct gsc_scaler { · 96 unmodified lines | |||
| 97 | struct gsc_context { | 97 | struct gsc_context { |
| 98 | struct exynos_drm_ipp ipp; | 98 | struct exynos_drm_ipp ipp; |
| 99 | struct drm_device *drm_dev; | 99 | struct drm_device *drm_dev; |
| 100 | void *dma_priv; | ||
| 100 | struct device *dev; | 101 | struct device *dev; |
| 101 | struct exynos_drm_ipp_task *task; | 102 | struct exynos_drm_ipp_task *task; |
| 102 | struct exynos_drm_ipp_formats *formats; | 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 | ctx->drm_dev = drm_dev; | 1171 | ctx->drm_dev = drm_dev; |
| 1171 | ctx->drm_dev = drm_dev; | 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 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, | 1175 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 1175 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | | 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 | struct exynos_drm_ipp *ipp = &ctx->ipp; | 1190 | struct exynos_drm_ipp *ipp = &ctx->ipp; |
| 1190 | 1191 | ||
| 1191 | exynos_drm_ipp_unregister(dev, ipp); | 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 | static const struct component_ops gsc_component_ops = { | 1196 | static const struct component_ops gsc_component_ops = { |
| @@ -56,6 +56,7 @@ struct rot_variant { · 55 unmodified lines | |||
| 56 | struct rot_context { | 56 | struct rot_context { |
| 57 | struct exynos_drm_ipp ipp; | 57 | struct exynos_drm_ipp ipp; |
| 58 | struct drm_device *drm_dev; | 58 | struct drm_device *drm_dev; |
| 59 | void *dma_priv; | ||
| 59 | struct device *dev; | 60 | struct device *dev; |
| 60 | void __iomem *regs; | 61 | void __iomem *regs; |
| 61 | struct clk *clock; | 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 | rot->drm_dev = drm_dev; | 245 | rot->drm_dev = drm_dev; |
| 245 | ipp->drm_dev = drm_dev; | 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 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, | 249 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 249 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE, | 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 | struct exynos_drm_ipp *ipp = &rot->ipp; | 262 | struct exynos_drm_ipp *ipp = &rot->ipp; |
| 262 | 263 | ||
| 263 | exynos_drm_ipp_unregister(dev, ipp); | 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 | static const struct component_ops rotator_component_ops = { | 268 | static const struct component_ops rotator_component_ops = { |
| @@ -39,6 +39,7 @@ struct scaler_data { · 38 unmodified lines | |||
| 39 | struct scaler_context { | 39 | struct scaler_context { |
| 40 | struct exynos_drm_ipp ipp; | 40 | struct exynos_drm_ipp ipp; |
| 41 | struct drm_device *drm_dev; | 41 | struct drm_device *drm_dev; |
| 42 | void *dma_priv; | ||
| 42 | struct device *dev; | 43 | struct device *dev; |
| 43 | void __iomem *regs; | 44 | void __iomem *regs; |
| 44 | struct clk *clock[SCALER_MAX_CLK]; | 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 | scaler->drm_dev = drm_dev; | 452 | scaler->drm_dev = drm_dev; |
| 452 | ipp->drm_dev = drm_dev; | 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 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, | 456 | exynos_drm_ipp_register(dev, ipp, &ipp_funcs, |
| 456 | DRM_EXYNOS_IPP_CAP_CROP | DRM_EXYNOS_IPP_CAP_ROTATE | | 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 | struct exynos_drm_ipp *ipp = &scaler->ipp; | 471 | struct exynos_drm_ipp *ipp = &scaler->ipp; |
| 471 | 472 | ||
| 472 | exynos_drm_ipp_unregister(dev, ipp); | 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 | static const struct component_ops scaler_component_ops = { | 478 | static const struct component_ops scaler_component_ops = { |
| @@ -94,6 +94,7 @@ struct mixer_context { · 93 unmodified lines | |||
| 94 | struct platform_device *pdev; | 94 | struct platform_device *pdev; |
| 95 | struct device *dev; | 95 | struct device *dev; |
| 96 | struct drm_device *drm_dev; | 96 | struct drm_device *drm_dev; |
| 97 | void *dma_priv; | ||
| 97 | struct exynos_drm_crtc *crtc; | 98 | struct exynos_drm_crtc *crtc; |
| 98 | struct exynos_drm_plane planes[MIXER_WIN_NR]; | 99 | struct exynos_drm_plane planes[MIXER_WIN_NR]; |
| 99 | unsigned long flags; | 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 | static void mixer_ctx_remove(struct mixer_context *mixer_ctx) | 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 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) | 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 | if (unlikely(entry->flags & eb->invalid_flags)) | 423 | if (unlikely(entry->flags & eb->invalid_flags)) |
| 424 | return -EINVAL; | 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 | return -EINVAL; | 428 | return -EINVAL; |
| 428 | 429 | ||
| 429 | /* | 430 | /* |
| @@ -1600,17 +1600,6 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve, · 1599 unmodified lines | |||
| 1600 | spin_unlock(&old->breadcrumbs.irq_lock); | 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 | #define for_each_waiter(p__, rq__) \ | 1603 | #define for_each_waiter(p__, rq__) \ |
| 1615 | list_for_each_entry_lockless(p__, \ | 1604 | list_for_each_entry_lockless(p__, \ |
| 1616 | &(rq__)->sched.waiters_list, \ | 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 | if (!intel_engine_has_timeslices(engine)) | 1668 | if (!intel_engine_has_timeslices(engine)) |
| 1680 | return false; | 1669 | return false; |
| 1681 | 1670 | ||
| 1682 | if (list_is_last(&rq->sched.link, &engine->active.requests)) | 1671 | hint = engine->execlists.queue_priority_hint; |
| 1683 | return false; | 1672 | if (!list_is_last(&rq->sched.link, &engine->active.requests)) |
| 1684 | 1673 | hint = max(hint, rq_prio(list_next_entry(rq, sched.link))); | |
| 1685 | hint = max(rq_prio(list_next_entry(rq, sched.link)), | ||
| 1686 | engine->execlists.queue_priority_hint); | ||
| 1687 | 1674 | ||
| 1688 | return hint >= effective_prio(rq); | 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 | set_timer_ms(&engine->execlists.timer, active_timeslice(engine)); | 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 | static void record_preemption(struct intel_engine_execlists *execlists) | 1727 | static void record_preemption(struct intel_engine_execlists *execlists) |
| 1729 | { | 1728 | { |
| 1730 | (void)I915_SELFTEST_ONLY(execlists->preempt_hang.count++); | 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 | if (!rq) | 1735 | if (!rq) |
| 1739 | return 0; | 1736 | return 0; |
| 1740 | 1737 | ||
| @@ -1745,13 +1742,14 @@ static unsigned long active_preempt_timeout(struct intel_engine_cs *engine) · 4 unmodified lines | |||
| 1745 | return READ_ONCE(engine->props.preempt_timeout_ms); | 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 | if (!intel_engine_has_preempt_reset(engine)) | 1748 | if (!intel_engine_has_preempt_reset(engine)) |
| 1751 | return; | 1749 | return; |
| 1752 | 1750 | ||
| 1753 | set_timer_ms(&engine->execlists.preempt, | 1751 | set_timer_ms(&engine->execlists.preempt, |
| 1754 | active_preempt_timeout(engine)); | 1752 | active_preempt_timeout(engine, rq)); |
| 1755 | } | 1753 | } |
| 1756 | 1754 | ||
| 1757 | static inline void clear_ports(struct i915_request **ports, int count) | 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 | struct intel_engine_execlists * const execlists = &engine->execlists; | 1762 | struct intel_engine_execlists * const execlists = &engine->execlists; |
| 1765 | struct i915_request **port = execlists->pending; | 1763 | struct i915_request **port = execlists->pending; |
| 1766 | struct i915_request ** const last_port = port + execlists->port_mask; | 1764 | struct i915_request ** const last_port = port + execlists->port_mask; |
| 1765 | struct i915_request * const *active; | ||
| 1767 | struct i915_request *last; | 1766 | struct i915_request *last; |
| 1768 | struct rb_node *rb; | 1767 | struct rb_node *rb; |
| 1769 | bool submit = false; | 1768 | bool submit = false; |
| @@ -1818,7 +1817,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 48 unmodified lines | |||
| 1818 | * i.e. we will retrigger preemption following the ack in case | 1817 | * i.e. we will retrigger preemption following the ack in case |
| 1819 | * of trouble. | 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 | if (last) { | 1824 | if (last) { |
| 1823 | if (need_preempt(engine, last, rb)) { | 1825 | if (need_preempt(engine, last, rb)) { |
| 1824 | ENGINE_TRACE(engine, | 1826 | ENGINE_TRACE(engine, |
| @@ -1888,11 +1890,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 63 unmodified lines | |||
| 1888 | * Even if ELSP[1] is occupied and not worthy | 1890 | * Even if ELSP[1] is occupied and not worthy |
| 1889 | * of timeslices, our queue might be. | 1891 | * of timeslices, our queue might be. |
| 1890 | */ | 1892 | */ |
| 1891 | if (!execlists->timer.expires && | 1893 | start_timeslice(engine); |
| 1892 | need_timeslice(engine, last)) | ||
| 1893 | set_timer_ms(&execlists->timer, | ||
| 1894 | timeslice(engine)); | ||
| 1895 | |||
| 1896 | return; | 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 | if (last && !can_merge_rq(last, rq)) { | 1926 | if (last && !can_merge_rq(last, rq)) { |
| 1929 | spin_unlock(&ve->base.active.lock); | 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 | ENGINE_TRACE(engine, | 1932 | ENGINE_TRACE(engine, |
| @@ -2103,7 +2102,7 @@ done: · 169 unmodified lines | |||
| 2103 | * Skip if we ended up with exactly the same set of requests, | 2102 | * Skip if we ended up with exactly the same set of requests, |
| 2104 | * e.g. trying to timeslice a pair of ordered contexts | 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 | (port - execlists->pending + 1) * sizeof(*port))) { | 2106 | (port - execlists->pending + 1) * sizeof(*port))) { |
| 2108 | do | 2107 | do |
| 2109 | execlists_schedule_out(fetch_and_zero(port)); | 2108 | execlists_schedule_out(fetch_and_zero(port)); |
| @@ -2114,7 +2113,7 @@ done: · 4 unmodified lines | |||
| 2114 | clear_ports(port + 1, last_port - port); | 2113 | clear_ports(port + 1, last_port - port); |
| 2115 | 2114 | ||
| 2116 | execlists_submit_ports(engine); | 2115 | execlists_submit_ports(engine); |
| 2117 | set_preempt_timeout(engine); | 2116 | set_preempt_timeout(engine, *active); |
| 2118 | } else { | 2117 | } else { |
| 2119 | skip_submit: | 2118 | skip_submit: |
| 2120 | ring_set_paused(engine, 0); | 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 | *cs++ = preparser_disable(false); | 4001 | *cs++ = preparser_disable(false); |
| 4003 | intel_ring_advance(request, cs); | 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 | return 0; | 4005 | return 0; |
| @@ -192,11 +192,15 @@ static void cacheline_release(struct intel_timeline_cacheline *cl) · 191 unmodified lines | |||
| 192 | 192 | ||
| 193 | static void cacheline_free(struct intel_timeline_cacheline *cl) | 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 | GEM_BUG_ON(ptr_test_bit(cl->vaddr, CACHELINE_FREE)); | 200 | GEM_BUG_ON(ptr_test_bit(cl->vaddr, CACHELINE_FREE)); |
| 196 | cl->vaddr = ptr_set_bit(cl->vaddr, CACHELINE_FREE); | 201 | cl->vaddr = ptr_set_bit(cl->vaddr, CACHELINE_FREE); |
| 197 | 202 | ||
| 198 | if (i915_active_is_idle(&cl->active)) | 203 | i915_active_release(&cl->active); |
| 199 | __idle_cacheline_free(cl); | ||
| 200 | } | 204 | } |
| 201 | 205 | ||
| 202 | int intel_timeline_init(struct intel_timeline *timeline, | 206 | int intel_timeline_init(struct intel_timeline *timeline, |
| @@ -1529,15 +1529,34 @@ err_obj: · 1528 unmodified lines | |||
| 1529 | return ERR_PTR(err); | 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 | static bool mcr_range(struct drm_i915_private *i915, u32 offset) | 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 | * which only controls CPU initiated MMIO. Routing does not | 1553 | * which only controls CPU initiated MMIO. Routing does not |
| 1537 | * work for CS access so we cannot verify them on this path. | 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)) | 1556 | for (i = 0; mcr_ranges_gen8[i].start; i++) |
| 1540 | return true; | 1557 | if (offset >= mcr_ranges_gen8[i].start && |
| 1558 | offset <= mcr_ranges_gen8[i].end) | ||
| 1559 | return true; | ||
| 1541 | 1560 | ||
| 1542 | return false; | 1561 | return false; |
| 1543 | } | 1562 | } |
| @@ -457,7 +457,8 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected) · 456 unmodified lines | |||
| 457 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; | 457 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; |
| 458 | 458 | ||
| 459 | /* TODO: add more platforms support */ | 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 | if (connected) { | 462 | if (connected) { |
| 462 | vgpu_vreg_t(vgpu, SFUSE_STRAP) |= | 463 | vgpu_vreg_t(vgpu, SFUSE_STRAP) |= |
| 463 | SFUSE_STRAP_DDID_DETECTED; | 464 | SFUSE_STRAP_DDID_DETECTED; |
| @@ -147,15 +147,14 @@ static void virt_vbt_generation(struct vbt *v) · 146 unmodified lines | |||
| 147 | /* there's features depending on version! */ | 147 | /* there's features depending on version! */ |
| 148 | v->header.version = 155; | 148 | v->header.version = 155; |
| 149 | v->header.header_size = sizeof(v->header); | 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 | v->header.bdb_offset = offsetof(struct vbt, bdb_header); | 151 | v->header.bdb_offset = offsetof(struct vbt, bdb_header); |
| 152 | 152 | ||
| 153 | strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK"); | 153 | strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK"); |
| 154 | v->bdb_header.version = 186; /* child_dev_size = 33 */ | 154 | v->bdb_header.version = 186; /* child_dev_size = 33 */ |
| 155 | v->bdb_header.header_size = sizeof(v->bdb_header); | 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) | 157 | v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header); |
| 158 | - sizeof(struct bdb_header); | ||
| 159 | 158 | ||
| 160 | /* general features */ | 159 | /* general features */ |
| 161 | v->general_features_header.id = BDB_GENERAL_FEATURES; | 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 | struct intel_gvt *gvt = vgpu->gvt; | 273 | struct intel_gvt *gvt = vgpu->gvt; |
| 274 | 274 | ||
| 275 | mutex_lock(&vgpu->vgpu_lock); | ||
| 276 | |||
| 277 | WARN(vgpu->active, "vGPU is still active!\n"); | 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 | intel_gvt_debugfs_remove_vgpu(vgpu); | 286 | intel_gvt_debugfs_remove_vgpu(vgpu); |
| 280 | intel_vgpu_clean_sched_policy(vgpu); | 287 | intel_vgpu_clean_sched_policy(vgpu); |
| 281 | intel_vgpu_clean_submission(vgpu); | 288 | intel_vgpu_clean_submission(vgpu); |
| @@ -290,7 +297,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) · 8 unmodified lines | |||
| 290 | mutex_unlock(&vgpu->vgpu_lock); | 297 | mutex_unlock(&vgpu->vgpu_lock); |
| 291 | 298 | ||
| 292 | mutex_lock(&gvt->lock); | 299 | mutex_lock(&gvt->lock); |
| 293 | idr_remove(&gvt->vgpu_idr, vgpu->id); | ||
| 294 | if (idr_is_empty(&gvt->vgpu_idr)) | 300 | if (idr_is_empty(&gvt->vgpu_idr)) |
| 295 | intel_gvt_clean_irq(gvt); | 301 | intel_gvt_clean_irq(gvt); |
| 296 | intel_gvt_update_vgpu_types(gvt); | 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 | return NOTIFY_DONE; | 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 | static int __i915_sw_fence_call | 539 | static int __i915_sw_fence_call |
| 531 | semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state) | 540 | semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state) |
| 532 | { | 541 | { |
| 533 | struct i915_request *request = | 542 | struct i915_request *rq = container_of(fence, typeof(*rq), semaphore); |
| 534 | container_of(fence, typeof(*request), semaphore); | ||
| 535 | 543 | ||
| 536 | switch (state) { | 544 | switch (state) { |
| 537 | case FENCE_COMPLETE: | 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 | break; | 551 | break; |
| 540 | 552 | ||
| 541 | case FENCE_FREE: | 553 | case FENCE_FREE: |
| 542 | i915_request_put(request); | 554 | i915_request_put(rq); |
| 543 | break; | 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 | struct dma_fence *fence; | 788 | struct dma_fence *fence; |
| 777 | int err; | 789 | int err; |
| 778 | 790 | ||
| 779 | GEM_BUG_ON(i915_request_timeline(rq) == | 791 | if (i915_request_timeline(rq) == rcu_access_pointer(signal->timeline)) |
| 780 | rcu_access_pointer(signal->timeline)); | 792 | return 0; |
| 781 | 793 | ||
| 782 | if (i915_request_started(signal)) | 794 | if (i915_request_started(signal)) |
| 783 | return 0; | 795 | return 0; |
| @@ -821,7 +833,7 @@ i915_request_await_start(struct i915_request *rq, struct i915_request *signal) · 37 unmodified lines | |||
| 821 | return 0; | 833 | return 0; |
| 822 | 834 | ||
| 823 | err = 0; | 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 | err = i915_sw_fence_await_dma_fence(&rq->submit, | 837 | err = i915_sw_fence_await_dma_fence(&rq->submit, |
| 826 | fence, 0, | 838 | fence, 0, |
| 827 | I915_FENCE_GFP); | 839 | I915_FENCE_GFP); |
| @@ -1318,9 +1330,9 @@ void __i915_request_queue(struct i915_request *rq, · 490 unmodified lines | |||
| 1318 | * decide whether to preempt the entire chain so that it is ready to | 1330 | * decide whether to preempt the entire chain so that it is ready to |
| 1319 | * run at the earliest possible convenience. | 1331 | * run at the earliest possible convenience. |
| 1320 | */ | 1332 | */ |
| 1321 | i915_sw_fence_commit(&rq->semaphore); | ||
| 1322 | if (attr && rq->engine->schedule) | 1333 | if (attr && rq->engine->schedule) |
| 1323 | rq->engine->schedule(rq, attr); | 1334 | rq->engine->schedule(rq, attr); |
| 1335 | i915_sw_fence_commit(&rq->semaphore); | ||
| 1324 | i915_sw_fence_commit(&rq->submit); | 1336 | i915_sw_fence_commit(&rq->submit); |
| 1325 | } | 1337 | } |
| 1326 | 1338 | ||
| @@ -26,6 +26,7 @@ · 25 unmodified lines | |||
| 26 | #define I915_REQUEST_H | 26 | #define I915_REQUEST_H |
| 27 | 27 | ||
| 28 | #include <linux/dma-fence.h> | 28 | #include <linux/dma-fence.h> |
| 29 | #include <linux/irq_work.h> | ||
| 29 | #include <linux/lockdep.h> | 30 | #include <linux/lockdep.h> |
| 30 | 31 | ||
| 31 | #include "gem/i915_gem_context_types.h" | 32 | #include "gem/i915_gem_context_types.h" |
| @@ -208,6 +209,7 @@ struct i915_request { · 176 unmodified lines | |||
| 208 | }; | 209 | }; |
| 209 | struct list_head execute_cb; | 210 | struct list_head execute_cb; |
| 210 | struct i915_sw_fence semaphore; | 211 | struct i915_sw_fence semaphore; |
| 212 | struct irq_work semaphore_work; | ||
| 211 | 213 | ||
| 212 | /* | 214 | /* |
| 213 | * A list of everyone we wait upon, and everyone who waits upon us. | 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 | __idx; \ | 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 | static inline void __list_del_many(struct list_head *head, | 242 | static inline void __list_del_many(struct list_head *head, |
| 238 | struct list_head *first) | 243 | struct list_head *first) |
| 239 | { | 244 | { |
| @@ -532,6 +532,8 @@ static const struct hid_device_id hammer_devices[] = { · 531 unmodified lines | |||
| 532 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) }, | 532 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) }, |
| 533 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | 533 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| 534 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MASTERBALL) }, | 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 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | 537 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| 536 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_STAFF) }, | 538 | USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_STAFF) }, |
| 537 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | 539 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, |
| @@ -478,6 +478,7 @@ · 477 unmodified lines | |||
| 478 | #define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030 | 478 | #define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030 |
| 479 | #define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c | 479 | #define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c |
| 480 | #define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d | 480 | #define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d |
| 481 | #define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044 | ||
| 481 | 482 | ||
| 482 | #define USB_VENDOR_ID_GOTOP 0x08f2 | 483 | #define USB_VENDOR_ID_GOTOP 0x08f2 |
| 483 | #define USB_DEVICE_ID_SUPER_Q2 0x007f | 484 | #define USB_DEVICE_ID_SUPER_Q2 0x007f |
| @@ -726,6 +727,7 @@ · 242 unmodified lines | |||
| 726 | #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 | 727 | #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 |
| 727 | #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 | 728 | #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 |
| 728 | #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 | 729 | #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 |
| 730 | #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d | ||
| 729 | 731 | ||
| 730 | #define USB_VENDOR_ID_LG 0x1fd2 | 732 | #define USB_VENDOR_ID_LG 0x1fd2 |
| 731 | #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 | 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 | if (ret >= PAGE_SIZE) | 458 | if (ret >= PAGE_SIZE) |
| 459 | break; | 459 | break; |
| 460 | else if (i == fb_update_rate) | 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 | else | 462 | else |
| 463 | ret += snprintf(buf+ret, PAGE_SIZE-ret, "%u ", i); | 463 | ret += scnprintf(buf+ret, PAGE_SIZE-ret, "%u ", i); |
| 464 | if (ret > 0) | 464 | if (ret > 0) |
| 465 | buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n'; | 465 | buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n'; |
| 466 | return ret; | 466 | return ret; |
| @@ -103,6 +103,7 @@ static const struct hid_device_id hid_quirks[] = { · 102 unmodified lines | |||
| 103 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, | 103 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, |
| 104 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, | 104 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, |
| 105 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, | 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 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007), HID_QUIRK_ALWAYS_POLL }, | 107 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C007), HID_QUIRK_ALWAYS_POLL }, |
| 107 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077), HID_QUIRK_ALWAYS_POLL }, | 108 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077), HID_QUIRK_ALWAYS_POLL }, |
| 108 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KEYBOARD_G710_PLUS), HID_QUIRK_NOGET }, | 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 | while (i < ret) { | 314 | while (i < ret) { |
| 315 | if (i + attribute->size > ret) { | 315 | if (i + attribute->size > ret) { |
| 316 | len += snprintf(&buf[len], | 316 | len += scnprintf(&buf[len], |
| 317 | PAGE_SIZE - len, | 317 | PAGE_SIZE - len, |
| 318 | "%d ", values[i]); | 318 | "%d ", values[i]); |
| 319 | break; | 319 | break; |
| @@ -336,10 +336,10 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr, · 16 unmodified lines | |||
| 336 | ++i; | 336 | ++i; |
| 337 | break; | 337 | break; |
| 338 | } | 338 | } |
| 339 | len += snprintf(&buf[len], PAGE_SIZE - len, | 339 | len += scnprintf(&buf[len], PAGE_SIZE - len, |
| 340 | "%lld ", value); | 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 | return len; | 344 | return len; |
| 345 | } else if (input) | 345 | } else if (input) |
| @@ -719,9 +719,6 @@ static int msc_win_set_lockout(struct msc_window *win, · 718 unmodified lines | |||
| 719 | 719 | ||
| 720 | if (old != expect) { | 720 | if (old != expect) { |
| 721 | ret = -EINVAL; | 721 | ret = -EINVAL; |
| 722 | dev_warn_ratelimited(msc_dev(win->msc), | ||
| 723 | "expected lockout state %d, got %d\n", | ||
| 724 | expect, old); | ||
| 725 | goto unlock; | 722 | goto unlock; |
| 726 | } | 723 | } |
| 727 | 724 | ||
| @@ -742,6 +739,10 @@ unlock: · 14 unmodified lines | |||
| 742 | /* from intel_th_msc_window_unlock(), don't warn if not locked */ | 739 | /* from intel_th_msc_window_unlock(), don't warn if not locked */ |
| 743 | if (expect == WIN_LOCKED && old == new) | 740 | if (expect == WIN_LOCKED && old == new) |
| 744 | return 0; | 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 | return ret; | 748 | return ret; |
| @@ -761,7 +762,7 @@ static int msc_configure(struct msc *msc) · 13 unmodified lines | |||
| 761 | lockdep_assert_held(&msc->buf_mutex); | 762 | lockdep_assert_held(&msc->buf_mutex); |
| 762 | 763 | ||
| 763 | if (msc->mode > MSC_MODE_MULTI) | 764 | if (msc->mode > MSC_MODE_MULTI) |
| 764 | return -ENOTSUPP; | 765 | return -EINVAL; |
| 765 | 766 | ||
| 766 | if (msc->mode == MSC_MODE_MULTI) { | 767 | if (msc->mode == MSC_MODE_MULTI) { |
| 767 | if (msc_win_set_lockout(msc->cur_win, WIN_READY, WIN_INUSE)) | 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 | } else if (msc->mode == MSC_MODE_MULTI) { | 1296 | } else if (msc->mode == MSC_MODE_MULTI) { |
| 1296 | ret = msc_buffer_multi_alloc(msc, nr_pages, nr_wins); | 1297 | ret = msc_buffer_multi_alloc(msc, nr_pages, nr_wins); |
| 1297 | } else { | 1298 | } else { |
| 1298 | ret = -ENOTSUPP; | 1299 | ret = -EINVAL; |
| 1299 | } | 1300 | } |
| 1300 | 1301 | ||
| 1301 | if (!ret) { | 1302 | if (!ret) { |
| @@ -1531,7 +1532,7 @@ static ssize_t intel_th_msc_read(struct file *file, char __user *buf, · 229 unmodified lines | |||
| 1531 | if (ret >= 0) | 1532 | if (ret >= 0) |
| 1532 | *ppos = iter->offset; | 1533 | *ppos = iter->offset; |
| 1533 | } else { | 1534 | } else { |
| 1534 | ret = -ENOTSUPP; | 1535 | ret = -EINVAL; |
| 1535 | } | 1536 | } |
| 1536 | 1537 | ||
| 1537 | put_count: | 1538 | put_count: |
| @@ -238,6 +238,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { · 237 unmodified lines | |||
| 238 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), | 238 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), |
| 239 | .driver_data = (kernel_ulong_t)&intel_th_2x, | 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 | /* Elkhart Lake */ | 247 | /* Elkhart Lake */ |
| 243 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), | 248 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), |
| @@ -238,7 +238,7 @@ static struct configfs_attribute *sys_t_policy_attrs[] = { · 237 unmodified lines | |||
| 238 | static inline bool sys_t_need_ts(struct sys_t_output *op) | 238 | static inline bool sys_t_need_ts(struct sys_t_output *op) |
| 239 | { | 239 | { |
| 240 | if (op->node.ts_interval && | 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 | op->ts_jiffies = jiffies; | 242 | op->ts_jiffies = jiffies; |
| 243 | 243 | ||
| 244 | return true; | 244 | return true; |
| @@ -250,8 +250,8 @@ static inline bool sys_t_need_ts(struct sys_t_output *op) · 5 unmodified lines | |||
| 250 | static bool sys_t_need_clock_sync(struct sys_t_output *op) | 250 | static bool sys_t_need_clock_sync(struct sys_t_output *op) |
| 251 | { | 251 | { |
| 252 | if (op->node.clocksync_interval && | 252 | if (op->node.clocksync_interval && |
| 253 | time_after(op->clocksync_jiffies + op->node.clocksync_interval, | 253 | time_after(jiffies, |
| 254 | jiffies)) { | 254 | op->clocksync_jiffies + op->node.clocksync_interval)) { |
| 255 | op->clocksync_jiffies = jiffies; | 255 | op->clocksync_jiffies = jiffies; |
| 256 | 256 | ||
| 257 | return true; | 257 | return true; |
| @@ -313,6 +313,7 @@ static void i2c_dw_pci_remove(struct pci_dev *pdev) · 312 unmodified lines | |||
| 313 | pm_runtime_get_noresume(&pdev->dev); | 313 | pm_runtime_get_noresume(&pdev->dev); |
| 314 | 314 | ||
| 315 | i2c_del_adapter(&dev->adapter); | 315 | i2c_del_adapter(&dev->adapter); |
| 316 | devm_free_irq(&pdev->dev, dev->irq, dev); | ||
| 316 | pci_free_irq_vectors(pdev); | 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 | if (ret == -ENOENT) | 348 | if (ret == -ENOENT) |
| 349 | retdesc = ERR_PTR(-EPROBE_DEFER); | 349 | retdesc = ERR_PTR(-EPROBE_DEFER); |
| 350 | 350 | ||
| 351 | if (ret != -EPROBE_DEFER) | 351 | if (PTR_ERR(retdesc) != -EPROBE_DEFER) |
| 352 | dev_err(dev, "error trying to get descriptor: %d\n", ret); | 352 | dev_err(dev, "error trying to get descriptor: %d\n", ret); |
| 353 | 353 | ||
| 354 | return retdesc; | 354 | return retdesc; |
| @@ -132,11 +132,6 @@ · 131 unmodified lines | |||
| 132 | #define TCOBASE 0x050 | 132 | #define TCOBASE 0x050 |
| 133 | #define TCOCTL 0x054 | 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 | #define SBREG_BAR 0x10 | 135 | #define SBREG_BAR 0x10 |
| 141 | #define SBREG_SMBCTRL 0xc6000c | 136 | #define SBREG_SMBCTRL 0xc6000c |
| 142 | #define SBREG_SMBCTRL_DNV 0xcf000c | 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 | pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); | 1548 | pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); |
| 1554 | spin_unlock(&p2sb_spinlock); | 1549 | spin_unlock(&p2sb_spinlock); |
| 1555 | 1550 | ||
| 1556 | res = &tco_res[ICH_RES_MEM_OFF]; | 1551 | res = &tco_res[1]; |
| 1557 | if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) | 1552 | if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) |
| 1558 | res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; | 1553 | res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; |
| 1559 | else | 1554 | else |
| @@ -1563,7 +1558,7 @@ i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, · 3 unmodified lines | |||
| 1563 | res->flags = IORESOURCE_MEM; | 1558 | res->flags = IORESOURCE_MEM; |
| 1564 | 1559 | ||
| 1565 | return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, | 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 | sizeof(spt_tco_platform_data)); | 1562 | sizeof(spt_tco_platform_data)); |
| 1568 | } | 1563 | } |
| 1569 | 1564 | ||
| @@ -1576,17 +1571,16 @@ static struct platform_device * · 6 unmodified lines | |||
| 1576 | i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, | 1571 | i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, |
| 1577 | struct resource *tco_res) | 1572 | struct resource *tco_res) |
| 1578 | { | 1573 | { |
| 1579 | return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, | 1574 | return platform_device_register_resndata(&pci_dev->dev, |
| 1580 | tco_res, 2, &cnl_tco_platform_data, | 1575 | "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, |
| 1581 | sizeof(cnl_tco_platform_data)); | 1576 | sizeof(cnl_tco_platform_data)); |
| 1582 | } | 1577 | } |
| 1583 | 1578 | ||
| 1584 | static void i801_add_tco(struct i801_priv *priv) | 1579 | static void i801_add_tco(struct i801_priv *priv) |
| 1585 | { | 1580 | { |
| 1586 | u32 base_addr, tco_base, tco_ctl, ctrl_val; | ||
| 1587 | struct pci_dev *pci_dev = priv->pci_dev; | 1581 | struct pci_dev *pci_dev = priv->pci_dev; |
| 1588 | struct resource tco_res[3], *res; | 1582 | struct resource tco_res[2], *res; |
| 1589 | unsigned int devfn; | 1583 | u32 tco_base, tco_ctl; |
| 1590 | 1584 | ||
| 1591 | /* If we have ACPI based watchdog use that instead */ | 1585 | /* If we have ACPI based watchdog use that instead */ |
| 1592 | if (acpi_has_watchdog()) | 1586 | if (acpi_has_watchdog()) |
| @@ -1601,30 +1595,15 @@ static void i801_add_tco(struct i801_priv *priv) · 8 unmodified lines | |||
| 1601 | return; | 1595 | return; |
| 1602 | 1596 | ||
| 1603 | memset(tco_res, 0, sizeof(tco_res)); | 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); | 1602 | res = &tco_res[0]; |
| 1614 | pci_bus_read_config_dword(pci_dev->bus, devfn, ACPIBASE, &base_addr); | 1603 | res->start = tco_base & ~1; |
| 1615 | 1604 | res->end = res->start + 32 - 1; | |
| 1616 | res = &tco_res[ICH_RES_IO_SMI]; | ||
| 1617 | res->start = (base_addr & ~1) + ACPIBASE_SMI_OFF; | ||
| 1618 | res->end = res->start + 3; | ||
| 1619 | res->flags = IORESOURCE_IO; | 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 | if (priv->features & FEATURE_TCO_CNL) | 1607 | if (priv->features & FEATURE_TCO_CNL) |
| 1629 | priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); | 1608 | priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); |
| 1630 | else | 1609 | else |
| @@ -394,9 +394,17 @@ EXPORT_SYMBOL_GPL(i2c_acpi_find_adapter_by_handle); · 393 unmodified lines | |||
| 394 | static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev) | 394 | static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev) |
| 395 | { | 395 | { |
| 396 | struct device *dev; | 396 | struct device *dev; |
| 397 | struct i2c_client *client; | ||
| 397 | 398 | ||
| 398 | dev = bus_find_device_by_acpi_dev(&i2c_bus_type, adev); | 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 | static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value, | 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 | .realbits = 12, \ | 237 | .realbits = 12, \ |
| 238 | .storagebits = 16, \ | 238 | .storagebits = 16, \ |
| 239 | .shift = 4, \ | 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 | #ifdef CONFIG_ACPI | 111 | #ifdef CONFIG_ACPI |
| 112 | static const struct acpi_device_id st_accel_acpi_match[] = { | 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 | {"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME}, | 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 | for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { | 724 | for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { |
| 725 | struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); | 725 | struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); |
| 726 | u32 cor; | ||
| 726 | 727 | ||
| 727 | if (!chan) | 728 | if (!chan) |
| 728 | continue; | 729 | continue; |
| @@ -731,6 +732,20 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) · 2 unmodified lines | |||
| 731 | chan->type == IIO_PRESSURE) | 732 | chan->type == IIO_PRESSURE) |
| 732 | continue; | 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 | if (state) { | 749 | if (state) { |
| 735 | at91_adc_writel(st, AT91_SAMA5D2_CHER, | 750 | at91_adc_writel(st, AT91_SAMA5D2_CHER, |
| 736 | BIT(chan->channel)); | 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 | static void stm32_dfsdm_dma_buffer_done(void *data) | 845 | static void stm32_dfsdm_dma_buffer_done(void *data) |
| 871 | { | 846 | { |
| 872 | struct iio_dev *indio_dev = data; | 847 | struct iio_dev *indio_dev = data; |
| @@ -874,11 +849,6 @@ static void stm32_dfsdm_dma_buffer_done(void *data) · 1 unmodified line | |||
| 874 | int available = stm32_dfsdm_adc_dma_residue(adc); | 849 | int available = stm32_dfsdm_adc_dma_residue(adc); |
| 875 | size_t old_pos; | 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 | * FIXME: In Kernel interface does not support cyclic DMA buffer,and | 853 | * FIXME: In Kernel interface does not support cyclic DMA buffer,and |
| 884 | * offers only an interface to push data samples per samples. | 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 | adc->bufi = 0; | 876 | adc->bufi = 0; |
| 907 | old_pos = 0; | 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 | if (adc->dev_data->type == DFSDM_IIO) | 888 | if (adc->dev_data->type == DFSDM_IIO) |
| 911 | iio_push_to_buffers(indio_dev, buffer); | 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 | ret = iio_triggered_buffer_setup(indio_dev, | 1516 | ret = iio_triggered_buffer_setup(indio_dev, |
| 1539 | &iio_pollfunc_store_time, | 1517 | &iio_pollfunc_store_time, NULL, |
| 1540 | &stm32_dfsdm_adc_trigger_handler, | ||
| 1541 | &stm32_dfsdm_buffer_setup_ops); | 1518 | &stm32_dfsdm_buffer_setup_ops); |
| 1542 | if (ret) { | 1519 | if (ret) { |
| 1543 | stm32_dfsdm_dma_release(indio_dev); | 1520 | stm32_dfsdm_dma_release(indio_dev); |
| @@ -91,6 +91,8 @@ config SPS30 · 90 unmodified lines | |||
| 91 | tristate "SPS30 particulate matter sensor" | 91 | tristate "SPS30 particulate matter sensor" |
| 92 | depends on I2C | 92 | depends on I2C |
| 93 | select CRC8 | 93 | select CRC8 |
| 94 | select IIO_BUFFER | ||
| 95 | select IIO_TRIGGERED_BUFFER | ||
| 94 | help | 96 | help |
| 95 | Say Y here to build support for the Sensirion SPS30 particulate | 97 | Say Y here to build support for the Sensirion SPS30 particulate |
| 96 | matter sensor. | 98 | matter sensor. |
| @@ -167,16 +167,17 @@ static int vcnl4200_init(struct vcnl4000_data *data) · 166 unmodified lines | |||
| 167 | data->vcnl4200_ps.reg = VCNL4200_PS_DATA; | 167 | data->vcnl4200_ps.reg = VCNL4200_PS_DATA; |
| 168 | switch (id) { | 168 | switch (id) { |
| 169 | case VCNL4200_PROD_ID: | 169 | case VCNL4200_PROD_ID: |
| 170 | /* Integration time is 50ms, but the experiments */ | 170 | /* Default wait time is 50ms, add 20% tolerance. */ |
| 171 | /* show 54ms in total. */ | 171 | data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000); |
| 172 | data->vcnl4200_al.sampling_rate = ktime_set(0, 54000 * 1000); | 172 | /* Default wait time is 4.8ms, add 20% tolerance. */ |
| 173 | data->vcnl4200_ps.sampling_rate = ktime_set(0, 4200 * 1000); | 173 | data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000); |
| 174 | data->al_scale = 24000; | 174 | data->al_scale = 24000; |
| 175 | break; | 175 | break; |
| 176 | case VCNL4040_PROD_ID: | 176 | case VCNL4040_PROD_ID: |
| 177 | /* Integration time is 80ms, add 10ms. */ | 177 | /* Default wait time is 80ms, add 20% tolerance. */ |
| 178 | data->vcnl4200_al.sampling_rate = ktime_set(0, 100000 * 1000); | 178 | data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000); |
| 179 | data->vcnl4200_ps.sampling_rate = ktime_set(0, 100000 * 1000); | 179 | /* Default wait time is 5ms, add 20% tolerance. */ |
| 180 | data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000); | ||
| 180 | data->al_scale = 120000; | 181 | data->al_scale = 120000; |
| 181 | break; | 182 | break; |
| 182 | } | 183 | } |
| @@ -564,7 +564,7 @@ static int ak8974_read_raw(struct iio_dev *indio_dev, · 563 unmodified lines | |||
| 564 | * We read all axes and discard all but one, for optimized | 564 | * We read all axes and discard all but one, for optimized |
| 565 | * reading, use the triggered buffer. | 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 | ret = IIO_VAL_INT; | 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 | static const struct of_device_id of_ping_match[] = { | 270 | static const struct of_device_id of_ping_match[] = { |
| 271 | { .compatible = "parallax,ping", .data = &pa_ping_cfg}, | 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 | return 0; | 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 | u32 ccer, cr1; | 167 | u32 ccer, cr1; |
| 167 | 168 | ||
| @@ -179,6 +180,12 @@ static void stm32_timer_stop(struct stm32_timer_trigger *priv) · 11 unmodified lines | |||
| 179 | regmap_write(priv->regmap, TIM_PSC, 0); | 180 | regmap_write(priv->regmap, TIM_PSC, 0); |
| 180 | regmap_write(priv->regmap, TIM_ARR, 0); | 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 | /* Make sure that registers are updated */ | 189 | /* Make sure that registers are updated */ |
| 183 | regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); | 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 | return ret; | 204 | return ret; |
| 198 | 205 | ||
| 199 | if (freq == 0) { | 206 | if (freq == 0) { |
| 200 | stm32_timer_stop(priv); | 207 | stm32_timer_stop(priv, trig); |
| 201 | } else { | 208 | } else { |
| 202 | ret = stm32_timer_start(priv, trig, freq); | 209 | ret = stm32_timer_start(priv, trig, freq); |
| 203 | if (ret) | 210 | if (ret) |
| @@ -3826,7 +3826,7 @@ int amd_iommu_activate_guest_mode(void *data) · 3825 unmodified lines | |||
| 3826 | entry->lo.fields_vapic.ga_tag = ir_data->ga_tag; | 3826 | entry->lo.fields_vapic.ga_tag = ir_data->ga_tag; |
| 3827 | 3827 | ||
| 3828 | return modify_irte_ga(ir_data->irq_2_irte.devid, | 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 | EXPORT_SYMBOL(amd_iommu_activate_guest_mode); | 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 | APICID_TO_IRTE_DEST_HI(cfg->dest_apicid); | 3852 | APICID_TO_IRTE_DEST_HI(cfg->dest_apicid); |
| 3853 | 3853 | ||
| 3854 | return modify_irte_ga(ir_data->irq_2_irte.devid, | 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 | EXPORT_SYMBOL(amd_iommu_deactivate_guest_mode); | 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 | start -= iova_offset(iovad, start); | 177 | start -= iova_offset(iovad, start); |
| 178 | num_pages = iova_align(iovad, end - start) >> iova_shift(iovad); | 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 | for (i = 0; i < num_pages; i++) { | 180 | for (i = 0; i < num_pages; i++) { |
| 185 | msi_page[i].phys = start; | 181 | msi_page = kmalloc(sizeof(*msi_page), GFP_KERNEL); |
| 186 | msi_page[i].iova = start; | 182 | if (!msi_page) |
| 187 | INIT_LIST_HEAD(&msi_page[i].list); | 183 | return -ENOMEM; |
| 188 | list_add(&msi_page[i].list, &cookie->msi_page_list); | 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 | start += iovad->granule; | 189 | start += iovad->granule; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| @@ -28,6 +28,7 @@ · 27 unmodified lines | |||
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <linux/iommu.h> | 29 | #include <linux/iommu.h> |
| 30 | #include <linux/numa.h> | 30 | #include <linux/numa.h> |
| 31 | #include <linux/limits.h> | ||
| 31 | #include <asm/irq_remapping.h> | 32 | #include <asm/irq_remapping.h> |
| 32 | #include <asm/iommu_table.h> | 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 | BUG_ON(dev->is_virtfn); | 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 | /* Only generate path[] for device addition event */ | 139 | /* Only generate path[] for device addition event */ |
| 132 | if (event == BUS_NOTIFY_ADD_DEVICE) | 140 | if (event == BUS_NOTIFY_ADD_DEVICE) |
| 133 | for (tmp = dev; tmp; tmp = tmp->bus->self) | 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 | struct dmar_drhd_unit *dmaru; | 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 | if (dmaru->segment == drhd->segment && | 376 | if (dmaru->segment == drhd->segment && |
| 368 | dmaru->reg_base_addr == drhd->address) | 377 | dmaru->reg_base_addr == drhd->address) |
| 369 | return dmaru; | 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 | /* Check for NUL termination within the designated length */ | 450 | /* Check for NUL termination within the designated length */ |
| 442 | if (strnlen(andd->device_name, header->length - 8) == header->length - 8) { | 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 | "Your BIOS is broken; ANDD object name is not NUL-terminated\n" | 453 | "Your BIOS is broken; ANDD object name is not NUL-terminated\n" |
| 445 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", | 454 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 446 | dmi_get_system_info(DMI_BIOS_VENDOR), | 455 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 447 | dmi_get_system_info(DMI_BIOS_VERSION), | 456 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 448 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | 457 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 458 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | ||
| 449 | return -EINVAL; | 459 | return -EINVAL; |
| 450 | } | 460 | } |
| 451 | pr_info("ANDD device: %x name: %s\n", andd->device_number, | 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 | return 0; | 481 | return 0; |
| 472 | } | 482 | } |
| 473 | } | 483 | } |
| 474 | WARN_TAINT( | 484 | pr_warn(FW_BUG |
| 475 | 1, TAINT_FIRMWARE_WORKAROUND, | ||
| 476 | "Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n" | 485 | "Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n" |
| 477 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", | 486 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 478 | drhd->reg_base_addr, | 487 | rhsa->base_address, |
| 479 | dmi_get_system_info(DMI_BIOS_VENDOR), | 488 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 480 | dmi_get_system_info(DMI_BIOS_VERSION), | 489 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 481 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | 490 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 491 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | ||
| 482 | 492 | ||
| 483 | return 0; | 493 | return 0; |
| 484 | } | 494 | } |
| @@ -827,14 +837,14 @@ int __init dmar_table_init(void) · 342 unmodified lines | |||
| 827 | 837 | ||
| 828 | static void warn_invalid_dmar(u64 addr, const char *message) | 838 | static void warn_invalid_dmar(u64 addr, const char *message) |
| 829 | { | 839 | { |
| 830 | WARN_TAINT_ONCE( | 840 | pr_warn_once(FW_BUG |
| 831 | 1, TAINT_FIRMWARE_WORKAROUND, | ||
| 832 | "Your BIOS is broken; DMAR reported at address %llx%s!\n" | 841 | "Your BIOS is broken; DMAR reported at address %llx%s!\n" |
| 833 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", | 842 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 834 | addr, message, | 843 | addr, message, |
| 835 | dmi_get_system_info(DMI_BIOS_VENDOR), | 844 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 836 | dmi_get_system_info(DMI_BIOS_VERSION), | 845 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 837 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | 846 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 847 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | ||
| 838 | } | 848 | } |
| 839 | 849 | ||
| 840 | static int __ref | 850 | static int __ref |
| @@ -33,38 +33,42 @@ struct iommu_regset { · 32 unmodified lines | |||
| 33 | 33 | ||
| 34 | #define IOMMU_REGSET_ENTRY(_reg_) \ | 34 | #define IOMMU_REGSET_ENTRY(_reg_) \ |
| 35 | { DMAR_##_reg_##_REG, __stringify(_reg_) } | 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 | IOMMU_REGSET_ENTRY(VER), | 38 | IOMMU_REGSET_ENTRY(VER), |
| 38 | IOMMU_REGSET_ENTRY(CAP), | ||
| 39 | IOMMU_REGSET_ENTRY(ECAP), | ||
| 40 | IOMMU_REGSET_ENTRY(GCMD), | 39 | IOMMU_REGSET_ENTRY(GCMD), |
| 41 | IOMMU_REGSET_ENTRY(GSTS), | 40 | IOMMU_REGSET_ENTRY(GSTS), |
| 42 | IOMMU_REGSET_ENTRY(RTADDR), | ||
| 43 | IOMMU_REGSET_ENTRY(CCMD), | ||
| 44 | IOMMU_REGSET_ENTRY(FSTS), | 41 | IOMMU_REGSET_ENTRY(FSTS), |
| 45 | IOMMU_REGSET_ENTRY(FECTL), | 42 | IOMMU_REGSET_ENTRY(FECTL), |
| 46 | IOMMU_REGSET_ENTRY(FEDATA), | 43 | IOMMU_REGSET_ENTRY(FEDATA), |
| 47 | IOMMU_REGSET_ENTRY(FEADDR), | 44 | IOMMU_REGSET_ENTRY(FEADDR), |
| 48 | IOMMU_REGSET_ENTRY(FEUADDR), | 45 | IOMMU_REGSET_ENTRY(FEUADDR), |
| 49 | IOMMU_REGSET_ENTRY(AFLOG), | ||
| 50 | IOMMU_REGSET_ENTRY(PMEN), | 46 | IOMMU_REGSET_ENTRY(PMEN), |
| 51 | IOMMU_REGSET_ENTRY(PLMBASE), | 47 | IOMMU_REGSET_ENTRY(PLMBASE), |
| 52 | IOMMU_REGSET_ENTRY(PLMLIMIT), | 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 | IOMMU_REGSET_ENTRY(PHMBASE), | 63 | IOMMU_REGSET_ENTRY(PHMBASE), |
| 54 | IOMMU_REGSET_ENTRY(PHMLIMIT), | 64 | IOMMU_REGSET_ENTRY(PHMLIMIT), |
| 55 | IOMMU_REGSET_ENTRY(IQH), | 65 | IOMMU_REGSET_ENTRY(IQH), |
| 56 | IOMMU_REGSET_ENTRY(IQT), | 66 | IOMMU_REGSET_ENTRY(IQT), |
| 57 | IOMMU_REGSET_ENTRY(IQA), | 67 | IOMMU_REGSET_ENTRY(IQA), |
| 58 | IOMMU_REGSET_ENTRY(ICS), | ||
| 59 | IOMMU_REGSET_ENTRY(IRTA), | 68 | IOMMU_REGSET_ENTRY(IRTA), |
| 60 | IOMMU_REGSET_ENTRY(PQH), | 69 | IOMMU_REGSET_ENTRY(PQH), |
| 61 | IOMMU_REGSET_ENTRY(PQT), | 70 | IOMMU_REGSET_ENTRY(PQT), |
| 62 | IOMMU_REGSET_ENTRY(PQA), | 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 | IOMMU_REGSET_ENTRY(MTRRCAP), | 72 | IOMMU_REGSET_ENTRY(MTRRCAP), |
| 69 | IOMMU_REGSET_ENTRY(MTRRDEF), | 73 | IOMMU_REGSET_ENTRY(MTRRDEF), |
| 70 | IOMMU_REGSET_ENTRY(MTRR_FIX64K_00000), | 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 | * by adding the offset to the pointer (virtual address). | 131 | * by adding the offset to the pointer (virtual address). |
| 128 | */ | 132 | */ |
| 129 | raw_spin_lock_irqsave(&iommu->register_lock, flag); | 133 | raw_spin_lock_irqsave(&iommu->register_lock, flag); |
| 130 | for (i = 0 ; i < ARRAY_SIZE(iommu_regs); i++) { | 134 | for (i = 0 ; i < ARRAY_SIZE(iommu_regs_32); i++) { |
| 131 | value = dmar_readq(iommu->reg + iommu_regs[i].offset); | 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 | seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n", | 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 | value); | 144 | value); |
| 135 | } | 145 | } |
| 136 | raw_spin_unlock_irqrestore(&iommu->register_lock, flag); | 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 | struct dmar_drhd_unit *drhd; | 283 | struct dmar_drhd_unit *drhd; |
| 274 | struct intel_iommu *iommu; | 284 | struct intel_iommu *iommu; |
| 285 | u32 sts; | ||
| 275 | 286 | ||
| 276 | rcu_read_lock(); | 287 | rcu_read_lock(); |
| 277 | for_each_active_iommu(iommu, drhd) { | 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 | root_tbl_walk(m, iommu); | 295 | root_tbl_walk(m, iommu); |
| 279 | seq_putc(m, '\n'); | 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 | struct dmar_drhd_unit *drhd; | 432 | struct dmar_drhd_unit *drhd; |
| 416 | struct intel_iommu *iommu; | 433 | struct intel_iommu *iommu; |
| 417 | u64 irta; | 434 | u64 irta; |
| 435 | u32 sts; | ||
| 418 | 436 | ||
| 419 | rcu_read_lock(); | 437 | rcu_read_lock(); |
| 420 | for_each_active_iommu(iommu, drhd) { | 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 | seq_printf(m, "Remapped Interrupt supported on IOMMU: %s\n", | 442 | seq_printf(m, "Remapped Interrupt supported on IOMMU: %s\n", |
| 425 | iommu->name); | 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 | irta = virt_to_phys(iommu->ir_table->base); | 447 | irta = virt_to_phys(iommu->ir_table->base); |
| 429 | seq_printf(m, " IR table address:%llx\n", irta); | 448 | seq_printf(m, " IR table address:%llx\n", irta); |
| 430 | ir_tbl_remap_entry_show(m, iommu); | 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 | /* we know that the this iommu should be at offset 0xa000 from vtbar */ | 4262 | /* we know that the this iommu should be at offset 0xa000 from vtbar */ |
| 4263 | drhd = dmar_find_matched_drhd_unit(pdev); | 4263 | drhd = dmar_find_matched_drhd_unit(pdev); |
| 4264 | if (WARN_TAINT_ONCE(!drhd || drhd->reg_base_addr - vtbar != 0xa000, | 4264 | if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) { |
| 4265 | TAINT_FIRMWARE_WORKAROUND, | 4265 | pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"); |
| 4266 | "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n")) | 4266 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); |
| 4267 | pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; | 4267 | pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; |
| 4268 | } | ||
| 4268 | } | 4269 | } |
| 4269 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu); | 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 | struct dmar_rmrr_unit *rmrru; | 4461 | struct dmar_rmrr_unit *rmrru; |
| 4461 | 4462 | ||
| 4462 | rmrr = (struct acpi_dmar_reserved_memory *)header; | 4463 | rmrr = (struct acpi_dmar_reserved_memory *)header; |
| 4463 | if (rmrr_sanity_check(rmrr)) | 4464 | if (rmrr_sanity_check(rmrr)) { |
| 4464 | WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, | 4465 | pr_warn(FW_BUG |
| 4465 | "Your BIOS is broken; bad RMRR [%#018Lx-%#018Lx]\n" | 4466 | "Your BIOS is broken; bad RMRR [%#018Lx-%#018Lx]\n" |
| 4466 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", | 4467 | "BIOS vendor: %s; Ver: %s; Product Version: %s\n", |
| 4467 | rmrr->base_address, rmrr->end_address, | 4468 | rmrr->base_address, rmrr->end_address, |
| 4468 | dmi_get_system_info(DMI_BIOS_VENDOR), | 4469 | dmi_get_system_info(DMI_BIOS_VENDOR), |
| 4469 | dmi_get_system_info(DMI_BIOS_VERSION), | 4470 | dmi_get_system_info(DMI_BIOS_VERSION), |
| 4470 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | 4471 | dmi_get_system_info(DMI_PRODUCT_VERSION)); |
| 4472 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | ||
| 4473 | } | ||
| 4471 | 4474 | ||
| 4472 | rmrru = kzalloc(sizeof(*rmrru), GFP_KERNEL); | 4475 | rmrru = kzalloc(sizeof(*rmrru), GFP_KERNEL); |
| 4473 | if (!rmrru) | 4476 | if (!rmrru) |
| @@ -5130,6 +5133,9 @@ int __init intel_iommu_init(void) · 656 unmodified lines | |||
| 5130 | 5133 | ||
| 5131 | down_write(&dmar_global_lock); | 5134 | down_write(&dmar_global_lock); |
| 5132 | 5135 | ||
| 5136 | if (!no_iommu) | ||
| 5137 | intel_iommu_debugfs_init(); | ||
| 5138 | |||
| 5133 | if (no_iommu || dmar_disabled) { | 5139 | if (no_iommu || dmar_disabled) { |
| 5134 | /* | 5140 | /* |
| 5135 | * We exit the function here to ensure IOMMU's remapping and | 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 | init_iommu_pm_ops(); | 5200 | init_iommu_pm_ops(); |
| 5195 | 5201 | ||
| 5202 | down_read(&dmar_global_lock); | ||
| 5196 | for_each_active_iommu(iommu, drhd) { | 5203 | for_each_active_iommu(iommu, drhd) { |
| 5197 | iommu_device_sysfs_add(&iommu->iommu, NULL, | 5204 | iommu_device_sysfs_add(&iommu->iommu, NULL, |
| 5198 | intel_iommu_groups, | 5205 | intel_iommu_groups, |
| @@ -5200,6 +5207,7 @@ int __init intel_iommu_init(void) · 1 unmodified line | |||
| 5200 | iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops); | 5207 | iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops); |
| 5201 | iommu_device_register(&iommu->iommu); | 5208 | iommu_device_register(&iommu->iommu); |
| 5202 | } | 5209 | } |
| 5210 | up_read(&dmar_global_lock); | ||
| 5203 | 5211 | ||
| 5204 | bus_set_iommu(&pci_bus_type, &intel_iommu_ops); | 5212 | bus_set_iommu(&pci_bus_type, &intel_iommu_ops); |
| 5205 | if (si_domain && !hw_pass_through) | 5213 | if (si_domain && !hw_pass_through) |
| @@ -5210,7 +5218,6 @@ int __init intel_iommu_init(void) · 4 unmodified lines | |||
| 5210 | down_read(&dmar_global_lock); | 5218 | down_read(&dmar_global_lock); |
| 5211 | if (probe_acpi_namespace_devices()) | 5219 | if (probe_acpi_namespace_devices()) |
| 5212 | pr_warn("ACPI name space devices didn't probe correctly\n"); | 5220 | pr_warn("ACPI name space devices didn't probe correctly\n"); |
| 5213 | up_read(&dmar_global_lock); | ||
| 5214 | 5221 | ||
| 5215 | /* Finally, we enable the DMA remapping hardware. */ | 5222 | /* Finally, we enable the DMA remapping hardware. */ |
| 5216 | for_each_iommu(iommu, drhd) { | 5223 | for_each_iommu(iommu, drhd) { |
| @@ -5219,10 +5226,11 @@ int __init intel_iommu_init(void) · 2 unmodified lines | |||
| 5219 | 5226 | ||
| 5220 | iommu_disable_protect_mem_regions(iommu); | 5227 | iommu_disable_protect_mem_regions(iommu); |
| 5221 | } | 5228 | } |
| 5229 | up_read(&dmar_global_lock); | ||
| 5230 | |||
| 5222 | pr_info("Intel(R) Virtualization Technology for Directed I/O\n"); | 5231 | pr_info("Intel(R) Virtualization Technology for Directed I/O\n"); |
| 5223 | 5232 | ||
| 5224 | intel_iommu_enabled = 1; | 5233 | intel_iommu_enabled = 1; |
| 5225 | intel_iommu_debugfs_init(); | ||
| 5226 | 5234 | ||
| 5227 | return 0; | 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 | u64 phys = 0; | 5708 | u64 phys = 0; |
| 5701 | 5709 | ||
| 5702 | pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); | 5710 | pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); |
| 5703 | if (pte) | 5711 | if (pte && dma_pte_present(pte)) |
| 5704 | phys = dma_pte_addr(pte); | 5712 | phys = dma_pte_addr(pte) + |
| 5713 | (iova & (BIT_MASK(level_to_offset_bits(level) + | ||
| 5714 | VTD_PAGE_SHIFT) - 1)); | ||
| 5705 | 5715 | ||
| 5706 | return phys; | 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 | arm_lpae_iopte *ptep = data->pgd; | 468 | arm_lpae_iopte *ptep = data->pgd; |
| 469 | int ret, lvl = data->start_level; | 469 | int ret, lvl = data->start_level; |
| 470 | arm_lpae_iopte prot; | 470 | arm_lpae_iopte prot; |
| 471 | long iaext = (long)iova >> cfg->ias; | 471 | long iaext = (s64)iova >> cfg->ias; |
| 472 | 472 | ||
| 473 | /* If no access, then nothing to do */ | 473 | /* If no access, then nothing to do */ |
| 474 | if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE))) | 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 | struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); | 645 | struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); |
| 646 | struct io_pgtable_cfg *cfg = &data->iop.cfg; | 646 | struct io_pgtable_cfg *cfg = &data->iop.cfg; |
| 647 | arm_lpae_iopte *ptep = data->pgd; | 647 | arm_lpae_iopte *ptep = data->pgd; |
| 648 | long iaext = (long)iova >> cfg->ias; | 648 | long iaext = (s64)iova >> cfg->ias; |
| 649 | 649 | ||
| 650 | if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size)) | 650 | if (WARN_ON(!size || (size & cfg->pgsize_bitmap) != size)) |
| 651 | return 0; | 651 | return 0; |
| @@ -34,6 +34,7 @@ · 33 unmodified lines | |||
| 34 | #define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) | 34 | #define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) |
| 35 | 35 | ||
| 36 | #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0) | 36 | #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0) |
| 37 | #define FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539 (1ULL << 1) | ||
| 37 | 38 | ||
| 38 | struct redist_region { | 39 | struct redist_region { |
| 39 | void __iomem *redist_base; | 40 | void __iomem *redist_base; |
| @@ -1464,6 +1465,15 @@ static bool gic_enable_quirk_msm8996(void *data) · 1424 unmodified lines | |||
| 1464 | return true; | 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 | static bool gic_enable_quirk_hip06_07(void *data) | 1477 | static bool gic_enable_quirk_hip06_07(void *data) |
| 1468 | { | 1478 | { |
| 1469 | struct gic_chip_data *d = data; | 1479 | struct gic_chip_data *d = data; |
| @@ -1502,6 +1512,19 @@ static const struct gic_quirk gic_quirks[] = { · 32 unmodified lines | |||
| 1502 | .mask = 0xffffffff, | 1512 | .mask = 0xffffffff, |
| 1503 | .init = gic_enable_quirk_hip06_07, | 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 | pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32); | 1600 | pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32); |
| 1578 | pr_info("%d Extended SPIs implemented\n", GIC_ESPI_NR); | 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 | gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops, | 1610 | gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops, |
| 1583 | &gic_data); | 1611 | &gic_data); |
| @@ -312,9 +312,16 @@ static const struct i2c_device_id wf_ad7417_id[] = { · 311 unmodified lines | |||
| 312 | }; | 312 | }; |
| 313 | MODULE_DEVICE_TABLE(i2c, wf_ad7417_id); | 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 | static struct i2c_driver wf_ad7417_driver = { | 321 | static struct i2c_driver wf_ad7417_driver = { |
| 316 | .driver = { | 322 | .driver = { |
| 317 | .name = "wf_ad7417", | 323 | .name = "wf_ad7417", |
| 324 | .of_match_table = wf_ad7417_of_id, | ||
| 318 | }, | 325 | }, |
| 319 | .probe = wf_ad7417_probe, | 326 | .probe = wf_ad7417_probe, |
| 320 | .remove = wf_ad7417_remove, | 327 | .remove = wf_ad7417_remove, |
| @@ -580,9 +580,16 @@ static const struct i2c_device_id wf_fcu_id[] = { · 579 unmodified lines | |||
| 580 | }; | 580 | }; |
| 581 | MODULE_DEVICE_TABLE(i2c, wf_fcu_id); | 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 | static struct i2c_driver wf_fcu_driver = { | 589 | static struct i2c_driver wf_fcu_driver = { |
| 584 | .driver = { | 590 | .driver = { |
| 585 | .name = "wf_fcu", | 591 | .name = "wf_fcu", |
| 592 | .of_match_table = wf_fcu_of_id, | ||
| 586 | }, | 593 | }, |
| 587 | .probe = wf_fcu_probe, | 594 | .probe = wf_fcu_probe, |
| 588 | .remove = wf_fcu_remove, | 595 | .remove = wf_fcu_remove, |
| @@ -14,6 +14,7 @@ · 13 unmodified lines | |||
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/wait.h> | 15 | #include <linux/wait.h> |
| 16 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
| 17 | #include <linux/of_device.h> | ||
| 17 | #include <asm/prom.h> | 18 | #include <asm/prom.h> |
| 18 | #include <asm/machdep.h> | 19 | #include <asm/machdep.h> |
| 19 | #include <asm/io.h> | 20 | #include <asm/io.h> |
| @@ -91,9 +92,14 @@ static int wf_lm75_probe(struct i2c_client *client, · 71 unmodified lines | |||
| 91 | const struct i2c_device_id *id) | 92 | const struct i2c_device_id *id) |
| 92 | { | 93 | { |
| 93 | struct wf_lm75_sensor *lm; | 94 | struct wf_lm75_sensor *lm; |
| 94 | int rc, ds1775 = id->driver_data; | 95 | int rc, ds1775; |
| 95 | const char *name, *loc; | 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 | DBG("wf_lm75: creating %s device at address 0x%02x\n", | 103 | DBG("wf_lm75: creating %s device at address 0x%02x\n", |
| 98 | ds1775 ? "ds1775" : "lm75", client->addr); | 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 | MODULE_DEVICE_TABLE(i2c, wf_lm75_id); | 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 | static struct i2c_driver wf_lm75_driver = { | 180 | static struct i2c_driver wf_lm75_driver = { |
| 168 | .driver = { | 181 | .driver = { |
| 169 | .name = "wf_lm75", | 182 | .name = "wf_lm75", |
| 183 | .of_match_table = wf_lm75_of_id, | ||
| 170 | }, | 184 | }, |
| 171 | .probe = wf_lm75_probe, | 185 | .probe = wf_lm75_probe, |
| 172 | .remove = wf_lm75_remove, | 186 | .remove = wf_lm75_remove, |
| @@ -166,9 +166,16 @@ static const struct i2c_device_id wf_lm87_id[] = { · 165 unmodified lines | |||
| 166 | }; | 166 | }; |
| 167 | MODULE_DEVICE_TABLE(i2c, wf_lm87_id); | 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 | static struct i2c_driver wf_lm87_driver = { | 175 | static struct i2c_driver wf_lm87_driver = { |
| 170 | .driver = { | 176 | .driver = { |
| 171 | .name = "wf_lm87", | 177 | .name = "wf_lm87", |
| 178 | .of_match_table = wf_lm87_of_id, | ||
| 172 | }, | 179 | }, |
| 173 | .probe = wf_lm87_probe, | 180 | .probe = wf_lm87_probe, |
| 174 | .remove = wf_lm87_remove, | 181 | .remove = wf_lm87_remove, |
| @@ -120,9 +120,16 @@ static const struct i2c_device_id wf_max6690_id[] = { · 119 unmodified lines | |||
| 120 | }; | 120 | }; |
| 121 | MODULE_DEVICE_TABLE(i2c, wf_max6690_id); | 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 | static struct i2c_driver wf_max6690_driver = { | 129 | static struct i2c_driver wf_max6690_driver = { |
| 124 | .driver = { | 130 | .driver = { |
| 125 | .name = "wf_max6690", | 131 | .name = "wf_max6690", |
| 132 | .of_match_table = wf_max6690_of_id, | ||
| 126 | }, | 133 | }, |
| 127 | .probe = wf_max6690_probe, | 134 | .probe = wf_max6690_probe, |
| 128 | .remove = wf_max6690_remove, | 135 | .remove = wf_max6690_remove, |
| @@ -341,9 +341,16 @@ static const struct i2c_device_id wf_sat_id[] = { · 340 unmodified lines | |||
| 341 | }; | 341 | }; |
| 342 | MODULE_DEVICE_TABLE(i2c, wf_sat_id); | 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 | static struct i2c_driver wf_sat_driver = { | 350 | static struct i2c_driver wf_sat_driver = { |
| 345 | .driver = { | 351 | .driver = { |
| 346 | .name = "wf_smu_sat", | 352 | .name = "wf_smu_sat", |
| 353 | .of_match_table = wf_sat_of_id, | ||
| 347 | }, | 354 | }, |
| 348 | .probe = wf_sat_probe, | 355 | .probe = wf_sat_probe, |
| 349 | .remove = wf_sat_remove, | 356 | .remove = wf_sat_remove, |
| @@ -394,7 +394,7 @@ static const struct pcr_ops rts522a_pcr_ops = { · 393 unmodified lines | |||
| 394 | void rts522a_init_params(struct rtsx_pcr *pcr) | 394 | void rts522a_init_params(struct rtsx_pcr *pcr) |
| 395 | { | 395 | { |
| 396 | rts5227_init_params(pcr); | 396 | rts5227_init_params(pcr); |
| 397 | 397 | pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11); | |
| 398 | pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3; | 398 | pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3; |
| 399 | 399 | ||
| 400 | pcr->option.ocp_en = 1; | 400 | pcr->option.ocp_en = 1; |
| @@ -618,6 +618,7 @@ static const struct pcr_ops rts524a_pcr_ops = { · 617 unmodified lines | |||
| 618 | void rts524a_init_params(struct rtsx_pcr *pcr) | 618 | void rts524a_init_params(struct rtsx_pcr *pcr) |
| 619 | { | 619 | { |
| 620 | rts5249_init_params(pcr); | 620 | rts5249_init_params(pcr); |
| 621 | pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11); | ||
| 621 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; | 622 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; |
| 622 | pcr->option.ltr_l1off_snooze_sspwrgate = | 623 | pcr->option.ltr_l1off_snooze_sspwrgate = |
| 623 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; | 624 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; |
| @@ -733,6 +734,7 @@ static const struct pcr_ops rts525a_pcr_ops = { · 109 unmodified lines | |||
| 733 | void rts525a_init_params(struct rtsx_pcr *pcr) | 734 | void rts525a_init_params(struct rtsx_pcr *pcr) |
| 734 | { | 735 | { |
| 735 | rts5249_init_params(pcr); | 736 | rts5249_init_params(pcr); |
| 737 | pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11); | ||
| 736 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; | 738 | pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; |
| 737 | pcr->option.ltr_l1off_snooze_sspwrgate = | 739 | pcr->option.ltr_l1off_snooze_sspwrgate = |
| 738 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; | 740 | LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; |
| @@ -662,7 +662,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr) · 661 unmodified lines | |||
| 662 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; | 662 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; |
| 663 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; | 663 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
| 664 | pcr->aspm_en = ASPM_L1_EN; | 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 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); | 666 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); |
| 667 | 667 | ||
| 668 | pcr->ic_version = rts5260_get_ic_version(pcr); | 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 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; | 764 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; |
| 765 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; | 765 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
| 766 | pcr->aspm_en = ASPM_L1_EN; | 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 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); | 768 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); |
| 769 | 769 | ||
| 770 | pcr->ic_version = rts5261_get_ic_version(pcr); | 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 | * chip is functional. | 712 | * chip is functional. |
| 713 | */ | 713 | */ |
| 714 | err = at24_read(at24, 0, &test_byte, 1); | 714 | err = at24_read(at24, 0, &test_byte, 1); |
| 715 | pm_runtime_idle(dev); | ||
| 716 | if (err) { | 715 | if (err) { |
| 717 | pm_runtime_disable(dev); | 716 | pm_runtime_disable(dev); |
| 718 | regulator_disable(at24->vcc_reg); | 717 | regulator_disable(at24->vcc_reg); |
| 719 | return -ENODEV; | 718 | return -ENODEV; |
| 720 | } | 719 | } |
| 721 | 720 | ||
| 721 | pm_runtime_idle(dev); | ||
| 722 | |||
| 722 | if (writable) | 723 | if (writable) |
| 723 | dev_info(dev, "%u byte %s EEPROM, writable, %u bytes/write\n", | 724 | dev_info(dev, "%u byte %s EEPROM, writable, %u bytes/write\n", |
| 724 | byte_len, client->name, at24->write_max); | 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 | * the erase operation does not exceed the max_busy_timeout, we should | 1732 | * the erase operation does not exceed the max_busy_timeout, we should |
| 1733 | * use R1B response. Or we need to prevent the host from doing hw busy | 1733 | * use R1B response. Or we need to prevent the host from doing hw busy |
| 1734 | * detection, which is done by converting to a R1 response instead. | 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 | busy_timeout > card->host->max_busy_timeout) { | 1740 | busy_timeout > card->host->max_busy_timeout) { |
| 1738 | cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; | 1741 | cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; |
| 1739 | } else { | 1742 | } else { |
| @@ -1910,9 +1910,12 @@ static int mmc_sleep(struct mmc_host *host) · 1909 unmodified lines | |||
| 1910 | * If the max_busy_timeout of the host is specified, validate it against | 1910 | * If the max_busy_timeout of the host is specified, validate it against |
| 1911 | * the sleep cmd timeout. A failure means we need to prevent the host | 1911 | * the sleep cmd timeout. A failure means we need to prevent the host |
| 1912 | * from doing hw busy detection, which is done by converting to a R1 | 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 | cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; | 1919 | cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; |
| 1917 | } else { | 1920 | } else { |
| 1918 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; | 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 | * If the max_busy_timeout of the host is specified, make sure it's | 542 | * If the max_busy_timeout of the host is specified, make sure it's |
| 543 | * enough to fit the used timeout_ms. In case it's not, let's instruct | 543 | * enough to fit the used timeout_ms. In case it's not, let's instruct |
| 544 | * the host to avoid HW busy detection, by converting to a R1 response | 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 | use_r1b_resp = false; | 550 | use_r1b_resp = false; |
| 549 | 551 | ||
| 550 | cmd.opcode = MMC_SWITCH; | 552 | cmd.opcode = MMC_SWITCH; |
| @@ -606,19 +606,22 @@ static int sd_change_phase(struct realtek_pci_sdmmc *host, · 605 unmodified lines | |||
| 606 | u8 sample_point, bool rx) | 606 | u8 sample_point, bool rx) |
| 607 | { | 607 | { |
| 608 | struct rtsx_pcr *pcr = host->pcr; | 608 | struct rtsx_pcr *pcr = host->pcr; |
| 609 | 609 | u16 SD_VP_CTL = 0; | |
| 610 | dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n", | 610 | dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n", |
| 611 | __func__, rx ? "RX" : "TX", sample_point); | 611 | __func__, rx ? "RX" : "TX", sample_point); |
| 612 | 612 | ||
| 613 | rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, CHANGE_CLK); | 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 | rtsx_pci_write_register(pcr, SD_VPRX_CTL, | 616 | rtsx_pci_write_register(pcr, SD_VPRX_CTL, |
| 616 | PHASE_SELECT_MASK, sample_point); | 617 | PHASE_SELECT_MASK, sample_point); |
| 617 | else | 618 | } else { |
| 619 | SD_VP_CTL = SD_VPTX_CTL; | ||
| 618 | rtsx_pci_write_register(pcr, SD_VPTX_CTL, | 620 | rtsx_pci_write_register(pcr, SD_VPTX_CTL, |
| 619 | PHASE_SELECT_MASK, sample_point); | 621 | PHASE_SELECT_MASK, sample_point); |
| 620 | rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0); | 622 | } |
| 621 | rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, | 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 | PHASE_NOT_RESET); | 625 | PHASE_NOT_RESET); |
| 623 | rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, 0); | 626 | rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, 0); |
| 624 | rtsx_pci_write_register(pcr, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0); | 627 | rtsx_pci_write_register(pcr, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0); |
| @@ -23,6 +23,7 @@ · 22 unmodified lines | |||
| 23 | #include <linux/pm.h> | 23 | #include <linux/pm.h> |
| 24 | #include <linux/pm_runtime.h> | 24 | #include <linux/pm_runtime.h> |
| 25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 26 | #include <linux/dmi.h> | ||
| 26 | 27 | ||
| 27 | #include <linux/mmc/host.h> | 28 | #include <linux/mmc/host.h> |
| 28 | #include <linux/mmc/pm.h> | 29 | #include <linux/mmc/pm.h> |
| @@ -72,9 +73,16 @@ struct sdhci_acpi_host { · 43 unmodified lines | |||
| 72 | const struct sdhci_acpi_slot *slot; | 73 | const struct sdhci_acpi_slot *slot; |
| 73 | struct platform_device *pdev; | 74 | struct platform_device *pdev; |
| 74 | bool use_runtime_pm; | 75 | bool use_runtime_pm; |
| 76 | bool is_intel; | ||
| 77 | bool reset_signal_volt_on_suspend; | ||
| 75 | unsigned long private[0] ____cacheline_aligned; | 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 | static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c) | 86 | static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c) |
| 79 | { | 87 | { |
| 80 | return (void *)c->private; | 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 | host->mmc_host_ops.start_signal_voltage_switch = | 399 | host->mmc_host_ops.start_signal_voltage_switch = |
| 392 | intel_start_signal_voltage_switch; | 400 | intel_start_signal_voltage_switch; |
| 393 | 401 | ||
| 402 | c->is_intel = true; | ||
| 403 | |||
| 394 | return 0; | 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 | MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids); | 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 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(struct acpi_device *adev) | 690 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(struct acpi_device *adev) |
| 651 | { | 691 | { |
| 652 | const struct sdhci_acpi_uid_slot *u; | 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 | struct device *dev = &pdev->dev; | 703 | struct device *dev = &pdev->dev; |
| 664 | const struct sdhci_acpi_slot *slot; | 704 | const struct sdhci_acpi_slot *slot; |
| 665 | struct acpi_device *device, *child; | 705 | struct acpi_device *device, *child; |
| 706 | const struct dmi_system_id *id; | ||
| 666 | struct sdhci_acpi_host *c; | 707 | struct sdhci_acpi_host *c; |
| 667 | struct sdhci_host *host; | 708 | struct sdhci_host *host; |
| 668 | struct resource *iomem; | 709 | struct resource *iomem; |
| 669 | resource_size_t len; | 710 | resource_size_t len; |
| 670 | size_t priv_size; | 711 | size_t priv_size; |
| 712 | int quirks = 0; | ||
| 671 | int err; | 713 | int err; |
| 672 | 714 | ||
| 673 | device = ACPI_COMPANION(dev); | 715 | device = ACPI_COMPANION(dev); |
| 674 | if (!device) | 716 | if (!device) |
| 675 | return -ENODEV; | 717 | return -ENODEV; |
| 676 | 718 | ||
| 719 | id = dmi_first_match(sdhci_acpi_quirks); | ||
| 720 | if (id) | ||
| 721 | quirks = (long)id->driver_data; | ||
| 722 | |||
| 677 | slot = sdhci_acpi_get_slot(device); | 723 | slot = sdhci_acpi_get_slot(device); |
| 678 | 724 | ||
| 679 | /* Power on the SDHCI controller and its children */ | 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 | dev_warn(dev, "failed to setup card detect gpio\n"); | 805 | dev_warn(dev, "failed to setup card detect gpio\n"); |
| 760 | c->use_runtime_pm = false; | 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 | err = sdhci_setup_host(host); | 816 | err = sdhci_setup_host(host); |
| @@ -823,17 +875,39 @@ static int sdhci_acpi_remove(struct platform_device *pdev) · 58 unmodified lines | |||
| 823 | return 0; | 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 | #ifdef CONFIG_PM_SLEEP | 894 | #ifdef CONFIG_PM_SLEEP |
| 827 | 895 | ||
| 828 | static int sdhci_acpi_suspend(struct device *dev) | 896 | static int sdhci_acpi_suspend(struct device *dev) |
| 829 | { | 897 | { |
| 830 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); | 898 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); |
| 831 | struct sdhci_host *host = c->host; | 899 | struct sdhci_host *host = c->host; |
| 900 | int ret; | ||
| 832 | 901 | ||
| 833 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) | 902 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) |
| 834 | mmc_retune_needed(host->mmc); | 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 | static int sdhci_acpi_resume(struct device *dev) | 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 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); | 928 | struct sdhci_acpi_host *c = dev_get_drvdata(dev); |
| 855 | struct sdhci_host *host = c->host; | 929 | struct sdhci_host *host = c->host; |
| 930 | int ret; | ||
| 856 | 931 | ||
| 857 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) | 932 | if (host->tuning_mode != SDHCI_TUNING_MODE_3) |
| 858 | mmc_retune_needed(host->mmc); | 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 | static int sdhci_acpi_runtime_resume(struct device *dev) | 943 | static int sdhci_acpi_runtime_resume(struct device *dev) |
| @@ -11,6 +11,7 @@ · 10 unmodified lines | |||
| 11 | #include <linux/mmc/host.h> | 11 | #include <linux/mmc/host.h> |
| 12 | #include <linux/mmc/mmc.h> | 12 | #include <linux/mmc/mmc.h> |
| 13 | #include <linux/of.h> | 13 | #include <linux/of.h> |
| 14 | #include <linux/of_device.h> | ||
| 14 | 15 | ||
| 15 | #include "sdhci-pltfm.h" | 16 | #include "sdhci-pltfm.h" |
| 16 | 17 | ||
| @@ -235,6 +236,11 @@ static const struct sdhci_ops sdhci_cdns_ops = { · 218 unmodified lines | |||
| 235 | .set_uhs_signaling = sdhci_cdns_set_uhs_signaling, | 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 | static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = { | 244 | static const struct sdhci_pltfm_data sdhci_cdns_pltfm_data = { |
| 239 | .ops = &sdhci_cdns_ops, | 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 | static int sdhci_cdns_probe(struct platform_device *pdev) | 340 | static int sdhci_cdns_probe(struct platform_device *pdev) |
| 335 | { | 341 | { |
| 336 | struct sdhci_host *host; | 342 | struct sdhci_host *host; |
| 343 | const struct sdhci_pltfm_data *data; | ||
| 337 | struct sdhci_pltfm_host *pltfm_host; | 344 | struct sdhci_pltfm_host *pltfm_host; |
| 338 | struct sdhci_cdns_priv *priv; | 345 | struct sdhci_cdns_priv *priv; |
| 339 | struct clk *clk; | 346 | struct clk *clk; |
| @@ -350,8 +357,12 @@ static int sdhci_cdns_probe(struct platform_device *pdev) · 10 unmodified lines | |||
| 350 | if (ret) | 357 | if (ret) |
| 351 | return ret; | 358 | return ret; |
| 352 | 359 | ||
| 360 | data = of_device_get_match_data(dev); | ||
| 361 | if (!data) | ||
| 362 | data = &sdhci_cdns_pltfm_data; | ||
| 363 | |||
| 353 | nr_phy_params = sdhci_cdns_phy_param_count(dev->of_node); | 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 | struct_size(priv, phy_params, nr_phy_params)); | 366 | struct_size(priv, phy_params, nr_phy_params)); |
| 356 | if (IS_ERR(host)) { | 367 | if (IS_ERR(host)) { |
| 357 | ret = PTR_ERR(host); | 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 | static const struct of_device_id sdhci_cdns_match[] = { | 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 | { .compatible = "cdns,sd4hc" }, | 449 | { .compatible = "cdns,sd4hc" }, |
| 436 | { /* sentinel */ } | 450 | { /* sentinel */ } |
| 437 | }; | 451 | }; |
| @@ -1590,7 +1590,7 @@ static u32 sdhci_msm_cqe_irq(struct sdhci_host *host, u32 intmask) · 1589 unmodified lines | |||
| 1590 | return 0; | 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 | struct sdhci_host *host = mmc_priv(mmc); | 1595 | struct sdhci_host *host = mmc_priv(mmc); |
| 1596 | unsigned long flags; | 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 | sdhci_reset(host, mask); | 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 | sdhci_at91_set_force_card_detect(host); | 137 | sdhci_at91_set_force_card_detect(host); |
| 137 | 138 | ||
| 138 | if (priv->cal_always_on && (mask & SDHCI_RESET_ALL)) | 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 | * detection procedure using the SDMCC_CD signal is bypassed. | 428 | * detection procedure using the SDMCC_CD signal is bypassed. |
| 428 | * This bit is reset when a software reset for all command is performed | 429 | * This bit is reset when a software reset for all command is performed |
| 429 | * so we need to implement our own reset function to set back this bit. | 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 | sdhci_at91_set_force_card_detect(host); | 436 | sdhci_at91_set_force_card_detect(host); |
| 433 | 437 | ||
| 434 | pm_runtime_put_autosuspend(&pdev->dev); | 438 | pm_runtime_put_autosuspend(&pdev->dev); |
| @@ -1192,6 +1192,9 @@ static int sdhci_omap_probe(struct platform_device *pdev) · 1191 unmodified lines | |||
| 1192 | if (of_find_property(dev->of_node, "dmas", NULL)) | 1192 | if (of_find_property(dev->of_node, "dmas", NULL)) |
| 1193 | sdhci_switch_external_dma(host, true); | 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 | ret = sdhci_setup_host(host); | 1198 | ret = sdhci_setup_host(host); |
| 1196 | if (ret) | 1199 | if (ret) |
| 1197 | goto err_put_sync; | 1200 | goto err_put_sync; |
| @@ -262,10 +262,26 @@ static int gl9750_execute_tuning(struct sdhci_host *host, u32 opcode) · 261 unmodified lines | |||
| 262 | return 0; | 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 | static int gli_probe_slot_gl9750(struct sdhci_pci_slot *slot) | 280 | static int gli_probe_slot_gl9750(struct sdhci_pci_slot *slot) |
| 266 | { | 281 | { |
| 267 | struct sdhci_host *host = slot->host; | 282 | struct sdhci_host *host = slot->host; |
| 268 | 283 | ||
| 284 | gli_pcie_enable_msi(slot); | ||
| 269 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; | 285 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; |
| 270 | sdhci_enable_v4_mode(host); | 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 | struct sdhci_host *host = slot->host; | 293 | struct sdhci_host *host = slot->host; |
| 278 | 294 | ||
| 295 | gli_pcie_enable_msi(slot); | ||
| 279 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; | 296 | slot->host->mmc->caps2 |= MMC_CAP2_NO_SDIO; |
| 280 | sdhci_enable_v4_mode(host); | 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 | if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50) | 1552 | if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50) |
| 1553 | host->mmc->caps |= MMC_CAP_1_8V_DDR; | 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 | tegra_sdhci_parse_dt(host); | 1558 | tegra_sdhci_parse_dt(host); |
| 1556 | 1559 | ||
| 1557 | tegra_host->power_gpio = devm_gpiod_get_optional(&pdev->dev, "power", | 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 | #pragma pack() | 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 | /* Forward declaration */ | 53 | /* Forward declaration */ |
| 59 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], | 54 | static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], |
| 60 | bool strict_match); | 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 | spin_unlock(&bond->mode_lock); | 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 | struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); | 555 | struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); |
| 559 | struct arp_pkt *arp = arp_pkt(skb); | ||
| 560 | struct slave *assigned_slave, *curr_active_slave; | 556 | struct slave *assigned_slave, *curr_active_slave; |
| 561 | struct rlb_client_info *client_info; | 557 | struct rlb_client_info *client_info; |
| 562 | u32 hash_index = 0; | 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 | static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) | 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 | struct slave *tx_slave = NULL; | 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 | /* Don't modify or load balance ARPs that do not originate locally | 659 | /* Don't modify or load balance ARPs that do not originate locally |
| 660 | * (e.g.,arrive via a bridge). | 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 | if (arp->op_code == htons(ARPOP_REPLY)) { | 665 | if (arp->op_code == htons(ARPOP_REPLY)) { |
| 666 | /* the arp must be sent on the selected rx channel */ | 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 | if (tx_slave) | 668 | if (tx_slave) |
| 669 | bond_hw_addr_copy(arp->mac_src, tx_slave->dev->dev_addr, | 669 | bond_hw_addr_copy(arp->mac_src, tx_slave->dev->dev_addr, |
| 670 | tx_slave->dev->addr_len); | 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 | * When the arp reply is received the entry will be updated | 676 | * When the arp reply is received the entry will be updated |
| 677 | * with the correct unicast address of the client. | 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 | /* The ARP reply packets must be delayed so that | 681 | /* The ARP reply packets must be delayed so that |
| 682 | * they can cancel out the influence of the ARP request. | 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 | = { .len = sizeof(struct can_bittiming) }, | 883 | = { .len = sizeof(struct can_bittiming) }, |
| 884 | [IFLA_CAN_DATA_BITTIMING_CONST] | 884 | [IFLA_CAN_DATA_BITTIMING_CONST] |
| 885 | = { .len = sizeof(struct can_bittiming_const) }, | 885 | = { .len = sizeof(struct can_bittiming_const) }, |
| 886 | [IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, | ||
| 886 | }; | 887 | }; |
| 887 | 888 | ||
| 888 | static int can_validate(struct nlattr *tb[], struct nlattr *data[], | 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 | goto unlock; | 2769 | goto unlock; |
| 2770 | } | 2770 | } |
| 2771 | 2771 | ||
| 2772 | occupancy &= MV88E6XXX_G2_ATU_STATS_MASK; | ||
| 2773 | |||
| 2772 | unlock: | 2774 | unlock: |
| 2773 | mv88e6xxx_reg_unlock(chip); | 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 | int err, irq, virq; | 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 | chip->g2_irq.domain = irq_domain_add_simple( | 1109 | chip->g2_irq.domain = irq_domain_add_simple( |
| 1103 | chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip); | 1110 | chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip); |
| 1104 | if (!chip->g2_irq.domain) | 1111 | if (!chip->g2_irq.domain) |
| @@ -1108,7 +1115,6 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip) · 3 unmodified lines | |||
| 1108 | irq_create_mapping(chip->g2_irq.domain, irq); | 1115 | irq_create_mapping(chip->g2_irq.domain, irq); |
| 1109 | 1116 | ||
| 1110 | chip->g2_irq.chip = mv88e6xxx_g2_irq_chip; | 1117 | chip->g2_irq.chip = mv88e6xxx_g2_irq_chip; |
| 1111 | chip->g2_irq.masked = ~0; | ||
| 1112 | 1118 | ||
| 1113 | chip->device_irq = irq_find_mapping(chip->g1_irq.domain, | 1119 | chip->device_irq = irq_find_mapping(chip->g1_irq.domain, |
| 1114 | MV88E6XXX_G1_STS_IRQ_DEVICE); | 1120 | MV88E6XXX_G1_STS_IRQ_DEVICE); |
| @@ -1741,7 +1741,8 @@ static void sja1105_teardown(struct dsa_switch *ds) · 1740 unmodified lines | |||
| 1741 | if (!dsa_is_user_port(ds, port)) | 1741 | if (!dsa_is_user_port(ds, port)) |
| 1742 | continue; | 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 | sja1105_tas_teardown(ds); | 1748 | sja1105_tas_teardown(ds); |
| @@ -2135,7 +2135,7 @@ static int bcm_sysport_rule_set(struct bcm_sysport_priv *priv, · 2134 unmodified lines | |||
| 2135 | return -ENOSPC; | 2135 | return -ENOSPC; |
| 2136 | 2136 | ||
| 2137 | index = find_first_zero_bit(priv->filters, RXCHK_BRCM_TAG_MAX); | 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 | return -ENOSPC; | 2139 | return -ENOSPC; |
| 2140 | 2140 | ||
| 2141 | /* Location is the classification ID, and index is the position | 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 | struct bnxt *bp = netdev_priv(dev); | 10982 | struct bnxt *bp = netdev_priv(dev); |
| 10983 | 10983 | ||
| 10984 | if (netif_running(dev)) | 10984 | if (netif_running(dev)) |
| 10985 | bnxt_close_nic(bp, false, false); | 10985 | bnxt_close_nic(bp, true, false); |
| 10986 | 10986 | ||
| 10987 | dev->mtu = new_mtu; | 10987 | dev->mtu = new_mtu; |
| 10988 | bnxt_set_ring_params(bp); | 10988 | bnxt_set_ring_params(bp); |
| 10989 | 10989 | ||
| 10990 | if (netif_running(dev)) | 10990 | if (netif_running(dev)) |
| 10991 | return bnxt_open_nic(bp, false, false); | 10991 | return bnxt_open_nic(bp, true, false); |
| 10992 | 10992 | ||
| 10993 | return 0; | 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 | struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr; | 2007 | struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr; |
| 2008 | struct hwrm_nvm_install_update_input install = {0}; | 2008 | struct hwrm_nvm_install_update_input install = {0}; |
| 2009 | const struct firmware *fw; | 2009 | const struct firmware *fw; |
| 2010 | int rc, hwrm_err = 0; | ||
| 2011 | u32 item_len; | 2010 | u32 item_len; |
| 2011 | int rc = 0; | ||
| 2012 | u16 index; | 2012 | u16 index; |
| 2013 | 2013 | ||
| 2014 | bnxt_hwrm_fw_set_time(bp); | 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 | memcpy(kmem, fw->data, fw->size); | 2052 | memcpy(kmem, fw->data, fw->size); |
| 2053 | modify.host_src_addr = cpu_to_le64(dma_handle); | 2053 | modify.host_src_addr = cpu_to_le64(dma_handle); |
| 2054 | 2054 | ||
| 2055 | hwrm_err = hwrm_send_message(bp, &modify, | 2055 | rc = hwrm_send_message(bp, &modify, sizeof(modify), |
| 2056 | sizeof(modify), | 2056 | FLASH_PACKAGE_TIMEOUT); |
| 2057 | FLASH_PACKAGE_TIMEOUT); | ||
| 2058 | dma_free_coherent(&bp->pdev->dev, fw->size, kmem, | 2057 | dma_free_coherent(&bp->pdev->dev, fw->size, kmem, |
| 2059 | dma_handle); | 2058 | dma_handle); |
| 2060 | } | 2059 | } |
| 2061 | } | 2060 | } |
| 2062 | release_firmware(fw); | 2061 | release_firmware(fw); |
| 2063 | if (rc || hwrm_err) | 2062 | if (rc) |
| 2064 | goto err_exit; | 2063 | goto err_exit; |
| 2065 | 2064 | ||
| 2066 | if ((install_type & 0xffff) == 0) | 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 | install.install_type = cpu_to_le32(install_type); | 2068 | install.install_type = cpu_to_le32(install_type); |
| 2070 | 2069 | ||
| 2071 | mutex_lock(&bp->hwrm_cmd_lock); | 2070 | mutex_lock(&bp->hwrm_cmd_lock); |
| 2072 | hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), | 2071 | rc = _hwrm_send_message(bp, &install, sizeof(install), |
| 2073 | INSTALL_PACKAGE_TIMEOUT); | 2072 | INSTALL_PACKAGE_TIMEOUT); |
| 2074 | if (hwrm_err) { | 2073 | if (rc) { |
| 2075 | u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; | 2074 | u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; |
| 2076 | 2075 | ||
| 2077 | if (resp->error_code && error_code == | 2076 | if (resp->error_code && error_code == |
| 2078 | NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { | 2077 | NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { |
| 2079 | install.flags |= cpu_to_le16( | 2078 | install.flags |= cpu_to_le16( |
| 2080 | NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); | 2079 | NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); |
| 2081 | hwrm_err = _hwrm_send_message(bp, &install, | 2080 | rc = _hwrm_send_message(bp, &install, sizeof(install), |
| 2082 | sizeof(install), | 2081 | INSTALL_PACKAGE_TIMEOUT); |
| 2083 | INSTALL_PACKAGE_TIMEOUT); | ||
| 2084 | } | 2082 | } |
| 2085 | if (hwrm_err) | 2083 | if (rc) |
| 2086 | goto flash_pkg_exit; | 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 | flash_pkg_exit: | 2092 | flash_pkg_exit: |
| 2095 | mutex_unlock(&bp->hwrm_cmd_lock); | 2093 | mutex_unlock(&bp->hwrm_cmd_lock); |
| 2096 | err_exit: | 2094 | err_exit: |
| 2097 | if (hwrm_err == -EACCES) | 2095 | if (rc == -EACCES) |
| 2098 | bnxt_print_admin_err(bp); | 2096 | bnxt_print_admin_err(bp); |
| 2099 | return rc; | 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 | static int cfg_queues(struct adapter *adap) | 5381 | static int cfg_queues(struct adapter *adap) |
| 5382 | { | 5382 | { |
| 5383 | u32 avail_qsets, avail_eth_qsets, avail_uld_qsets; | 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 | u32 niqflint, neq, num_ulds; | 5386 | u32 niqflint, neq, num_ulds; |
| 5385 | struct sge *s = &adap->sge; | 5387 | struct sge *s = &adap->sge; |
| 5386 | u32 i, n10g = 0, qidx = 0; | 5388 | u32 q10g = 0, q1g; |
| 5387 | #ifndef CONFIG_CHELSIO_T4_DCB | ||
| 5388 | int q10g = 0; | ||
| 5389 | #endif | ||
| 5390 | 5389 | ||
| 5391 | /* Reduce memory usage in kdump environment, disable all offload. */ | 5390 | /* Reduce memory usage in kdump environment, disable all offload. */ |
| 5392 | if (is_kdump_kernel() || (is_uld(adap) && t4_uld_mem_alloc(adap))) { | 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 | n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); | 5423 | n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); |
| 5425 | 5424 | ||
| 5426 | avail_eth_qsets = min_t(u32, avail_qsets, MAX_ETH_QSETS); | 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 | #ifdef CONFIG_CHELSIO_T4_DCB | 5434 | #ifdef CONFIG_CHELSIO_T4_DCB |
| 5428 | /* For Data Center Bridging support we need to be able to support up | 5435 | /* For Data Center Bridging support we need to be able to support up |
| 5429 | * to 8 Traffic Priorities; each of which will be assigned to its | 5436 | * to 8 Traffic Priorities; each of which will be assigned to its |
| 5430 | * own TX Queue in order to prevent Head-Of-Line Blocking. | 5437 | * own TX Queue in order to prevent Head-Of-Line Blocking. |
| 5431 | */ | 5438 | */ |
| 5439 | q1g = 8; | ||
| 5432 | if (adap->params.nports * 8 > avail_eth_qsets) { | 5440 | if (adap->params.nports * 8 > avail_eth_qsets) { |
| 5433 | dev_err(adap->pdev_dev, "DCB avail_eth_qsets=%d < %d!\n", | 5441 | dev_err(adap->pdev_dev, "DCB avail_eth_qsets=%d < %d!\n", |
| 5434 | avail_eth_qsets, adap->params.nports * 8); | 5442 | avail_eth_qsets, adap->params.nports * 8); |
| 5435 | return -ENOMEM; | 5443 | return -ENOMEM; |
| 5436 | } | 5444 | } |
| 5437 | 5445 | ||
| 5438 | for_each_port(adap, i) { | 5446 | if (adap->params.nports * ncpus < avail_eth_qsets) |
| 5439 | struct port_info *pi = adap2pinfo(adap, i); | 5447 | q10g = max(8U, ncpus); |
| 5448 | else | ||
| 5449 | q10g = max(8U, q10g); | ||
| 5440 | 5450 | ||
| 5441 | pi->first_qset = qidx; | 5451 | while ((q10g * n10g) > (avail_eth_qsets - n1g * q1g)) |
| 5442 | pi->nqsets = is_kdump_kernel() ? 1 : 8; | 5452 | q10g--; |
| 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(); | ||
| 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 | q10g = 1; | 5459 | q10g = 1; |
| 5460 | q1g = 1; | ||
| 5461 | } | ||
| 5456 | 5462 | ||
| 5457 | for_each_port(adap, i) { | 5463 | for_each_port(adap, i) { |
| 5458 | struct port_info *pi = adap2pinfo(adap, i); | 5464 | struct port_info *pi = adap2pinfo(adap, i); |
| 5459 | 5465 | ||
| 5460 | pi->first_qset = qidx; | 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 | qidx += pi->nqsets; | 5468 | qidx += pi->nqsets; |
| 5463 | } | 5469 | } |
| 5464 | #endif /* !CONFIG_CHELSIO_T4_DCB */ | ||
| 5465 | 5470 | ||
| 5466 | s->ethqsets = qidx; | 5471 | s->ethqsets = qidx; |
| 5467 | s->max_ethqsets = qidx; /* MSI-X may lower it later */ | 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 | * capped by the number of available cores. | 5478 | * capped by the number of available cores. |
| 5474 | */ | 5479 | */ |
| 5475 | num_ulds = adap->num_uld + adap->num_ofld_uld; | 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 | avail_uld_qsets = roundup(i, adap->params.nports); | 5482 | avail_uld_qsets = roundup(i, adap->params.nports); |
| 5478 | if (avail_qsets < num_ulds * adap->params.nports) { | 5483 | if (avail_qsets < num_ulds * adap->params.nports) { |
| 5479 | adap->params.offload = 0; | 5484 | adap->params.offload = 0; |
| @@ -1,4 +1,5 @@ | |||
| 1 | /* Copyright 2008 - 2016 Freescale Semiconductor Inc. | 1 | /* Copyright 2008 - 2016 Freescale Semiconductor Inc. |
| 2 | * Copyright 2020 NXP | ||
| 2 | * | 3 | * |
| 3 | * Redistribution and use in source and binary forms, with or without | 4 | * Redistribution and use in source and binary forms, with or without |
| 4 | * modification, are permitted provided that the following conditions are met: | 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 | #define FSL_QMAN_MAX_OAL 127 | 124 | #define FSL_QMAN_MAX_OAL 127 |
| 124 | 125 | ||
| 125 | /* Default alignment for start of data in an Rx FD */ | 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 | #define DPAA_FD_DATA_ALIGNMENT 16 | 140 | #define DPAA_FD_DATA_ALIGNMENT 16 |
| 141 | #define DPAA_FD_RX_DATA_ALIGNMENT DPAA_FD_DATA_ALIGNMENT | ||
| 142 | #endif | ||
| 127 | 143 | ||
| 128 | /* The DPAA requires 256 bytes reserved and mapped for the SGT */ | 144 | /* The DPAA requires 256 bytes reserved and mapped for the SGT */ |
| 129 | #define DPAA_SGT_SIZE 256 | 145 | #define DPAA_SGT_SIZE 256 |
| @@ -158,8 +174,13 @@ MODULE_PARM_DESC(tx_timeout, "The Tx timeout in ms"); · 28 unmodified lines | |||
| 158 | #define DPAA_PARSE_RESULTS_SIZE sizeof(struct fman_prs_result) | 174 | #define DPAA_PARSE_RESULTS_SIZE sizeof(struct fman_prs_result) |
| 159 | #define DPAA_TIME_STAMP_SIZE 8 | 175 | #define DPAA_TIME_STAMP_SIZE 8 |
| 160 | #define DPAA_HASH_RESULTS_SIZE 8 | 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 | #define DPAA_RX_PRIV_DATA_SIZE (u16)(DPAA_TX_PRIV_DATA_SIZE + \ | 181 | #define DPAA_RX_PRIV_DATA_SIZE (u16)(DPAA_TX_PRIV_DATA_SIZE + \ |
| 162 | dpaa_rx_extra_headroom) | 182 | dpaa_rx_extra_headroom) |
| 183 | #endif | ||
| 163 | 184 | ||
| 164 | #define DPAA_ETH_PCD_RXQ_NUM 128 | 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 | #define DPAA_BP_RAW_SIZE 4096 | 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 | #define dpaa_bp_size(raw_size) SKB_WITH_OVERHEAD(raw_size) | 208 | #define dpaa_bp_size(raw_size) SKB_WITH_OVERHEAD(raw_size) |
| 209 | #endif | ||
| 184 | 210 | ||
| 185 | static int dpaa_max_frm; | 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 | buf_prefix_content.pass_prs_result = true; | 1218 | buf_prefix_content.pass_prs_result = true; |
| 1193 | buf_prefix_content.pass_hash_result = true; | 1219 | buf_prefix_content.pass_hash_result = true; |
| 1194 | buf_prefix_content.pass_time_stamp = true; | 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 | rx_p = ¶ms.specific_params.rx_params; | 1223 | rx_p = ¶ms.specific_params.rx_params; |
| 1198 | rx_p->err_fqid = errq->fqid; | 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 | return CHECKSUM_NONE; | 1688 | return CHECKSUM_NONE; |
| 1663 | } | 1689 | } |
| 1664 | 1690 | ||
| 1691 | #define PTR_IS_ALIGNED(x, a) (IS_ALIGNED((unsigned long)(x), (a))) | ||
| 1692 | |||
| 1665 | /* Build a linear skb around the received buffer. | 1693 | /* Build a linear skb around the received buffer. |
| 1666 | * We are guaranteed there is enough room at the end of the data buffer to | 1694 | * We are guaranteed there is enough room at the end of the data buffer to |
| 1667 | * accommodate the shared info area of the skb. | 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 | sg_addr = qm_sg_addr(&sgt[i]); | 1762 | sg_addr = qm_sg_addr(&sgt[i]); |
| 1735 | sg_vaddr = phys_to_virt(sg_addr); | 1763 | sg_vaddr = phys_to_virt(sg_addr); |
| 1736 | WARN_ON(!IS_ALIGNED((unsigned long)sg_vaddr, | 1764 | WARN_ON(!PTR_IS_ALIGNED(sg_vaddr, SMP_CACHE_BYTES)); |
| 1737 | SMP_CACHE_BYTES)); | ||
| 1738 | 1765 | ||
| 1739 | dma_unmap_page(priv->rx_dma_dev, sg_addr, | 1766 | dma_unmap_page(priv->rx_dma_dev, sg_addr, |
| 1740 | DPAA_BP_RAW_SIZE, DMA_FROM_DEVICE); | 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 | return 0; | 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 | static netdev_tx_t | 2121 | static netdev_tx_t |
| 2026 | dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) | 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 | nonlinear = skb_is_nonlinear(skb); | 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 | if (nonlinear) { | 2175 | if (nonlinear) { |
| 2072 | /* Just create a S/G fd based on the skb */ | 2176 | /* Just create a S/G fd based on the skb */ |
| 2073 | err = skb_to_sg_fd(priv, skb, &fd); | 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 | headroom = (u16)(bl->priv_data_size + DPAA_PARSE_RESULTS_SIZE + | 2845 | headroom = (u16)(bl->priv_data_size + DPAA_PARSE_RESULTS_SIZE + |
| 2742 | DPAA_TIME_STAMP_SIZE + DPAA_HASH_RESULTS_SIZE); | 2846 | DPAA_TIME_STAMP_SIZE + DPAA_HASH_RESULTS_SIZE); |
| 2743 | 2847 | ||
| 2744 | return DPAA_FD_DATA_ALIGNMENT ? ALIGN(headroom, | 2848 | return ALIGN(headroom, DPAA_FD_DATA_ALIGNMENT); |
| 2745 | DPAA_FD_DATA_ALIGNMENT) : | ||
| 2746 | headroom; | ||
| 2747 | } | 2849 | } |
| 2748 | 2850 | ||
| 2749 | static int dpaa_eth_probe(struct platform_device *pdev) | 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 | return -EINVAL; | 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 | if (cycle > 0xFFFF) { | 2533 | if (cycle > 0xFFFF) { |
| 2534 | dev_err(dev, "Rx coalesced usec exceed hardware limitation\n"); | 2534 | dev_err(dev, "Rx coalesced usec exceed hardware limitation\n"); |
| 2535 | return -EINVAL; | 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 | if (cycle > 0xFFFF) { | 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 | return -EINVAL; | 2541 | return -EINVAL; |
| 2542 | } | 2542 | } |
| 2543 | 2543 | ||
| @@ -8,3 +8,31 @@ config FSL_FMAN · 7 unmodified lines | |||
| 8 | help | 8 | help |
| 9 | Freescale Data-Path Acceleration Architecture Frame Manager | 9 | Freescale Data-Path Acceleration Architecture Frame Manager |
| 10 | (FMan) support | 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 | * Copyright 2008-2015 Freescale Semiconductor Inc. | 2 | * Copyright 2008-2015 Freescale Semiconductor Inc. |
| 3 | * Copyright 2020 NXP | ||
| 3 | * | 4 | * |
| 4 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
| @@ -566,6 +567,10 @@ struct fman_cfg { · 560 unmodified lines | |||
| 566 | u32 qmi_def_tnums_thresh; | 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 | static irqreturn_t fman_exceptions(struct fman *fman, | 574 | static irqreturn_t fman_exceptions(struct fman *fman, |
| 570 | enum fman_exceptions exception) | 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 | EXPORT_SYMBOL(fman_bind); | 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 | static irqreturn_t fman_err_irq(int irq, void *handle) | 2534 | static irqreturn_t fman_err_irq(int irq, void *handle) |
| 2522 | { | 2535 | { |
| 2523 | struct fman *fman = (struct fman *)handle; | 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 | goto fman_free; | 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 | return fman; | 2866 | return fman; |
| 2849 | 2867 | ||
| 2850 | fman_node_put: | 2868 | fman_node_put: |
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright 2008-2015 Freescale Semiconductor Inc. | 2 | * Copyright 2008-2015 Freescale Semiconductor Inc. |
| 3 | * Copyright 2020 NXP | ||
| 3 | * | 4 | * |
| 4 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions are met: | 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 | int fman_get_rx_extra_headroom(void); | 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 | struct fman *fman_bind(struct device *dev); | 406 | struct fman *fman_bind(struct device *dev); |
| 402 | 407 | ||
| 403 | #endif /* __FM_H */ | 408 | #endif /* __FM_H */ |
| @@ -46,6 +46,7 @@ enum HCLGE_MBX_OPCODE { · 45 unmodified lines | |||
| 46 | HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */ | 46 | HCLGE_MBX_PUSH_VLAN_INFO, /* (PF -> VF) push port base vlan */ |
| 47 | HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */ | 47 | HCLGE_MBX_GET_MEDIA_TYPE, /* (VF -> PF) get media type */ |
| 48 | HCLGE_MBX_PUSH_PROMISC_INFO, /* (PF -> VF) push vf promisc info */ | 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 | HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */ | 51 | HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */ |
| 51 | HCLGE_MBX_PUSH_LINK_STATUS, /* (M7 -> PF) get port link status */ | 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 | netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc); | 1711 | netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc); |
| 1712 | 1712 | ||
| 1713 | return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? | 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 | static int hns3_nic_setup_tc(struct net_device *dev, enum tc_setup_type type, | 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 | int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex) | 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 | int ret; | 2450 | int ret; |
| 2450 | 2451 | ||
| 2451 | duplex = hclge_check_speed_dup(duplex, speed); | 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 | return 0; | 2455 | return 0; |
| 2454 | 2456 | ||
| 2455 | ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex); | 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 | struct hclge_desc desc; | 7745 | struct hclge_desc desc; |
| 7744 | int ret; | 7746 | int ret; |
| 7745 | 7747 | ||
| 7746 | hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, false); | 7748 | /* read current vlan filter parameter */ |
| 7747 | 7749 | hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_FILTER_CTRL, true); | |
| 7748 | req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data; | 7750 | req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data; |
| 7749 | req->vlan_type = vlan_type; | 7751 | req->vlan_type = vlan_type; |
| 7750 | req->vlan_fe = filter_en ? fe_type : 0; | ||
| 7751 | req->vf_id = vf_id; | 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 | ret = hclge_cmd_send(&hdev->hw, &desc, 1); | 7766 | ret = hclge_cmd_send(&hdev->hw, &desc, 1); |
| 7754 | if (ret) | 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 | ret); | 7769 | ret); |
| 7757 | 7770 | ||
| 7758 | return ret; | 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 | kfree(vlan); | 8283 | kfree(vlan); |
| 8271 | } | 8284 | } |
| 8272 | } | 8285 | } |
| 8286 | clear_bit(vport->vport_id, hdev->vf_vlan_full); | ||
| 8273 | } | 8287 | } |
| 8274 | 8288 | ||
| 8275 | void hclge_uninit_vport_vlan_table(struct hclge_dev *hdev) | 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 | int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, | 8525 | int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, |
| 8490 | u16 vlan_id, bool is_kill) | 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 | struct hclge_mac *mac = &hdev->hw.mac; | 9931 | struct hclge_mac *mac = &hdev->hw.mac; |
| 9896 | 9932 | ||
| 9897 | hclge_reset_vf_rate(hdev); | 9933 | hclge_reset_vf_rate(hdev); |
| 9934 | hclge_clear_vf_vlan(hdev); | ||
| 9898 | hclge_misc_affinity_teardown(hdev); | 9935 | hclge_misc_affinity_teardown(hdev); |
| 9899 | hclge_state_uninit(hdev); | 9936 | hclge_state_uninit(hdev); |
| 9900 | 9937 | ||
| @@ -799,6 +799,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev) · 798 unmodified lines | |||
| 799 | hclge_get_link_mode(vport, req); | 799 | hclge_get_link_mode(vport, req); |
| 800 | break; | 800 | break; |
| 801 | case HCLGE_MBX_GET_VF_FLR_STATUS: | 801 | case HCLGE_MBX_GET_VF_FLR_STATUS: |
| 802 | case HCLGE_MBX_VF_UNINIT: | ||
| 802 | hclge_rm_vport_all_mac_table(vport, true, | 803 | hclge_rm_vport_all_mac_table(vport, true, |
| 803 | HCLGE_MAC_ADDR_UC); | 804 | HCLGE_MAC_ADDR_UC); |
| 804 | hclge_rm_vport_all_mac_table(vport, true, | 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 | hclgevf_state_uninit(hdev); | 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 | if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) { | 2809 | if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) { |
| 2807 | hclgevf_misc_irq_uninit(hdev); | 2810 | hclgevf_misc_irq_uninit(hdev); |
| 2808 | hclgevf_uninit_msi(hdev); | 2811 | hclgevf_uninit_msi(hdev); |
| @@ -2142,6 +2142,8 @@ static void __ibmvnic_reset(struct work_struct *work) · 2141 unmodified lines | |||
| 2142 | { | 2142 | { |
| 2143 | struct ibmvnic_rwi *rwi; | 2143 | struct ibmvnic_rwi *rwi; |
| 2144 | struct ibmvnic_adapter *adapter; | 2144 | struct ibmvnic_adapter *adapter; |
| 2145 | bool saved_state = false; | ||
| 2146 | unsigned long flags; | ||
| 2145 | u32 reset_state; | 2147 | u32 reset_state; |
| 2146 | int rc = 0; | 2148 | int rc = 0; |
| 2147 | 2149 | ||
| @@ -2153,17 +2155,25 @@ static void __ibmvnic_reset(struct work_struct *work) · 5 unmodified lines | |||
| 2153 | return; | 2155 | return; |
| 2154 | } | 2156 | } |
| 2155 | 2157 | ||
| 2156 | reset_state = adapter->state; | ||
| 2157 | |||
| 2158 | rwi = get_next_rwi(adapter); | 2158 | rwi = get_next_rwi(adapter); |
| 2159 | while (rwi) { | 2159 | while (rwi) { |
| 2160 | spin_lock_irqsave(&adapter->state_lock, flags); | ||
| 2161 | |||
| 2160 | if (adapter->state == VNIC_REMOVING || | 2162 | if (adapter->state == VNIC_REMOVING || |
| 2161 | adapter->state == VNIC_REMOVED) { | 2163 | adapter->state == VNIC_REMOVED) { |
| 2164 | spin_unlock_irqrestore(&adapter->state_lock, flags); | ||
| 2162 | kfree(rwi); | 2165 | kfree(rwi); |
| 2163 | rc = EBUSY; | 2166 | rc = EBUSY; |
| 2164 | break; | 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 | if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) { | 2177 | if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) { |
| 2168 | /* CHANGE_PARAM requestor holds rtnl_lock */ | 2178 | /* CHANGE_PARAM requestor holds rtnl_lock */ |
| 2169 | rc = do_change_param_reset(adapter, rwi, reset_state); | 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 | __ibmvnic_delayed_reset); | 5101 | __ibmvnic_delayed_reset); |
| 5092 | INIT_LIST_HEAD(&adapter->rwi_list); | 5102 | INIT_LIST_HEAD(&adapter->rwi_list); |
| 5093 | spin_lock_init(&adapter->rwi_lock); | 5103 | spin_lock_init(&adapter->rwi_lock); |
| 5104 | spin_lock_init(&adapter->state_lock); | ||
| 5094 | mutex_init(&adapter->fw_lock); | 5105 | mutex_init(&adapter->fw_lock); |
| 5095 | init_completion(&adapter->init_done); | 5106 | init_completion(&adapter->init_done); |
| 5096 | init_completion(&adapter->fw_done); | 5107 | init_completion(&adapter->fw_done); |
| @@ -5163,8 +5174,17 @@ static int ibmvnic_remove(struct vio_dev *dev) · 66 unmodified lines | |||
| 5163 | { | 5174 | { |
| 5164 | struct net_device *netdev = dev_get_drvdata(&dev->dev); | 5175 | struct net_device *netdev = dev_get_drvdata(&dev->dev); |
| 5165 | struct ibmvnic_adapter *adapter = netdev_priv(netdev); | 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 | adapter->state = VNIC_REMOVING; | 5185 | adapter->state = VNIC_REMOVING; |
| 5186 | spin_unlock_irqrestore(&adapter->state_lock, flags); | ||
| 5187 | |||
| 5168 | rtnl_lock(); | 5188 | rtnl_lock(); |
| 5169 | unregister_netdevice(netdev); | 5189 | unregister_netdevice(netdev); |
| 5170 | 5190 | ||
| @@ -941,7 +941,8 @@ enum vnic_state {VNIC_PROBING = 1, · 940 unmodified lines | |||
| 941 | VNIC_CLOSING, | 941 | VNIC_CLOSING, |
| 942 | VNIC_CLOSED, | 942 | VNIC_CLOSED, |
| 943 | VNIC_REMOVING, | 943 | VNIC_REMOVING, |
| 944 | VNIC_REMOVED}; | 944 | VNIC_REMOVED, |
| 945 | VNIC_RESETTING}; | ||
| 945 | 946 | ||
| 946 | enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1, | 947 | enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1, |
| 947 | VNIC_RESET_MOBILITY, | 948 | VNIC_RESET_MOBILITY, |
| @@ -1090,4 +1091,7 @@ struct ibmvnic_adapter { · 142 unmodified lines | |||
| 1090 | 1091 | ||
| 1091 | struct ibmvnic_tunables desired; | 1092 | struct ibmvnic_tunables desired; |
| 1092 | struct ibmvnic_tunables fallback; | 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 | if (dev->err_interrupt > 0 && | 351 | if (dev->err_interrupt > 0 && |
| 352 | resource_size(r) < MVMDIO_ERR_INT_MASK + 4) { | 352 | resource_size(r) < MVMDIO_ERR_INT_MASK + 4) { |
| 353 | dev_err(&pdev->dev, | 353 | dev_err(&pdev->dev, |
| @@ -364,8 +364,8 @@ static int orion_mdio_probe(struct platform_device *pdev) · 10 unmodified lines | |||
| 364 | writel(MVMDIO_ERR_INT_SMI_DONE, | 364 | writel(MVMDIO_ERR_INT_SMI_DONE, |
| 365 | dev->regs + MVMDIO_ERR_INT_MASK); | 365 | dev->regs + MVMDIO_ERR_INT_MASK); |
| 366 | 366 | ||
| 367 | } else if (dev->err_interrupt == -EPROBE_DEFER) { | 367 | } else if (dev->err_interrupt < 0) { |
| 368 | ret = -EPROBE_DEFER; | 368 | ret = dev->err_interrupt; |
| 369 | goto out_mdio; | 369 | goto out_mdio; |
| 370 | } | 370 | } |
| 371 | 371 | ||
| @@ -2176,24 +2176,29 @@ static int ocelot_init_timestamp(struct ocelot *ocelot) · 2175 unmodified lines | |||
| 2176 | return 0; | 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 | struct ocelot_port *ocelot_port = ocelot->ports[port]; | 2184 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 2185 | int maxlen = sdu + ETH_HLEN + ETH_FCS_LEN; | ||
| 2182 | int atop_wm; | 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 | /* Set Pause WM hysteresis | 2190 | /* Set Pause WM hysteresis |
| 2187 | * 152 = 6 * mtu / OCELOT_BUFFER_CELL_SZ | 2191 | * 152 = 6 * maxlen / OCELOT_BUFFER_CELL_SZ |
| 2188 | * 101 = 4 * mtu / OCELOT_BUFFER_CELL_SZ | 2192 | * 101 = 4 * maxlen / OCELOT_BUFFER_CELL_SZ |
| 2189 | */ | 2193 | */ |
| 2190 | ocelot_write_rix(ocelot, SYS_PAUSE_CFG_PAUSE_ENA | | 2194 | ocelot_write_rix(ocelot, SYS_PAUSE_CFG_PAUSE_ENA | |
| 2191 | SYS_PAUSE_CFG_PAUSE_STOP(101) | | 2195 | SYS_PAUSE_CFG_PAUSE_STOP(101) | |
| 2192 | SYS_PAUSE_CFG_PAUSE_START(152), SYS_PAUSE_CFG, port); | 2196 | SYS_PAUSE_CFG_PAUSE_START(152), SYS_PAUSE_CFG, port); |
| 2193 | 2197 | ||
| 2194 | /* Tail dropping watermark */ | 2198 | /* Tail dropping watermark */ |
| 2195 | atop_wm = (ocelot->shared_queue_sz - 9 * mtu) / OCELOT_BUFFER_CELL_SZ; | 2199 | atop_wm = (ocelot->shared_queue_sz - 9 * maxlen) / |
| 2196 | ocelot_write_rix(ocelot, ocelot_wm_enc(9 * mtu), | 2200 | OCELOT_BUFFER_CELL_SZ; |
| 2201 | ocelot_write_rix(ocelot, ocelot_wm_enc(9 * maxlen), | ||
| 2197 | SYS_ATOP, port); | 2202 | SYS_ATOP, port); |
| 2198 | ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); | 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 | DEV_MAC_HDX_CFG); | 2227 | DEV_MAC_HDX_CFG); |
| 2223 | 2228 | ||
| 2224 | /* Set Max Length and maximum tags allowed */ | 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 | ocelot_port_writel(ocelot_port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) | | 2231 | ocelot_port_writel(ocelot_port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) | |
| 2227 | DEV_MAC_TAGS_CFG_VLAN_AWR_ENA | | 2232 | DEV_MAC_TAGS_CFG_VLAN_AWR_ENA | |
| 2233 | DEV_MAC_TAGS_CFG_VLAN_DBL_AWR_ENA | | ||
| 2228 | DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, | 2234 | DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, |
| 2229 | DEV_MAC_TAGS_CFG); | 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 | * Only one port can be an NPI at the same time. | 2316 | * Only one port can be an NPI at the same time. |
| 2311 | */ | 2317 | */ |
| 2312 | if (cpu < ocelot->num_phys_ports) { | 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 | ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M | | 2321 | ocelot_write(ocelot, QSYS_EXT_CPU_CFG_EXT_CPUQ_MSK_M | |
| 2316 | QSYS_EXT_CPU_CFG_EXT_CPU_PORT(cpu), | 2322 | QSYS_EXT_CPU_CFG_EXT_CPU_PORT(cpu), |
| 2317 | QSYS_EXT_CPU_CFG); | 2323 | QSYS_EXT_CPU_CFG); |
| 2318 | 2324 | ||
| 2319 | if (injection == OCELOT_TAG_PREFIX_SHORT) | 2325 | if (injection == OCELOT_TAG_PREFIX_SHORT) |
| 2320 | mtu += OCELOT_SHORT_PREFIX_LEN; | 2326 | sdu += OCELOT_SHORT_PREFIX_LEN; |
| 2321 | else if (injection == OCELOT_TAG_PREFIX_LONG) | 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 | /* CPU port Injection/Extraction configuration */ | 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 | if (!(is_zero_ether_addr(mac) || is_valid_ether_addr(mac))) | 1688 | if (!(is_zero_ether_addr(mac) || is_valid_ether_addr(mac))) |
| 1689 | return -EINVAL; | 1689 | return -EINVAL; |
| 1690 | 1690 | ||
| 1691 | down_read(&ionic->vf_op_lock); | 1691 | down_write(&ionic->vf_op_lock); |
| 1692 | 1692 | ||
| 1693 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { | 1693 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { |
| 1694 | ret = -EINVAL; | 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 | ether_addr_copy(ionic->vfs[vf].macaddr, mac); | 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 | return ret; | 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 | if (proto != htons(ETH_P_8021Q)) | 1719 | if (proto != htons(ETH_P_8021Q)) |
| 1720 | return -EPROTONOSUPPORT; | 1720 | return -EPROTONOSUPPORT; |
| 1721 | 1721 | ||
| 1722 | down_read(&ionic->vf_op_lock); | 1722 | down_write(&ionic->vf_op_lock); |
| 1723 | 1723 | ||
| 1724 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { | 1724 | if (vf >= pci_num_vf(ionic->pdev) || !ionic->vfs) { |
| 1725 | ret = -EINVAL; | 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 | ionic->vfs[vf].vlanid = vlan; | 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 | return ret; | 1734 | return ret; |
| 1735 | } | 1735 | } |
| 1736 | 1736 | ||
| @@ -2277,7 +2277,7 @@ static int __init sxgbe_cmdline_opt(char *str) · 2276 unmodified lines | |||
| 2277 | if (!str || !*str) | 2277 | if (!str || !*str) |
| 2278 | return -EINVAL; | 2278 | return -EINVAL; |
| 2279 | while ((opt = strsep(&str, ",")) != NULL) { | 2279 | while ((opt = strsep(&str, ",")) != NULL) { |
| 2280 | if (!strncmp(opt, "eee_timer:", 6)) { | 2280 | if (!strncmp(opt, "eee_timer:", 10)) { |
| 2281 | if (kstrtoint(opt + 10, 0, &eee_timer)) | 2281 | if (kstrtoint(opt + 10, 0, &eee_timer)) |
| 2282 | goto err; | 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 | /* Transmit timestamps are only available for 8XXX series. They result | 2855 | /* Transmit timestamps are only available for 8XXX series. They result |
| 2856 | * in three events per packet. These occur in order, and are: | 2856 | * in up to three events per packet. These occur in order, and are: |
| 2857 | * - the normal completion event | 2857 | * - the normal completion event (may be omitted) |
| 2858 | * - the low part of the timestamp | 2858 | * - the low part of the timestamp |
| 2859 | * - the high part of the timestamp | 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 | * Each part of the timestamp is itself split across two 16 bit | 2874 | * Each part of the timestamp is itself split across two 16 bit |
| 2862 | * fields in the event. | 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 | switch (tx_ev_type) { | 2879 | switch (tx_ev_type) { |
| 2867 | case TX_TIMESTAMP_EVENT_TX_EV_COMPLETION: | 2880 | case TX_TIMESTAMP_EVENT_TX_EV_COMPLETION: |
| 2868 | /* In case of Queue flush or FLR, we might have received | 2881 | /* Ignore this event - see above. */ |
| 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; | ||
| 2879 | break; | 2882 | break; |
| 2880 | 2883 | ||
| 2881 | case TX_TIMESTAMP_EVENT_TX_EV_TSTAMP_LO: | 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 | ts_part = efx_ef10_extract_event_ts(event); | 2890 | ts_part = efx_ef10_extract_event_ts(event); |
| 2888 | tx_queue->completed_timestamp_major = ts_part; | 2891 | tx_queue->completed_timestamp_major = ts_part; |
| 2889 | 2892 | ||
| 2890 | efx_xmit_done(tx_queue, tx_queue->completed_desc_ptr); | 2893 | efx_xmit_done_single(tx_queue); |
| 2891 | tx_queue->completed_desc_ptr = tx_queue->ptr_mask; | ||
| 2892 | break; | 2894 | break; |
| 2893 | 2895 | ||
| 2894 | default: | 2896 | default: |
| @@ -20,6 +20,7 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, · 19 unmodified lines | |||
| 20 | struct net_device *net_dev); | 20 | struct net_device *net_dev); |
| 21 | netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); | 21 | netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); |
| 22 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); | 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 | int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type, | 24 | int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type, |
| 24 | void *type_data); | 25 | void *type_data); |
| 25 | extern unsigned int efx_piobuf_size; | 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 | if (tx_queue->channel) | 583 | if (tx_queue->channel) |
| 584 | tx_queue->channel = channel; | 584 | tx_queue->channel = channel; |
| 585 | tx_queue->buffer = NULL; | 585 | tx_queue->buffer = NULL; |
| 586 | tx_queue->cb_page = NULL; | ||
| 586 | memset(&tx_queue->txd, 0, sizeof(tx_queue->txd)); | 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 | * avoid cache-line ping-pong between the xmit path and the | 208 | * avoid cache-line ping-pong between the xmit path and the |
| 209 | * completion path. | 209 | * completion path. |
| 210 | * @merge_events: Number of TX merged completion events | 210 | * @merge_events: Number of TX merged completion events |
| 211 | * @completed_desc_ptr: Most recent completed pointer - only used with | ||
| 212 | * timestamping. | ||
| 213 | * @completed_timestamp_major: Top part of the most recent tx timestamp. | 211 | * @completed_timestamp_major: Top part of the most recent tx timestamp. |
| 214 | * @completed_timestamp_minor: Low part of the most recent tx timestamp. | 212 | * @completed_timestamp_minor: Low part of the most recent tx timestamp. |
| 215 | * @insert_count: Current insert pointer | 213 | * @insert_count: Current insert pointer |
| @@ -269,7 +267,6 @@ struct efx_tx_queue { · 53 unmodified lines | |||
| 269 | unsigned int merge_events; | 267 | unsigned int merge_events; |
| 270 | unsigned int bytes_compl; | 268 | unsigned int bytes_compl; |
| 271 | unsigned int pkts_compl; | 269 | unsigned int pkts_compl; |
| 272 | unsigned int completed_desc_ptr; | ||
| 273 | u32 completed_timestamp_major; | 270 | u32 completed_timestamp_major; |
| 274 | u32 completed_timestamp_minor; | 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 | return efx_enqueue_skb(tx_queue, skb); | 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 | void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue) | 576 | void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue) |
| 539 | { | 577 | { |
| 540 | struct efx_nic *efx = tx_queue->efx; | 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 | tx_queue->xmit_more_available = false; | 80 | tx_queue->xmit_more_available = false; |
| 81 | tx_queue->timestamping = (efx_ptp_use_mac_tx_timestamps(efx) && | 81 | tx_queue->timestamping = (efx_ptp_use_mac_tx_timestamps(efx) && |
| 82 | tx_queue->channel == efx_ptp_channel(efx)); | 82 | tx_queue->channel == efx_ptp_channel(efx)); |
| 83 | tx_queue->completed_desc_ptr = tx_queue->ptr_mask; | ||
| 84 | tx_queue->completed_timestamp_major = 0; | 83 | tx_queue->completed_timestamp_major = 0; |
| 85 | tx_queue->completed_timestamp_minor = 0; | 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 | while (read_ptr != stop_index) { | 209 | while (read_ptr != stop_index) { |
| 211 | struct efx_tx_buffer *buffer = &tx_queue->buffer[read_ptr]; | 210 | struct efx_tx_buffer *buffer = &tx_queue->buffer[read_ptr]; |
| 212 | 211 | ||
| 213 | if (!(buffer->flags & EFX_TX_BUF_OPTION) && | 212 | if (!efx_tx_buffer_in_use(buffer)) { |
| 214 | unlikely(buffer->len == 0)) { | ||
| 215 | netif_err(efx, tx_err, efx->net_dev, | 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 | tx_queue->queue, read_ptr); | 215 | tx_queue->queue, read_ptr); |
| 218 | efx_schedule_reset(efx, RESET_TYPE_TX_SKIP); | 216 | efx_schedule_reset(efx, RESET_TYPE_TX_SKIP); |
| 219 | return; | 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 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) | 240 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) |
| 230 | { | 241 | { |
| 231 | unsigned int fill_level, pkts_compl = 0, bytes_compl = 0; | 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 | netif_tx_wake_queue(tx_queue->core_txq); | 267 | netif_tx_wake_queue(tx_queue->core_txq); |
| 257 | } | 268 | } |
| 258 | 269 | ||
| 259 | /* Check whether the hardware queue is now empty */ | 270 | efx_xmit_done_check_empty(tx_queue); |
| 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 | } | ||
| 268 | } | 271 | } |
| 269 | 272 | ||
| 270 | /* Remove buffers put into a tx_queue for the current packet. | 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 | unsigned int *pkts_compl, | 21 | unsigned int *pkts_compl, |
| 22 | unsigned int *bytes_compl); | 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 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); | 30 | void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); |
| 25 | 31 | ||
| 26 | void efx_enqueue_unwind(struct efx_tx_queue *tx_queue, | 32 | void efx_enqueue_unwind(struct efx_tx_queue *tx_queue, |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | |||
| 24 | static void dwmac1000_core_init(struct mac_device_info *hw, | 24 | static void dwmac1000_core_init(struct mac_device_info *hw, |
| 25 | struct net_device *dev) | 25 | struct net_device *dev) |
| 26 | { | 26 | { |
| 27 | struct stmmac_priv *priv = netdev_priv(dev); | ||
| 27 | void __iomem *ioaddr = hw->pcsr; | 28 | void __iomem *ioaddr = hw->pcsr; |
| 28 | u32 value = readl(ioaddr + GMAC_CONTROL); | 29 | u32 value = readl(ioaddr + GMAC_CONTROL); |
| 29 | int mtu = dev->mtu; | 30 | int mtu = dev->mtu; |
| @@ -35,7 +36,7 @@ static void dwmac1000_core_init(struct mac_device_info *hw, · 5 unmodified lines | |||
| 35 | * Broadcom tags can look like invalid LLC/SNAP packets and cause the | 36 | * Broadcom tags can look like invalid LLC/SNAP packets and cause the |
| 36 | * hardware to truncate packets on reception. | 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 | value &= ~GMAC_CONTROL_ACS; | 40 | value &= ~GMAC_CONTROL_ACS; |
| 40 | 41 | ||
| 41 | if (mtu > 1500) | 42 | if (mtu > 1500) |
| @@ -293,6 +293,7 @@ void ipvlan_process_multicast(struct work_struct *work) · 292 unmodified lines | |||
| 293 | } | 293 | } |
| 294 | if (dev) | 294 | if (dev) |
| 295 | dev_put(dev); | 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 | struct ethhdr *ethh = eth_hdr(skb); | 499 | struct ethhdr *ethh = eth_hdr(skb); |
| 499 | int ret = NET_XMIT_DROP; | 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 | /* The ipvlan is a pseudo-L2 device, so the packets that we receive | 502 | /* The ipvlan is a pseudo-L2 device, so the packets that we receive |
| 510 | * will have L2; which need to discarded and processed further | 503 | * will have L2; which need to discarded and processed further |
| 511 | * in the net-ns of the main-device. | 504 | * in the net-ns of the main-device. |
| 512 | */ | 505 | */ |
| 513 | if (skb_mac_header_was_set(skb)) { | 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 | skb_pull(skb, sizeof(*ethh)); | 517 | skb_pull(skb, sizeof(*ethh)); |
| 515 | skb->mac_header = (typeof(skb->mac_header))~0U; | 518 | skb->mac_header = (typeof(skb->mac_header))~0U; |
| 516 | skb_reset_network_header(skb); | 519 | skb_reset_network_header(skb); |
| @@ -164,7 +164,6 @@ static void ipvlan_uninit(struct net_device *dev) · 163 unmodified lines | |||
| 164 | static int ipvlan_open(struct net_device *dev) | 164 | static int ipvlan_open(struct net_device *dev) |
| 165 | { | 165 | { |
| 166 | struct ipvl_dev *ipvlan = netdev_priv(dev); | 166 | struct ipvl_dev *ipvlan = netdev_priv(dev); |
| 167 | struct net_device *phy_dev = ipvlan->phy_dev; | ||
| 168 | struct ipvl_addr *addr; | 167 | struct ipvl_addr *addr; |
| 169 | 168 | ||
| 170 | if (ipvlan->port->mode == IPVLAN_MODE_L3 || | 169 | if (ipvlan->port->mode == IPVLAN_MODE_L3 || |
| @@ -178,7 +177,7 @@ static int ipvlan_open(struct net_device *dev) · 7 unmodified lines | |||
| 178 | ipvlan_ht_addr_add(ipvlan, addr); | 177 | ipvlan_ht_addr_add(ipvlan, addr); |
| 179 | rcu_read_unlock(); | 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 | static int ipvlan_stop(struct net_device *dev) | 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 | dev_uc_unsync(phy_dev, dev); | 189 | dev_uc_unsync(phy_dev, dev); |
| 191 | dev_mc_unsync(phy_dev, dev); | 190 | dev_mc_unsync(phy_dev, dev); |
| 192 | 191 | ||
| 193 | dev_uc_del(phy_dev, phy_dev->dev_addr); | ||
| 194 | |||
| 195 | rcu_read_lock(); | 192 | rcu_read_lock(); |
| 196 | list_for_each_entry_rcu(addr, &ipvlan->addrs, anode) | 193 | list_for_each_entry_rcu(addr, &ipvlan->addrs, anode) |
| 197 | ipvlan_ht_addr_del(addr); | 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 | return (struct macsec_eth_header *)skb_mac_header(skb); | 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 | static void __macsec_pn_wrapped(struct macsec_secy *secy, | 432 | static void __macsec_pn_wrapped(struct macsec_secy *secy, |
| 428 | struct macsec_tx_sa *tx_sa) | 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 | out: | 3274 | out: |
| 3270 | ether_addr_copy(dev->dev_addr, addr->sa_data); | 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 | return 0; | 3290 | return 0; |
| 3272 | } | 3291 | } |
| 3273 | 3292 | ||
| @@ -3342,6 +3361,7 @@ static const struct device_type macsec_type = { · 68 unmodified lines | |||
| 3342 | 3361 | ||
| 3343 | static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = { | 3362 | static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = { |
| 3344 | [IFLA_MACSEC_SCI] = { .type = NLA_U64 }, | 3363 | [IFLA_MACSEC_SCI] = { .type = NLA_U64 }, |
| 3364 | [IFLA_MACSEC_PORT] = { .type = NLA_U16 }, | ||
| 3345 | [IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 }, | 3365 | [IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 }, |
| 3346 | [IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 }, | 3366 | [IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 }, |
| 3347 | [IFLA_MACSEC_WINDOW] = { .type = NLA_U32 }, | 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 | return false; | 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 | static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len) | 3615 | static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len) |
| 3601 | { | 3616 | { |
| 3602 | struct macsec_dev *macsec = macsec_priv(dev); | 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 | if (src) | 334 | if (src) |
| 335 | dev_put(src->dev); | 335 | dev_put(src->dev); |
| 336 | consume_skb(skb); | 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 | /* same phy as above, with just a different OUI */ | 73 | /* same phy as above, with just a different OUI */ |
| 74 | .phy_id = 0x002bdc00, | 74 | .phy_id = 0x002bdc00, |
| 75 | .phy_id_mask = 0xfffffc00, | 75 | .phy_id_mask = 0xfffffc00, |
| 76 | .name = "Broadcom BCM63XX (2)", | ||
| 76 | /* PHY_BASIC_FEATURES */ | 77 | /* PHY_BASIC_FEATURES */ |
| 77 | .flags = PHY_IS_INTERNAL, | 78 | .flags = PHY_IS_INTERNAL, |
| 78 | .config_init = bcm63xx_config_init, | 79 | .config_init = bcm63xx_config_init, |
| @@ -727,7 +727,8 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) · 726 unmodified lines | |||
| 727 | phy_trigger_machine(phydev); | 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 | goto phy_err; | 732 | goto phy_err; |
| 732 | return IRQ_HANDLED; | 733 | return IRQ_HANDLED; |
| 733 | 734 | ||
| @@ -286,6 +286,8 @@ static int mdio_bus_phy_suspend(struct device *dev) · 285 unmodified lines | |||
| 286 | if (!mdio_bus_phy_may_suspend(phydev)) | 286 | if (!mdio_bus_phy_may_suspend(phydev)) |
| 287 | return 0; | 287 | return 0; |
| 288 | 288 | ||
| 289 | phydev->suspended_by_mdio_bus = 1; | ||
| 290 | |||
| 289 | return phy_suspend(phydev); | 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 | struct phy_device *phydev = to_phy_device(dev); | 296 | struct phy_device *phydev = to_phy_device(dev); |
| 295 | int ret; | 297 | int ret; |
| 296 | 298 | ||
| 297 | if (!mdio_bus_phy_may_suspend(phydev)) | 299 | if (!phydev->suspended_by_mdio_bus) |
| 298 | goto no_resume; | 300 | goto no_resume; |
| 299 | 301 | ||
| 302 | phydev->suspended_by_mdio_bus = 0; | ||
| 303 | |||
| 300 | ret = phy_resume(phydev); | 304 | ret = phy_resume(phydev); |
| 301 | if (ret < 0) | 305 | if (ret < 0) |
| 302 | return ret; | 306 | return ret; |
| @@ -761,8 +761,14 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, · 760 unmodified lines | |||
| 761 | config.interface = interface; | 761 | config.interface = interface; |
| 762 | 762 | ||
| 763 | ret = phylink_validate(pl, supported, &config); | 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 | return ret; | 770 | return ret; |
| 771 | } | ||
| 766 | 772 | ||
| 767 | phy->phylink = pl; | 773 | phy->phylink = pl; |
| 768 | phy->phy_link_change = phylink_phy_change; | 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 | struct cstate *cs = lcs->next; | 232 | struct cstate *cs = lcs->next; |
| 233 | unsigned long deltaS, deltaA; | 233 | unsigned long deltaS, deltaA; |
| 234 | short changes = 0; | 234 | short changes = 0; |
| 235 | int hlen; | 235 | int nlen, hlen; |
| 236 | unsigned char new_seq[16]; | 236 | unsigned char new_seq[16]; |
| 237 | unsigned char *cp = new_seq; | 237 | unsigned char *cp = new_seq; |
| 238 | struct iphdr *ip; | 238 | struct iphdr *ip; |
| @@ -248,6 +248,8 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize, · 9 unmodified lines | |||
| 248 | return isize; | 248 | return isize; |
| 249 | 249 | ||
| 250 | ip = (struct iphdr *) icp; | 250 | ip = (struct iphdr *) icp; |
| 251 | if (ip->version != 4 || ip->ihl < 5) | ||
| 252 | return isize; | ||
| 251 | 253 | ||
| 252 | /* Bail if this packet isn't TCP, or is an IP fragment */ | 254 | /* Bail if this packet isn't TCP, or is an IP fragment */ |
| 253 | if (ip->protocol != IPPROTO_TCP || (ntohs(ip->frag_off) & 0x3fff)) { | 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 | comp->sls_o_tcp++; | 260 | comp->sls_o_tcp++; |
| 259 | return isize; | 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); | 267 | th = (struct tcphdr *)(icp + nlen); |
| 264 | hlen = ip->ihl*4 + th->doff*4; | 268 | if (th->doff < sizeof(struct tcphdr) / 4) |
| 269 | return isize; | ||
| 270 | hlen = nlen + th->doff * 4; | ||
| 265 | 271 | ||
| 266 | /* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or | 272 | /* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or |
| 267 | * some other control bit is set). Also uncompressible if | 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 | [TEAM_ATTR_OPTION_CHANGED] = { .type = NLA_FLAG }, | 2240 | [TEAM_ATTR_OPTION_CHANGED] = { .type = NLA_FLAG }, |
| 2241 | [TEAM_ATTR_OPTION_TYPE] = { .type = NLA_U8 }, | 2241 | [TEAM_ATTR_OPTION_TYPE] = { .type = NLA_U8 }, |
| 2242 | [TEAM_ATTR_OPTION_DATA] = { .type = NLA_BINARY }, | 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 | static int team_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info) | 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 | msleep(20); | 3223 | msleep(20); |
| 3224 | if (test_bit(RTL8152_UNPLUG, &tp->flags)) | ||
| 3225 | break; | ||
| 3224 | } | 3226 | } |
| 3225 | 3227 | ||
| 3226 | return data; | 3228 | return data; |
| @@ -5402,7 +5404,10 @@ static void r8153_init(struct r8152 *tp) · 2175 unmodified lines | |||
| 5402 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & | 5404 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & |
| 5403 | AUTOLOAD_DONE) | 5405 | AUTOLOAD_DONE) |
| 5404 | break; | 5406 | break; |
| 5407 | |||
| 5405 | msleep(20); | 5408 | msleep(20); |
| 5409 | if (test_bit(RTL8152_UNPLUG, &tp->flags)) | ||
| 5410 | break; | ||
| 5406 | } | 5411 | } |
| 5407 | 5412 | ||
| 5408 | data = r8153_phy_status(tp, 0); | 5413 | data = r8153_phy_status(tp, 0); |
| @@ -5539,7 +5544,10 @@ static void r8153b_init(struct r8152 *tp) · 130 unmodified lines | |||
| 5539 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & | 5544 | if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & |
| 5540 | AUTOLOAD_DONE) | 5545 | AUTOLOAD_DONE) |
| 5541 | break; | 5546 | break; |
| 5547 | |||
| 5542 | msleep(20); | 5548 | msleep(20); |
| 5549 | if (test_bit(RTL8152_UNPLUG, &tp->flags)) | ||
| 5550 | break; | ||
| 5543 | } | 5551 | } |
| 5544 | 5552 | ||
| 5545 | data = r8153_phy_status(tp, 0); | 5553 | data = r8153_phy_status(tp, 0); |
| @@ -328,7 +328,7 @@ static void veth_get_stats64(struct net_device *dev, · 327 unmodified lines | |||
| 328 | rcu_read_lock(); | 328 | rcu_read_lock(); |
| 329 | peer = rcu_dereference(priv->peer); | 329 | peer = rcu_dereference(priv->peer); |
| 330 | if (peer) { | 330 | if (peer) { |
| 331 | tot->rx_dropped += veth_stats_tx(peer, &packets, &bytes); | 331 | veth_stats_tx(peer, &packets, &bytes); |
| 332 | tot->rx_bytes += bytes; | 332 | tot->rx_bytes += bytes; |
| 333 | tot->rx_packets += packets; | 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 | /* PHY_SKU section is mandatory in B0 */ | 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 | IWL_ERR(mvm, | 313 | IWL_ERR(mvm, |
| 313 | "Can't parse phy_sku in B0, empty sections\n"); | 314 | "Can't parse phy_sku in B0, empty sections\n"); |
| 314 | return NULL; | 315 | return NULL; |
| @@ -447,10 +447,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, · 446 unmodified lines | |||
| 447 | struct page *page = virt_to_head_page(data); | 447 | struct page *page = virt_to_head_page(data); |
| 448 | int offset = data - page_address(page); | 448 | int offset = data - page_address(page); |
| 449 | struct sk_buff *skb = q->rx_head; | 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 | if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) { |
| 452 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len, | 453 | offset += q->buf_offset; |
| 453 | q->buf_size); | 454 | skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len, |
| 455 | q->buf_size); | ||
| 456 | } | ||
| 454 | 457 | ||
| 455 | if (more) | 458 | if (more) |
| 456 | return; | 459 | return; |
| @@ -850,9 +850,11 @@ out_free_tagset: · 849 unmodified lines | |||
| 850 | if (new) | 850 | if (new) |
| 851 | blk_mq_free_tag_set(ctrl->ctrl.admin_tagset); | 851 | blk_mq_free_tag_set(ctrl->ctrl.admin_tagset); |
| 852 | out_free_async_qe: | 852 | out_free_async_qe: |
| 853 | nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, | 853 | if (ctrl->async_event_sqe.data) { |
| 854 | sizeof(struct nvme_command), DMA_TO_DEVICE); | 854 | nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, |
| 855 | ctrl->async_event_sqe.data = NULL; | 855 | sizeof(struct nvme_command), DMA_TO_DEVICE); |
| 856 | ctrl->async_event_sqe.data = NULL; | ||
| 857 | } | ||
| 856 | out_free_queue: | 858 | out_free_queue: |
| 857 | nvme_rdma_free_queue(&ctrl->queues[0]); | 859 | nvme_rdma_free_queue(&ctrl->queues[0]); |
| 858 | return error; | 860 | return error; |
| @@ -515,7 +515,7 @@ static int nvmet_try_send_data_pdu(struct nvmet_tcp_cmd *cmd) · 514 unmodified lines | |||
| 515 | return 1; | 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 | struct nvmet_tcp_queue *queue = cmd->queue; | 520 | struct nvmet_tcp_queue *queue = cmd->queue; |
| 521 | int ret; | 521 | int ret; |
| @@ -523,9 +523,15 @@ static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd) · 1 unmodified line | |||
| 523 | while (cmd->cur_sg) { | 523 | while (cmd->cur_sg) { |
| 524 | struct page *page = sg_page(cmd->cur_sg); | 524 | struct page *page = sg_page(cmd->cur_sg); |
| 525 | u32 left = cmd->cur_sg->length - cmd->offset; | 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 | ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset, | 533 | ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset, |
| 528 | left, MSG_DONTWAIT | MSG_MORE); | 534 | left, flags); |
| 529 | if (ret <= 0) | 535 | if (ret <= 0) |
| 530 | return ret; | 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 | if (cmd->state == NVMET_TCP_SEND_DATA) { | 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 | if (ret <= 0) | 670 | if (ret <= 0) |
| 665 | goto done_send; | 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 | rc = of_mdiobus_register_phy(mdio, child, addr); | 306 | rc = of_mdiobus_register_phy(mdio, child, addr); |
| 307 | if (rc && rc != -ENODEV) | 307 | if (rc && rc != -ENODEV) |
| 308 | goto unregister; | 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 | return ret; | 1073 | return ret; |
| 1074 | } | 1074 | } |
| 1075 | 1075 | ||
| 1076 | platform_set_drvdata(pdev, priv); | ||
| 1077 | |||
| 1076 | dev_dbg(priv->dev, "pinctrl probed ok\n"); | 1078 | dev_dbg(priv->dev, "pinctrl probed ok\n"); |
| 1077 | 1079 | ||
| 1078 | return 0; | 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 | static struct platform_driver madera_pin_driver = { | 1093 | static struct platform_driver madera_pin_driver = { |
| 1082 | .probe = madera_pin_probe, | 1094 | .probe = madera_pin_probe, |
| 1095 | .remove = madera_pin_remove, | ||
| 1083 | .driver = { | 1096 | .driver = { |
| 1084 | .name = "madera-pinctrl", | 1097 | .name = "madera-pinctrl", |
| 1085 | }, | 1098 | }, |
| @@ -2021,7 +2021,6 @@ static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev) · 2020 unmodified lines | |||
| 2021 | return PTR_ERR(pctldev->p); | 2021 | return PTR_ERR(pctldev->p); |
| 2022 | } | 2022 | } |
| 2023 | 2023 | ||
| 2024 | kref_get(&pctldev->p->users); | ||
| 2025 | pctldev->hog_default = | 2024 | pctldev->hog_default = |
| 2026 | pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); | 2025 | pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); |
| 2027 | if (IS_ERR(pctldev->hog_default)) { | 2026 | if (IS_ERR(pctldev->hog_default)) { |
| @@ -23,12 +23,12 @@ struct imx_sc_msg_req_pad_set { · 22 unmodified lines | |||
| 23 | struct imx_sc_rpc_msg hdr; | 23 | struct imx_sc_rpc_msg hdr; |
| 24 | u32 val; | 24 | u32 val; |
| 25 | u16 pad; | 25 | u16 pad; |
| 26 | } __packed; | 26 | } __packed __aligned(4); |
| 27 | 27 | ||
| 28 | struct imx_sc_msg_req_pad_get { | 28 | struct imx_sc_msg_req_pad_get { |
| 29 | struct imx_sc_rpc_msg hdr; | 29 | struct imx_sc_rpc_msg hdr; |
| 30 | u16 pad; | 30 | u16 pad; |
| 31 | } __packed; | 31 | } __packed __aligned(4); |
| 32 | 32 | ||
| 33 | struct imx_sc_msg_resp_pad_get { | 33 | struct imx_sc_msg_resp_pad_get { |
| 34 | struct imx_sc_rpc_msg hdr; | 34 | struct imx_sc_rpc_msg hdr; |
| @@ -147,8 +147,8 @@ static const unsigned int sdio_d0_pins[] = { GPIOX_0 }; · 146 unmodified lines | |||
| 147 | static const unsigned int sdio_d1_pins[] = { GPIOX_1 }; | 147 | static const unsigned int sdio_d1_pins[] = { GPIOX_1 }; |
| 148 | static const unsigned int sdio_d2_pins[] = { GPIOX_2 }; | 148 | static const unsigned int sdio_d2_pins[] = { GPIOX_2 }; |
| 149 | static const unsigned int sdio_d3_pins[] = { GPIOX_3 }; | 149 | static const unsigned int sdio_d3_pins[] = { GPIOX_3 }; |
| 150 | static const unsigned int sdio_cmd_pins[] = { GPIOX_4 }; | 150 | static const unsigned int sdio_clk_pins[] = { GPIOX_4 }; |
| 151 | static const unsigned int sdio_clk_pins[] = { GPIOX_5 }; | 151 | static const unsigned int sdio_cmd_pins[] = { GPIOX_5 }; |
| 152 | static const unsigned int sdio_irq_pins[] = { GPIOX_7 }; | 152 | static const unsigned int sdio_irq_pins[] = { GPIOX_7 }; |
| 153 | 153 | ||
| 154 | static const unsigned int nand_ce0_pins[] = { BOOT_8 }; | 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 | falcon_info.clk[*bank] = clk_get(&ppdev->dev, NULL); | 451 | falcon_info.clk[*bank] = clk_get(&ppdev->dev, NULL); |
| 452 | if (IS_ERR(falcon_info.clk[*bank])) { | 452 | if (IS_ERR(falcon_info.clk[*bank])) { |
| 453 | dev_err(&ppdev->dev, "failed to get clock\n"); | 453 | dev_err(&ppdev->dev, "failed to get clock\n"); |
| 454 | of_node_put(np) | 454 | of_node_put(np); |
| 455 | return PTR_ERR(falcon_info.clk[*bank]); | 455 | return PTR_ERR(falcon_info.clk[*bank]); |
| 456 | } | 456 | } |
| 457 | falcon_info.membase[*bank] = devm_ioremap_resource(&pdev->dev, | 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 | pctrl->irq_chip.irq_mask = msm_gpio_irq_mask; | 1104 | pctrl->irq_chip.irq_mask = msm_gpio_irq_mask; |
| 1105 | pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask; | 1105 | pctrl->irq_chip.irq_unmask = msm_gpio_irq_unmask; |
| 1106 | pctrl->irq_chip.irq_ack = msm_gpio_irq_ack; | 1106 | pctrl->irq_chip.irq_ack = msm_gpio_irq_ack; |
| 1107 | pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent; | ||
| 1108 | pctrl->irq_chip.irq_set_type = msm_gpio_irq_set_type; | 1107 | pctrl->irq_chip.irq_set_type = msm_gpio_irq_set_type; |
| 1109 | pctrl->irq_chip.irq_set_wake = msm_gpio_irq_set_wake; | 1108 | pctrl->irq_chip.irq_set_wake = msm_gpio_irq_set_wake; |
| 1110 | pctrl->irq_chip.irq_request_resources = msm_gpio_irq_reqres; | 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 | if (!chip->irq.parent_domain) | 1117 | if (!chip->irq.parent_domain) |
| 1119 | return -EPROBE_DEFER; | 1118 | return -EPROBE_DEFER; |
| 1120 | chip->irq.child_to_parent_hwirq = msm_gpio_wakeirq; | 1119 | chip->irq.child_to_parent_hwirq = msm_gpio_wakeirq; |
| 1121 | 1120 | pctrl->irq_chip.irq_eoi = irq_chip_eoi_parent; | |
| 1122 | /* | 1121 | /* |
| 1123 | * Let's skip handling the GPIOs, if the parent irqchip | 1122 | * Let's skip handling the GPIOs, if the parent irqchip |
| 1124 | * is handling the direct connect IRQ of the GPIO. | 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 | girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node); | 794 | girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node); |
| 795 | girq->parent_domain = parent_domain; | 795 | girq->parent_domain = parent_domain; |
| 796 | girq->child_to_parent_hwirq = pm8xxx_child_to_parent_hwirq; | 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 | girq->child_offset_to_irq = pm8xxx_child_offset_to_irq; | 798 | girq->child_offset_to_irq = pm8xxx_child_offset_to_irq; |
| 799 | girq->child_irq_domain_ops.translate = pm8xxx_domain_translate; | 799 | girq->child_irq_domain_ops.translate = pm8xxx_domain_translate; |
| 800 | 800 | ||
| @@ -327,6 +327,7 @@ config RTC_DRV_MAX6900 · 326 unmodified lines | |||
| 327 | config RTC_DRV_MAX8907 | 327 | config RTC_DRV_MAX8907 |
| 328 | tristate "Maxim MAX8907" | 328 | tristate "Maxim MAX8907" |
| 329 | depends on MFD_MAX8907 || COMPILE_TEST | 329 | depends on MFD_MAX8907 || COMPILE_TEST |
| 330 | select REGMAP_IRQ | ||
| 330 | help | 331 | help |
| 331 | If you say yes here you will get support for the | 332 | If you say yes here you will get support for the |
| 332 | RTC of Maxim MAX8907 PMIC. | 333 | RTC of Maxim MAX8907 PMIC. |
| @@ -178,6 +178,8 @@ struct dasd_block *dasd_alloc_block(void) · 177 unmodified lines | |||
| 178 | (unsigned long) block); | 178 | (unsigned long) block); |
| 179 | INIT_LIST_HEAD(&block->ccw_queue); | 179 | INIT_LIST_HEAD(&block->ccw_queue); |
| 180 | spin_lock_init(&block->queue_lock); | 180 | spin_lock_init(&block->queue_lock); |
| 181 | INIT_LIST_HEAD(&block->format_list); | ||
| 182 | spin_lock_init(&block->format_lock); | ||
| 181 | timer_setup(&block->timer, dasd_block_timeout, 0); | 183 | timer_setup(&block->timer, dasd_block_timeout, 0); |
| 182 | spin_lock_init(&block->profile.lock); | 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 | if (dasd_ese_needs_format(cqr->block, irb)) { | 1782 | if (dasd_ese_needs_format(cqr->block, irb)) { |
| 1781 | if (rq_data_dir((struct request *)cqr->callback_data) == READ) { | 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 | cqr->status = DASD_CQR_SUCCESS; | 1785 | cqr->status = DASD_CQR_SUCCESS; |
| 1784 | cqr->stopclk = now; | 1786 | cqr->stopclk = now; |
| 1785 | dasd_device_clear_timer(device); | 1787 | dasd_device_clear_timer(device); |
| 1786 | dasd_schedule_device_bh(device); | 1788 | dasd_schedule_device_bh(device); |
| 1787 | return; | 1789 | return; |
| 1788 | } | 1790 | } |
| 1789 | fcqr = device->discipline->ese_format(device, cqr); | 1791 | fcqr = device->discipline->ese_format(device, cqr, irb); |
| 1790 | if (IS_ERR(fcqr)) { | 1792 | if (IS_ERR(fcqr)) { |
| 1793 | if (PTR_ERR(fcqr) == -EINVAL) { | ||
| 1794 | cqr->status = DASD_CQR_ERROR; | ||
| 1795 | return; | ||
| 1796 | } | ||
| 1791 | /* | 1797 | /* |
| 1792 | * If we can't format now, let the request go | 1798 | * If we can't format now, let the request go |
| 1793 | * one extra round. Maybe we can format later. | 1799 | * one extra round. Maybe we can format later. |
| 1794 | */ | 1800 | */ |
| 1795 | cqr->status = DASD_CQR_QUEUED; | 1801 | cqr->status = DASD_CQR_QUEUED; |
| 1802 | dasd_schedule_device_bh(device); | ||
| 1803 | return; | ||
| 1796 | } else { | 1804 | } else { |
| 1797 | fcqr->status = DASD_CQR_QUEUED; | 1805 | fcqr->status = DASD_CQR_QUEUED; |
| 1798 | cqr->status = DASD_CQR_QUEUED; | 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 | struct request *req; | 2757 | struct request *req; |
| 2750 | blk_status_t error = BLK_STS_OK; | 2758 | blk_status_t error = BLK_STS_OK; |
| 2759 | unsigned int proc_bytes; | ||
| 2751 | int status; | 2760 | int status; |
| 2752 | 2761 | ||
| 2753 | req = (struct request *) cqr->callback_data; | 2762 | req = (struct request *) cqr->callback_data; |
| 2754 | dasd_profile_end(cqr->block, cqr, req); | 2763 | dasd_profile_end(cqr->block, cqr, req); |
| 2755 | 2764 | ||
| 2765 | proc_bytes = cqr->proc_bytes; | ||
| 2756 | status = cqr->block->base->discipline->free_cp(cqr, req); | 2766 | status = cqr->block->base->discipline->free_cp(cqr, req); |
| 2757 | if (status < 0) | 2767 | if (status < 0) |
| 2758 | error = errno_to_blk_status(status); | 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 | blk_mq_end_request(req, error); | 2793 | blk_mq_end_request(req, error); |
| 2784 | blk_mq_run_hw_queues(req->q, true); | 2794 | blk_mq_run_hw_queues(req->q, true); |
| 2785 | } else { | 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 | geo->head |= head; | 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 | static int set_timestamp(struct ccw1 *ccw, struct DE_eckd_data *data, | 249 | static int set_timestamp(struct ccw1 *ccw, struct DE_eckd_data *data, |
| 211 | struct dasd_device *device) | 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 | 0, NULL); | 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 | * Callback function to free ESE format requests. | 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 | struct dasd_device *device = cqr->startdev; | 3064 | struct dasd_device *device = cqr->startdev; |
| 2995 | struct dasd_eckd_private *private = device->private; | 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 | private->count--; | 3069 | private->count--; |
| 2998 | dasd_ffree_request(cqr, device); | 3070 | dasd_ffree_request(cqr, device); |
| 2999 | } | 3071 | } |
| 3000 | 3072 | ||
| 3001 | static struct dasd_ccw_req * | 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 | struct dasd_eckd_private *private; | 3077 | struct dasd_eckd_private *private; |
| 3078 | struct dasd_format_entry *format; | ||
| 3005 | struct format_data_t fdata; | 3079 | struct format_data_t fdata; |
| 3006 | unsigned int recs_per_trk; | 3080 | unsigned int recs_per_trk; |
| 3007 | struct dasd_ccw_req *fcqr; | 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 | struct request *req; | 3085 | struct request *req; |
| 3012 | sector_t first_trk; | 3086 | sector_t first_trk; |
| 3013 | sector_t last_trk; | 3087 | sector_t last_trk; |
| 3088 | sector_t curr_trk; | ||
| 3014 | int rc; | 3089 | int rc; |
| 3015 | 3090 | ||
| 3016 | req = cqr->callback_data; | 3091 | req = cqr->callback_data; |
| 3017 | base = cqr->block->base; | 3092 | block = cqr->block; |
| 3093 | base = block->base; | ||
| 3018 | private = base->private; | 3094 | private = base->private; |
| 3019 | block = base->block; | ||
| 3020 | blksize = block->bp_block; | 3095 | blksize = block->bp_block; |
| 3021 | recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); | 3096 | recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); |
| 3097 | format = &startdev->format_entry; | ||
| 3022 | 3098 | ||
| 3023 | first_trk = blk_rq_pos(req) >> block->s2b_shift; | 3099 | first_trk = blk_rq_pos(req) >> block->s2b_shift; |
| 3024 | sector_div(first_trk, recs_per_trk); | 3100 | sector_div(first_trk, recs_per_trk); |
| 3025 | last_trk = | 3101 | last_trk = |
| 3026 | (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; | 3102 | (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; |
| 3027 | sector_div(last_trk, recs_per_trk); | 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; | 3108 | if (curr_trk < first_trk || curr_trk > last_trk) { |
| 3030 | fdata.stop_unit = 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 | fdata.blksize = blksize; | 3121 | fdata.blksize = blksize; |
| 3032 | fdata.intensity = private->uses_cdl ? DASD_FMT_INT_COMPAT : 0; | 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 | return fcqr; | 3134 | return fcqr; |
| 3045 | 3135 | ||
| 3046 | fcqr->callback = dasd_eckd_ese_format_cb; | 3136 | fcqr->callback = dasd_eckd_ese_format_cb; |
| 3137 | fcqr->callback_data = (void *) format; | ||
| 3047 | 3138 | ||
| 3048 | return fcqr; | 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 | * When data is read from an unformatted area of an ESE volume, this function | 3143 | * When data is read from an unformatted area of an ESE volume, this function |
| 3053 | * returns zeroed data and thereby mimics a read of zero data. | 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 | unsigned int blksize, off; | 3159 | unsigned int blksize, off; |
| 3160 | unsigned int recs_per_trk; | ||
| 3058 | struct dasd_device *base; | 3161 | struct dasd_device *base; |
| 3059 | struct req_iterator iter; | 3162 | struct req_iterator iter; |
| 3163 | struct dasd_block *block; | ||
| 3164 | unsigned int skip_block; | ||
| 3165 | unsigned int blk_count; | ||
| 3060 | struct request *req; | 3166 | struct request *req; |
| 3061 | struct bio_vec bv; | 3167 | struct bio_vec bv; |
| 3168 | sector_t curr_trk; | ||
| 3169 | sector_t end_blk; | ||
| 3062 | char *dst; | 3170 | char *dst; |
| 3171 | int rc; | ||
| 3063 | 3172 | ||
| 3064 | req = (struct request *) cqr->callback_data; | 3173 | req = (struct request *) cqr->callback_data; |
| 3065 | base = cqr->block->base; | 3174 | base = cqr->block->base; |
| 3066 | blksize = base->block->bp_block; | 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 | rq_for_each_segment(bv, req, iter) { | 3209 | rq_for_each_segment(bv, req, iter) { |
| 3069 | dst = page_address(bv.bv_page) + bv.bv_offset; | 3210 | dst = page_address(bv.bv_page) + bv.bv_offset; |
| 3070 | for (off = 0; off < bv.bv_len; off += blksize) { | 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 | dst += off; | 3217 | dst += off; |
| 3073 | memset(dst, 0, blksize); | 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 | void (*callback)(struct dasd_ccw_req *, void *data); | 188 | void (*callback)(struct dasd_ccw_req *, void *data); |
| 189 | void *callback_data; | 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 | int (*ext_pool_warn_thrshld)(struct dasd_device *); | 388 | int (*ext_pool_warn_thrshld)(struct dasd_device *); |
| 388 | int (*ext_pool_oos)(struct dasd_device *); | 389 | int (*ext_pool_oos)(struct dasd_device *); |
| 389 | int (*ext_pool_exhaust)(struct dasd_device *, struct dasd_ccw_req *); | 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 | struct dasd_ccw_req *(*ese_format)(struct dasd_device *, |
| 391 | void (*ese_read)(struct dasd_ccw_req *); | 392 | struct dasd_ccw_req *, struct irb *); |
| 393 | int (*ese_read)(struct dasd_ccw_req *, struct irb *); | ||
| 392 | }; | 394 | }; |
| 393 | 395 | ||
| 394 | extern struct dasd_discipline *dasd_diag_discipline_pointer; | 396 | extern struct dasd_discipline *dasd_diag_discipline_pointer; |
| @@ -474,6 +476,11 @@ struct dasd_profile { · 79 unmodified lines | |||
| 474 | spinlock_t lock; | 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 | struct dasd_device { | 484 | struct dasd_device { |
| 478 | /* Block device stuff. */ | 485 | /* Block device stuff. */ |
| 479 | struct dasd_block *block; | 486 | struct dasd_block *block; |
| @@ -539,6 +546,7 @@ struct dasd_device { · 59 unmodified lines | |||
| 539 | struct dentry *debugfs_dentry; | 546 | struct dentry *debugfs_dentry; |
| 540 | struct dentry *hosts_dentry; | 547 | struct dentry *hosts_dentry; |
| 541 | struct dasd_profile profile; | 548 | struct dasd_profile profile; |
| 549 | struct dasd_format_entry format_entry; | ||
| 542 | }; | 550 | }; |
| 543 | 551 | ||
| 544 | struct dasd_block { | 552 | struct dasd_block { |
| @@ -564,6 +572,9 @@ struct dasd_block { · 19 unmodified lines | |||
| 564 | 572 | ||
| 565 | struct dentry *debugfs_dentry; | 573 | struct dentry *debugfs_dentry; |
| 566 | struct dasd_profile profile; | 574 | struct dasd_profile profile; |
| 575 | |||
| 576 | struct list_head format_list; | ||
| 577 | spinlock_t format_lock; | ||
| 567 | }; | 578 | }; |
| 568 | 579 | ||
| 569 | struct dasd_attention_data { | 580 | struct dasd_attention_data { |
| @@ -369,7 +369,7 @@ enum qeth_qdio_info_states { · 368 unmodified lines | |||
| 369 | struct qeth_buffer_pool_entry { | 369 | struct qeth_buffer_pool_entry { |
| 370 | struct list_head list; | 370 | struct list_head list; |
| 371 | struct list_head init_list; | 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 | struct qeth_qdio_buffer_pool { | 375 | struct qeth_qdio_buffer_pool { |
| @@ -983,7 +983,7 @@ extern const struct attribute_group qeth_device_blkt_group; · 607 unmodified lines | |||
| 983 | extern const struct device_type qeth_generic_devtype; | 983 | extern const struct device_type qeth_generic_devtype; |
| 984 | 984 | ||
| 985 | const char *qeth_get_cardname_short(struct qeth_card *); | 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 | int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id); | 987 | int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id); |
| 988 | void qeth_core_free_discipline(struct qeth_card *); | 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 | static void qeth_issue_next_read_cb(struct qeth_card *card, | 65 | static void qeth_issue_next_read_cb(struct qeth_card *card, |
| 66 | struct qeth_cmd_buffer *iob, | 66 | struct qeth_cmd_buffer *iob, |
| 67 | unsigned int data_length); | 67 | unsigned int data_length); |
| 68 | static void qeth_free_buffer_pool(struct qeth_card *); | ||
| 69 | static int qeth_qdio_establish(struct qeth_card *); | 68 | static int qeth_qdio_establish(struct qeth_card *); |
| 70 | static void qeth_free_qdio_queues(struct qeth_card *card); | 69 | static void qeth_free_qdio_queues(struct qeth_card *card); |
| 71 | static void qeth_notify_skbs(struct qeth_qdio_out_q *queue, | 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 | EXPORT_SYMBOL_GPL(qeth_clear_working_pool_list); | 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 | static int qeth_alloc_buffer_pool(struct qeth_card *card) | 258 | static int qeth_alloc_buffer_pool(struct qeth_card *card) |
| 216 | { | 259 | { |
| 217 | struct qeth_buffer_pool_entry *pool_entry; | 260 | unsigned int buf_elements = QETH_MAX_BUFFER_ELEMENTS(card); |
| 218 | void *ptr; | 261 | unsigned int i; |
| 219 | int i, j; | ||
| 220 | 262 | ||
| 221 | QETH_CARD_TEXT(card, 5, "alocpool"); | 263 | QETH_CARD_TEXT(card, 5, "alocpool"); |
| 222 | for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { | 264 | for (i = 0; i < card->qdio.init_pool.buf_count; ++i) { |
| 223 | pool_entry = kzalloc(sizeof(*pool_entry), GFP_KERNEL); | 265 | struct qeth_buffer_pool_entry *entry; |
| 224 | if (!pool_entry) { | 266 | |
| 267 | entry = qeth_alloc_pool_entry(buf_elements); | ||
| 268 | if (!entry) { | ||
| 225 | qeth_free_buffer_pool(card); | 269 | qeth_free_buffer_pool(card); |
| 226 | return -ENOMEM; | 270 | return -ENOMEM; |
| 227 | } | 271 | } |
| 228 | for (j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j) { | 272 | |
| 229 | ptr = (void *) __get_free_page(GFP_KERNEL); | 273 | list_add(&entry->init_list, &card->qdio.init_pool.entry_list); |
| 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); | ||
| 242 | } | 274 | } |
| 243 | return 0; | 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 | QETH_CARD_TEXT(card, 2, "realcbp"); | 286 | QETH_CARD_TEXT(card, 2, "realcbp"); |
| 249 | 287 | ||
| 250 | /* TODO: steel/add buffers from/to a running card's buffer pool (?) */ | 288 | /* Defer until queue is allocated: */ |
| 251 | qeth_clear_working_pool_list(card); | 289 | if (!card->qdio.in_q) |
| 252 | qeth_free_buffer_pool(card); | 290 | goto out; |
| 253 | card->qdio.in_buf_pool.buf_count = bufcnt; | 291 | |
| 254 | card->qdio.init_pool.buf_count = bufcnt; | 292 | /* Remove entries from the pool: */ |
| 255 | return qeth_alloc_buffer_pool(card); | 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 | static void qeth_free_qdio_queue(struct qeth_qdio_q *q) | 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 | EXPORT_SYMBOL_GPL(qeth_drain_output_queues); | 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 | static int qeth_osa_set_output_queues(struct qeth_card *card, bool single) | 1244 | static int qeth_osa_set_output_queues(struct qeth_card *card, bool single) |
| 1187 | { | 1245 | { |
| 1188 | unsigned int count = single ? 1 : card->dev->num_tx_queues; | 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 | if (count == 1) | 1262 | if (count == 1) |
| 1205 | dev_info(&card->gdev->dev, "Priority Queueing not supported\n"); | 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 | card->qdio.no_out_queues = count; | 1265 | card->qdio.no_out_queues = count; |
| 1209 | return 0; | 1266 | return 0; |
| 1210 | } | 1267 | } |
| @@ -2393,7 +2450,6 @@ static void qeth_free_qdio_queues(struct qeth_card *card) · 1182 unmodified lines | |||
| 2393 | return; | 2450 | return; |
| 2394 | 2451 | ||
| 2395 | qeth_free_cq(card); | 2452 | qeth_free_cq(card); |
| 2396 | cancel_delayed_work_sync(&card->buffer_reclaim_work); | ||
| 2397 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { | 2453 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) { |
| 2398 | if (card->qdio.in_q->bufs[j].rx_skb) | 2454 | if (card->qdio.in_q->bufs[j].rx_skb) |
| 2399 | dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb); | 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 | struct list_head *plh; | 2631 | struct list_head *plh; |
| 2576 | struct qeth_buffer_pool_entry *entry; | 2632 | struct qeth_buffer_pool_entry *entry; |
| 2577 | int i, free; | 2633 | int i, free; |
| 2578 | struct page *page; | ||
| 2579 | 2634 | ||
| 2580 | if (list_empty(&card->qdio.in_buf_pool.entry_list)) | 2635 | if (list_empty(&card->qdio.in_buf_pool.entry_list)) |
| 2581 | return NULL; | 2636 | return NULL; |
| @@ -2584,7 +2639,7 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( · 2 unmodified lines | |||
| 2584 | entry = list_entry(plh, struct qeth_buffer_pool_entry, list); | 2639 | entry = list_entry(plh, struct qeth_buffer_pool_entry, list); |
| 2585 | free = 1; | 2640 | free = 1; |
| 2586 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { | 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 | free = 0; | 2643 | free = 0; |
| 2589 | break; | 2644 | break; |
| 2590 | } | 2645 | } |
| @@ -2599,15 +2654,15 @@ static struct qeth_buffer_pool_entry *qeth_find_free_buffer_pool_entry( · 8 unmodified lines | |||
| 2599 | entry = list_entry(card->qdio.in_buf_pool.entry_list.next, | 2654 | entry = list_entry(card->qdio.in_buf_pool.entry_list.next, |
| 2600 | struct qeth_buffer_pool_entry, list); | 2655 | struct qeth_buffer_pool_entry, list); |
| 2601 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { | 2656 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { |
| 2602 | if (page_count(virt_to_page(entry->elements[i])) > 1) { | 2657 | if (page_count(entry->elements[i]) > 1) { |
| 2603 | page = alloc_page(GFP_ATOMIC); | 2658 | struct page *page = alloc_page(GFP_ATOMIC); |
| 2604 | if (!page) { | 2659 | |
| 2660 | if (!page) | ||
| 2605 | return NULL; | 2661 | return NULL; |
| 2606 | } else { | 2662 | |
| 2607 | free_page((unsigned long)entry->elements[i]); | 2663 | __free_page(entry->elements[i]); |
| 2608 | entry->elements[i] = page_address(page); | 2664 | entry->elements[i] = page; |
| 2609 | QETH_CARD_STAT_INC(card, rx_sg_alloc_page); | 2665 | QETH_CARD_STAT_INC(card, rx_sg_alloc_page); |
| 2610 | } | ||
| 2611 | } | 2666 | } |
| 2612 | } | 2667 | } |
| 2613 | list_del_init(&entry->list); | 2668 | list_del_init(&entry->list); |
| @@ -2625,12 +2680,12 @@ static int qeth_init_input_buffer(struct qeth_card *card, · 11 unmodified lines | |||
| 2625 | ETH_HLEN + | 2680 | ETH_HLEN + |
| 2626 | sizeof(struct ipv6hdr)); | 2681 | sizeof(struct ipv6hdr)); |
| 2627 | if (!buf->rx_skb) | 2682 | if (!buf->rx_skb) |
| 2628 | return 1; | 2683 | return -ENOMEM; |
| 2629 | } | 2684 | } |
| 2630 | 2685 | ||
| 2631 | pool_entry = qeth_find_free_buffer_pool_entry(card); | 2686 | pool_entry = qeth_find_free_buffer_pool_entry(card); |
| 2632 | if (!pool_entry) | 2687 | if (!pool_entry) |
| 2633 | return 1; | 2688 | return -ENOBUFS; |
| 2634 | 2689 | ||
| 2635 | /* | 2690 | /* |
| 2636 | * since the buffer is accessed only from the input_tasklet | 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 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { | 2698 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) { |
| 2644 | buf->buffer->element[i].length = PAGE_SIZE; | 2699 | buf->buffer->element[i].length = PAGE_SIZE; |
| 2645 | buf->buffer->element[i].addr = | 2700 | buf->buffer->element[i].addr = |
| 2646 | virt_to_phys(pool_entry->elements[i]); | 2701 | page_to_phys(pool_entry->elements[i]); |
| 2647 | if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) | 2702 | if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1) |
| 2648 | buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY; | 2703 | buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY; |
| 2649 | else | 2704 | else |
| @@ -2675,10 +2730,15 @@ static int qeth_init_qdio_queues(struct qeth_card *card) · 25 unmodified lines | |||
| 2675 | /* inbound queue */ | 2730 | /* inbound queue */ |
| 2676 | qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); | 2731 | qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); |
| 2677 | memset(&card->rx, 0, sizeof(struct qeth_rx)); | 2732 | memset(&card->rx, 0, sizeof(struct qeth_rx)); |
| 2733 | |||
| 2678 | qeth_initialize_working_pool_list(card); | 2734 | qeth_initialize_working_pool_list(card); |
| 2679 | /*give only as many buffers to hardware as we have buffer pool entries*/ | 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) | 2736 | 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]); | 2737 | rc = qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); |
| 2738 | if (rc) | ||
| 2739 | return rc; | ||
| 2740 | } | ||
| 2741 | |||
| 2682 | card->qdio.in_q->next_buf_to_init = | 2742 | card->qdio.in_q->next_buf_to_init = |
| 2683 | card->qdio.in_buf_pool.buf_count - 1; | 2743 | card->qdio.in_buf_pool.buf_count - 1; |
| 2684 | rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0, | 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 | struct device_attribute *attr, const char *buf, size_t count) | 247 | struct device_attribute *attr, const char *buf, size_t count) |
| 248 | { | 248 | { |
| 249 | struct qeth_card *card = dev_get_drvdata(dev); | 249 | struct qeth_card *card = dev_get_drvdata(dev); |
| 250 | unsigned int cnt; | ||
| 250 | char *tmp; | 251 | char *tmp; |
| 251 | int cnt, old_cnt; | ||
| 252 | int rc = 0; | 252 | int rc = 0; |
| 253 | 253 | ||
| 254 | mutex_lock(&card->conf_mutex); | 254 | mutex_lock(&card->conf_mutex); |
| @@ -257,13 +257,12 @@ static ssize_t qeth_dev_bufcnt_store(struct device *dev, · 2 unmodified lines | |||
| 257 | goto out; | 257 | goto out; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | old_cnt = card->qdio.in_buf_pool.buf_count; | ||
| 261 | cnt = simple_strtoul(buf, &tmp, 10); | 260 | cnt = simple_strtoul(buf, &tmp, 10); |
| 262 | cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN : | 261 | cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN : |
| 263 | ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt); | 262 | ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt); |
| 264 | if (old_cnt != cnt) { | 263 | |
| 265 | rc = qeth_realloc_buffer_pool(card, cnt); | 264 | rc = qeth_resize_buffer_pool(card, cnt); |
| 266 | } | 265 | |
| 267 | out: | 266 | out: |
| 268 | mutex_unlock(&card->conf_mutex); | 267 | mutex_unlock(&card->conf_mutex); |
| 269 | return rc ? rc : count; | 268 | return rc ? rc : count; |
| @@ -284,6 +284,7 @@ static void qeth_l2_stop_card(struct qeth_card *card) · 283 unmodified lines | |||
| 284 | if (card->state == CARD_STATE_SOFTSETUP) { | 284 | if (card->state == CARD_STATE_SOFTSETUP) { |
| 285 | qeth_clear_ipacmd_list(card); | 285 | qeth_clear_ipacmd_list(card); |
| 286 | qeth_drain_output_queues(card); | 286 | qeth_drain_output_queues(card); |
| 287 | cancel_delayed_work_sync(&card->buffer_reclaim_work); | ||
| 287 | card->state = CARD_STATE_DOWN; | 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 | qeth_l3_clear_ip_htable(card, 1); | 1178 | qeth_l3_clear_ip_htable(card, 1); |
| 1179 | qeth_clear_ipacmd_list(card); | 1179 | qeth_clear_ipacmd_list(card); |
| 1180 | qeth_drain_output_queues(card); | 1180 | qeth_drain_output_queues(card); |
| 1181 | cancel_delayed_work_sync(&card->buffer_reclaim_work); | ||
| 1181 | card->state = CARD_STATE_DOWN; | 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 | qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd); | 206 | qdio_get_ssqd_desc(CARD_DDEV(card), &card->ssqd); |
| 207 | if (card->ssqd.qdioac2 & CHSC_AC2_SNIFFER_AVAILABLE) { | 207 | if (card->ssqd.qdioac2 & CHSC_AC2_SNIFFER_AVAILABLE) { |
| 208 | card->options.sniffer = i; | 208 | card->options.sniffer = i; |
| 209 | if (card->qdio.init_pool.buf_count != | 209 | qeth_resize_buffer_pool(card, QETH_IN_BUF_COUNT_MAX); |
| 210 | QETH_IN_BUF_COUNT_MAX) | 210 | } else { |
| 211 | qeth_realloc_buffer_pool(card, | ||
| 212 | QETH_IN_BUF_COUNT_MAX); | ||
| 213 | } else | ||
| 214 | rc = -EPERM; | 211 | rc = -EPERM; |
| 212 | } | ||
| 213 | |||
| 215 | break; | 214 | break; |
| 216 | default: | 215 | default: |
| 217 | rc = -EINVAL; | 216 | rc = -EINVAL; |
| @@ -9950,6 +9950,7 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, · 9949 unmodified lines | |||
| 9950 | ioa_cfg->max_devs_supported = ipr_max_devs; | 9950 | ioa_cfg->max_devs_supported = ipr_max_devs; |
| 9951 | 9951 | ||
| 9952 | if (ioa_cfg->sis64) { | 9952 | if (ioa_cfg->sis64) { |
| 9953 | host->max_channel = IPR_MAX_SIS64_BUSES; | ||
| 9953 | host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; | 9954 | host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; |
| 9954 | host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; | 9955 | host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; |
| 9955 | if (ipr_max_devs > IPR_MAX_SIS64_DEVS) | 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 | + ((sizeof(struct ipr_config_table_entry64) | 9959 | + ((sizeof(struct ipr_config_table_entry64) |
| 9959 | * ioa_cfg->max_devs_supported))); | 9960 | * ioa_cfg->max_devs_supported))); |
| 9960 | } else { | 9961 | } else { |
| 9962 | host->max_channel = IPR_VSET_BUS; | ||
| 9961 | host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; | 9963 | host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; |
| 9962 | host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; | 9964 | host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; |
| 9963 | if (ipr_max_devs > IPR_MAX_PHYSICAL_DEVS) | 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 | * ioa_cfg->max_devs_supported))); | 9969 | * ioa_cfg->max_devs_supported))); |
| 9968 | } | 9970 | } |
| 9969 | 9971 | ||
| 9970 | host->max_channel = IPR_VSET_BUS; | ||
| 9971 | host->unique_id = host->host_no; | 9972 | host->unique_id = host->host_no; |
| 9972 | host->max_cmd_len = IPR_MAX_CDB_LEN; | 9973 | host->max_cmd_len = IPR_MAX_CDB_LEN; |
| 9973 | host->can_queue = ioa_cfg->max_cmds; | 9974 | host->can_queue = ioa_cfg->max_cmds; |
| @@ -1300,6 +1300,7 @@ struct ipr_resource_entry { · 1299 unmodified lines | |||
| 1300 | #define IPR_ARRAY_VIRTUAL_BUS 0x1 | 1300 | #define IPR_ARRAY_VIRTUAL_BUS 0x1 |
| 1301 | #define IPR_VSET_VIRTUAL_BUS 0x2 | 1301 | #define IPR_VSET_VIRTUAL_BUS 0x2 |
| 1302 | #define IPR_IOAFP_VIRTUAL_BUS 0x3 | 1302 | #define IPR_IOAFP_VIRTUAL_BUS 0x3 |
| 1303 | #define IPR_MAX_SIS64_BUSES 0x4 | ||
| 1303 | 1304 | ||
| 1304 | #define IPR_GET_RES_PHYS_LOC(res) \ | 1305 | #define IPR_GET_RES_PHYS_LOC(res) \ |
| 1305 | (((res)->bus << 24) | ((res)->target << 8) | (res)->lun) | 1306 | (((res)->bus << 24) | ((res)->target << 8) | (res)->lun) |
| @@ -3884,18 +3884,25 @@ EXPORT_SYMBOL_GPL(ufshcd_uic_hibern8_exit); · 3883 unmodified lines | |||
| 3884 | void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit) | 3884 | void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit) |
| 3885 | { | 3885 | { |
| 3886 | unsigned long flags; | 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 | return; | 3890 | return; |
| 3890 | 3891 | ||
| 3891 | spin_lock_irqsave(hba->host->host_lock, flags); | 3892 | spin_lock_irqsave(hba->host->host_lock, flags); |
| 3892 | if (hba->ahit == ahit) | 3893 | if (hba->ahit != ahit) { |
| 3893 | goto out_unlock; | 3894 | hba->ahit = ahit; |
| 3894 | hba->ahit = ahit; | 3895 | update = true; |
| 3895 | if (!pm_runtime_suspended(hba->dev)) | 3896 | } |
| 3896 | ufshcd_writel(hba, hba->ahit, REG_AUTO_HIBERNATE_IDLE_TIMER); | ||
| 3897 | out_unlock: | ||
| 3898 | spin_unlock_irqrestore(hba->host->host_lock, flags); | 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 | EXPORT_SYMBOL_GPL(ufshcd_auto_hibern8_update); | 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 | .compatible = "qcom,slim-ngd-v1.5.0", | 1321 | .compatible = "qcom,slim-ngd-v1.5.0", |
| 1322 | .data = &ngd_v1_5_offset_info, | 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 | #include <signal.h> | 19 | #include <signal.h> |
| 20 | 20 | ||
| 21 | #define MAX_NUM_DEVICES 10 | 21 | #define MAX_NUM_DEVICES 10 |
| 22 | #define MAX_SYSFS_PREFIX 0x80 | ||
| 22 | #define MAX_SYSFS_PATH 0x200 | 23 | #define MAX_SYSFS_PATH 0x200 |
| 23 | #define CSV_MAX_LINE 0x1000 | 24 | #define CSV_MAX_LINE 0x1000 |
| 24 | #define SYSFS_MAX_INT 0x20 | 25 | #define SYSFS_MAX_INT 0x20 |
| @@ -67,7 +68,7 @@ struct loopback_results { · 42 unmodified lines | |||
| 67 | }; | 68 | }; |
| 68 | 69 | ||
| 69 | struct loopback_device { | 70 | struct loopback_device { |
| 70 | char name[MAX_SYSFS_PATH]; | 71 | char name[MAX_STR_LEN]; |
| 71 | char sysfs_entry[MAX_SYSFS_PATH]; | 72 | char sysfs_entry[MAX_SYSFS_PATH]; |
| 72 | char debugfs_entry[MAX_SYSFS_PATH]; | 73 | char debugfs_entry[MAX_SYSFS_PATH]; |
| 73 | struct loopback_results results; | 74 | struct loopback_results results; |
| @@ -93,8 +94,8 @@ struct loopback_test { · 19 unmodified lines | |||
| 93 | int stop_all; | 94 | int stop_all; |
| 94 | int poll_count; | 95 | int poll_count; |
| 95 | char test_name[MAX_STR_LEN]; | 96 | char test_name[MAX_STR_LEN]; |
| 96 | char sysfs_prefix[MAX_SYSFS_PATH]; | 97 | char sysfs_prefix[MAX_SYSFS_PREFIX]; |
| 97 | char debugfs_prefix[MAX_SYSFS_PATH]; | 98 | char debugfs_prefix[MAX_SYSFS_PREFIX]; |
| 98 | struct timespec poll_timeout; | 99 | struct timespec poll_timeout; |
| 99 | struct loopback_device devices[MAX_NUM_DEVICES]; | 100 | struct loopback_device devices[MAX_NUM_DEVICES]; |
| 100 | struct loopback_results aggregate_results; | 101 | struct loopback_results aggregate_results; |
| @@ -637,7 +638,7 @@ baddir: · 536 unmodified lines | |||
| 637 | static int open_poll_files(struct loopback_test *t) | 638 | static int open_poll_files(struct loopback_test *t) |
| 638 | { | 639 | { |
| 639 | struct loopback_device *dev; | 640 | struct loopback_device *dev; |
| 640 | char buf[MAX_STR_LEN]; | 641 | char buf[MAX_SYSFS_PATH + MAX_STR_LEN]; |
| 641 | char dummy; | 642 | char dummy; |
| 642 | int fds_idx = 0; | 643 | int fds_idx = 0; |
| 643 | int i; | 644 | int i; |
| @@ -655,7 +656,7 @@ static int open_poll_files(struct loopback_test *t) · 11 unmodified lines | |||
| 655 | goto err; | 656 | goto err; |
| 656 | } | 657 | } |
| 657 | read(t->fds[fds_idx].fd, &dummy, 1); | 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 | t->fds[fds_idx].revents = 0; | 660 | t->fds[fds_idx].revents = 0; |
| 660 | fds_idx++; | 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 | for (i = 0; i < t->poll_count; i++) { | 751 | for (i = 0; i < t->poll_count; i++) { |
| 751 | if (t->fds[i].revents & EPOLLPRI) { | 752 | if (t->fds[i].revents & POLLPRI) { |
| 752 | /* Dummy read to clear the event */ | 753 | /* Dummy read to clear the event */ |
| 753 | read(t->fds[i].fd, &dummy, 1); | 754 | read(t->fds[i].fd, &dummy, 1); |
| 754 | number_of_events++; | 755 | number_of_events++; |
| @@ -907,10 +908,10 @@ int main(int argc, char *argv[]) · 152 unmodified lines | |||
| 907 | t.iteration_max = atoi(optarg); | 908 | t.iteration_max = atoi(optarg); |
| 908 | break; | 909 | break; |
| 909 | case 'S': | 910 | case 'S': |
| 910 | snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", optarg); | 911 | snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); |
| 911 | break; | 912 | break; |
| 912 | case 'D': | 913 | case 'D': |
| 913 | snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", optarg); | 914 | snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); |
| 914 | break; | 915 | break; |
| 915 | case 'm': | 916 | case 'm': |
| 916 | t.mask = atol(optarg); | 917 | t.mask = atol(optarg); |
| @@ -961,10 +962,10 @@ int main(int argc, char *argv[]) · 44 unmodified lines | |||
| 961 | } | 962 | } |
| 962 | 963 | ||
| 963 | if (!strcmp(t.sysfs_prefix, "")) | 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 | if (!strcmp(t.debugfs_prefix, "")) | 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 | ret = find_loopback_devices(&t); | 970 | ret = find_loopback_devices(&t); |
| 970 | if (ret) | 971 | if (ret) |
| @@ -38,6 +38,7 @@ static const struct usb_device_id rtw_usb_id_tbl[] = { · 37 unmodified lines | |||
| 38 | {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ | 38 | {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ |
| 39 | {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ | 39 | {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ |
| 40 | {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ | 40 | {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ |
| 41 | {USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */ | ||
| 41 | {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ | 42 | {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ |
| 42 | {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */ | 43 | {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */ |
| 43 | {} /* Terminating entry */ | 44 | {} /* Terminating entry */ |
| @@ -561,7 +561,7 @@ static u_long get_word(struct vc_data *vc) · 560 unmodified lines | |||
| 561 | return 0; | 561 | return 0; |
| 562 | } else if (tmpx < vc->vc_cols - 2 && | 562 | } else if (tmpx < vc->vc_cols - 2 && |
| 563 | (ch == SPACE || ch == 0 || (ch < 0x100 && IS_WDLM(ch))) && | 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 | tmp_pos += 2; | 565 | tmp_pos += 2; |
| 566 | tmpx++; | 566 | tmpx++; |
| 567 | } else { | 567 | } else { |
| @@ -140,6 +140,7 @@ int hif_shutdown(struct wfx_dev *wdev) · 139 unmodified lines | |||
| 140 | else | 140 | else |
| 141 | control_reg_write(wdev, 0); | 141 | control_reg_write(wdev, 0); |
| 142 | mutex_unlock(&wdev->hif_cmd.lock); | 142 | mutex_unlock(&wdev->hif_cmd.lock); |
| 143 | mutex_unlock(&wdev->hif_cmd.key_renew_lock); | ||
| 143 | kfree(hif); | 144 | kfree(hif); |
| 144 | return ret; | 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 | int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, | 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 | int ret; | 295 | int ret; |
| 295 | struct hif_msg *hif; | 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 | body->basic_rate_set = | 308 | body->basic_rate_set = |
| 308 | cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); | 309 | cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); |
| 309 | memcpy(body->bssid, conf->bssid, sizeof(body->bssid)); | 310 | memcpy(body->bssid, conf->bssid, sizeof(body->bssid)); |
| 310 | if (!conf->ibss_joined && ssidie) { | 311 | if (!conf->ibss_joined && ssid) { |
| 311 | body->ssid_length = cpu_to_le32(ssidie[1]); | 312 | body->ssid_length = cpu_to_le32(ssidlen); |
| 312 | memcpy(body->ssid, &ssidie[2], ssidie[1]); | 313 | memcpy(body->ssid, ssid, ssidlen); |
| 313 | } | 314 | } |
| 314 | wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body)); | 315 | wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body)); |
| 315 | ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false); | 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 | struct hif_msg *hif; | 428 | struct hif_msg *hif; |
| 428 | struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif); | 429 | struct hif_req_start *body = wfx_alloc_hif(sizeof(*body), &hif); |
| 429 | 430 | ||
| 430 | body->dtim_period = conf->dtim_period, | 431 | body->dtim_period = conf->dtim_period; |
| 431 | body->short_preamble = conf->use_short_preamble, | 432 | body->short_preamble = conf->use_short_preamble; |
| 432 | body->channel_number = cpu_to_le16(channel->hw_value), | 433 | body->channel_number = cpu_to_le16(channel->hw_value); |
| 433 | body->beacon_interval = cpu_to_le32(conf->beacon_int); | 434 | body->beacon_interval = cpu_to_le32(conf->beacon_int); |
| 434 | body->basic_rate_set = | 435 | body->basic_rate_set = |
| 435 | cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); | 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 | int chan_start, int chan_num); | 46 | int chan_start, int chan_num); |
| 47 | int hif_stop_scan(struct wfx_vif *wvif); | 47 | int hif_stop_scan(struct wfx_vif *wvif); |
| 48 | int hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, | 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 | int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout); | 50 | int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout); |
| 51 | int hif_set_bss_params(struct wfx_vif *wvif, | 51 | int hif_set_bss_params(struct wfx_vif *wvif, |
| 52 | const struct hif_req_set_bss_params *arg); | 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 | static inline int hif_set_association_mode(struct wfx_vif *wvif, | 193 | static inline int hif_set_association_mode(struct wfx_vif *wvif, |
| 194 | struct ieee80211_bss_conf *info, | 194 | struct ieee80211_bss_conf *info) |
| 195 | struct ieee80211_sta_ht_cap *ht_cap) | ||
| 196 | { | 195 | { |
| 197 | int basic_rates = wfx_rate_mask_to_hw(wvif->wdev, info->basic_rates); | 196 | int basic_rates = wfx_rate_mask_to_hw(wvif->wdev, info->basic_rates); |
| 197 | struct ieee80211_sta *sta = NULL; | ||
| 198 | struct hif_mib_set_association_mode val = { | 198 | struct hif_mib_set_association_mode val = { |
| 199 | .preambtype_use = 1, | 199 | .preambtype_use = 1, |
| 200 | .mode = 1, | 200 | .mode = 1, |
| @@ -204,12 +204,17 @@ static inline int hif_set_association_mode(struct wfx_vif *wvif, · 3 unmodified lines | |||
| 204 | .basic_rate_set = cpu_to_le32(basic_rates) | 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 | // FIXME: it is strange to not retrieve all information from bss_info | 211 | // FIXME: it is strange to not retrieve all information from bss_info |
| 208 | if (ht_cap && ht_cap->ht_supported) { | 212 | if (sta && sta->ht_cap.ht_supported) { |
| 209 | val.mpdu_start_spacing = ht_cap->ampdu_density; | 213 | val.mpdu_start_spacing = sta->ht_cap.ampdu_density; |
| 210 | if (!(info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT)) | 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 | return hif_write_mib(wvif->wdev, wvif->id, | 219 | return hif_write_mib(wvif->wdev, wvif->id, |
| 215 | HIF_MIB_ID_SET_ASSOCIATION_MODE, &val, sizeof(val)); | 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 | static void wfx_do_join(struct wfx_vif *wvif) | 491 | static void wfx_do_join(struct wfx_vif *wvif) |
| 492 | { | 492 | { |
| 493 | int ret; | 493 | int ret; |
| 494 | const u8 *ssidie; | ||
| 495 | struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf; | 494 | struct ieee80211_bss_conf *conf = &wvif->vif->bss_conf; |
| 496 | struct cfg80211_bss *bss = NULL; | 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 | wfx_tx_lock_flush(wvif->wdev); | 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 | if (!wvif->beacon_int) | 516 | if (!wvif->beacon_int) |
| 515 | wvif->beacon_int = 1; | 517 | wvif->beacon_int = 1; |
| 516 | 518 | ||
| 517 | rcu_read_lock(); | 519 | rcu_read_lock(); // protect ssidie |
| 518 | if (!conf->ibss_joined) | 520 | if (!conf->ibss_joined) |
| 519 | ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); | 521 | ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); |
| 520 | else | 522 | if (ssidie) { |
| 521 | ssidie = NULL; | 523 | ssidlen = ssidie[1]; |
| 524 | memcpy(ssid, &ssidie[2], ssidie[1]); | ||
| 525 | } | ||
| 526 | rcu_read_unlock(); | ||
| 522 | 527 | ||
| 523 | wfx_tx_flush(wvif->wdev); | 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 | wfx_set_mfp(wvif, bss); | 533 | wfx_set_mfp(wvif, bss); |
| 529 | 534 | ||
| 530 | /* Perform actual join */ | ||
| 531 | wvif->wdev->tx_burst_idx = -1; | 535 | wvif->wdev->tx_burst_idx = -1; |
| 532 | ret = hif_join(wvif, conf, wvif->channel, ssidie); | 536 | ret = hif_join(wvif, conf, wvif->channel, ssid, ssidlen); |
| 533 | rcu_read_unlock(); | ||
| 534 | if (ret) { | 537 | if (ret) { |
| 535 | ieee80211_connection_loss(wvif->vif); | 538 | ieee80211_connection_loss(wvif->vif); |
| 536 | wvif->join_complete_status = -1; | 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 | int i; | 608 | int i; |
| 606 | 609 | ||
| 607 | for (i = 0; i < ARRAY_SIZE(sta_priv->buffered); i++) | 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 | // FIXME: see note in wfx_sta_add() | 614 | // FIXME: see note in wfx_sta_add() |
| 610 | if (vif->type == NL80211_IFTYPE_STATION) | 615 | if (vif->type == NL80211_IFTYPE_STATION) |
| 611 | return 0; | 616 | return 0; |
| @@ -689,6 +694,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif, · 77 unmodified lines | |||
| 689 | wfx_rate_mask_to_hw(wvif->wdev, sta->supp_rates[wvif->channel->band]); | 694 | wfx_rate_mask_to_hw(wvif->wdev, sta->supp_rates[wvif->channel->band]); |
| 690 | else | 695 | else |
| 691 | wvif->bss_params.operational_rate_set = -1; | 696 | wvif->bss_params.operational_rate_set = -1; |
| 697 | rcu_read_unlock(); | ||
| 692 | if (sta && | 698 | if (sta && |
| 693 | info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) | 699 | info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) |
| 694 | hif_dual_cts_protection(wvif, true); | 700 | hif_dual_cts_protection(wvif, true); |
| @@ -701,8 +707,7 @@ static void wfx_join_finalize(struct wfx_vif *wvif, · 6 unmodified lines | |||
| 701 | wvif->bss_params.beacon_lost_count = 20; | 707 | wvif->bss_params.beacon_lost_count = 20; |
| 702 | wvif->bss_params.aid = info->aid; | 708 | wvif->bss_params.aid = info->aid; |
| 703 | 709 | ||
| 704 | hif_set_association_mode(wvif, info, sta ? &sta->ht_cap : NULL); | 710 | hif_set_association_mode(wvif, info); |
| 705 | rcu_read_unlock(); | ||
| 706 | 711 | ||
| 707 | if (!info->ibss_joined) { | 712 | if (!info->ibss_joined) { |
| 708 | hif_keep_alive_period(wvif, 30 /* sec */); | 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 | ret = tb_port_read(port, &phy, TB_CFG_PORT, | 954 | ret = tb_port_read(port, &phy, TB_CFG_PORT, |
| 955 | port->cap_phy + LANE_ADP_CS_0, 1); | 955 | port->cap_phy + LANE_ADP_CS_0, 1); |
| 956 | if (ret) | 956 | if (ret) |
| 957 | return ret; | 957 | return false; |
| 958 | 958 | ||
| 959 | widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >> | 959 | widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >> |
| 960 | LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT; | 960 | LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT; |
| @@ -1589,9 +1589,7 @@ void tty_kclose(struct tty_struct *tty) · 1588 unmodified lines | |||
| 1589 | tty_debug_hangup(tty, "freeing structure\n"); | 1589 | tty_debug_hangup(tty, "freeing structure\n"); |
| 1590 | /* | 1590 | /* |
| 1591 | * The release_tty function takes care of the details of clearing | 1591 | * The release_tty function takes care of the details of clearing |
| 1592 | * the slots and preserving the termios structure. The tty_unlock_pair | 1592 | * the slots and preserving the termios structure. |
| 1593 | * should be safe as we keep a kref while the tty is locked (so the | ||
| 1594 | * unlock never unlocks a freed tty). | ||
| 1595 | */ | 1593 | */ |
| 1596 | mutex_lock(&tty_mutex); | 1594 | mutex_lock(&tty_mutex); |
| 1597 | tty_port_set_kopened(tty->port, 0); | 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 | tty_debug_hangup(tty, "freeing structure\n"); | 1619 | tty_debug_hangup(tty, "freeing structure\n"); |
| 1622 | /* | 1620 | /* |
| 1623 | * The release_tty function takes care of the details of clearing | 1621 | * The release_tty function takes care of the details of clearing |
| 1624 | * the slots and preserving the termios structure. The tty_unlock_pair | 1622 | * the slots and preserving the termios structure. |
| 1625 | * should be safe as we keep a kref while the tty is locked (so the | ||
| 1626 | * unlock never unlocks a freed tty). | ||
| 1627 | */ | 1623 | */ |
| 1628 | mutex_lock(&tty_mutex); | 1624 | mutex_lock(&tty_mutex); |
| 1629 | release_tty(tty, idx); | 1625 | release_tty(tty, idx); |
| @@ -2734,9 +2730,11 @@ static int compat_tty_tiocgserial(struct tty_struct *tty, · 1104 unmodified lines | |||
| 2734 | struct serial_struct32 v32; | 2730 | struct serial_struct32 v32; |
| 2735 | struct serial_struct v; | 2731 | struct serial_struct v; |
| 2736 | int err; | 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 | return -ENOTTY; | 2738 | return -ENOTTY; |
| 2741 | err = tty->ops->get_serial(tty, &v); | 2739 | err = tty->ops->get_serial(tty, &v); |
| 2742 | if (!err) { | 2740 | if (!err) { |
| @@ -1530,18 +1530,19 @@ static const struct usb_ep_ops usb_ep_ops = { · 1529 unmodified lines | |||
| 1530 | static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active) | 1530 | static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active) |
| 1531 | { | 1531 | { |
| 1532 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); | 1532 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); |
| 1533 | unsigned long flags; | ||
| 1534 | 1533 | ||
| 1535 | if (is_active) { | 1534 | if (is_active) { |
| 1536 | pm_runtime_get_sync(&_gadget->dev); | 1535 | pm_runtime_get_sync(&_gadget->dev); |
| 1537 | hw_device_reset(ci); | 1536 | hw_device_reset(ci); |
| 1538 | spin_lock_irqsave(&ci->lock, flags); | 1537 | spin_lock_irq(&ci->lock); |
| 1539 | if (ci->driver) { | 1538 | if (ci->driver) { |
| 1540 | hw_device_state(ci, ci->ep0out->qh.dma); | 1539 | hw_device_state(ci, ci->ep0out->qh.dma); |
| 1541 | usb_gadget_set_state(_gadget, USB_STATE_POWERED); | 1540 | usb_gadget_set_state(_gadget, USB_STATE_POWERED); |
| 1541 | spin_unlock_irq(&ci->lock); | ||
| 1542 | usb_udc_vbus_handler(_gadget, true); | 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 | } else { | 1546 | } else { |
| 1546 | usb_udc_vbus_handler(_gadget, false); | 1547 | usb_udc_vbus_handler(_gadget, false); |
| 1547 | if (ci->driver) | 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 | ss->xmit_fifo_size = acm->writesize; | 897 | ss->xmit_fifo_size = acm->writesize; |
| 898 | ss->baud_base = le32_to_cpu(acm->line.dwDTERate); | 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 | ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? | 900 | ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
| 901 | ASYNC_CLOSING_WAIT_NONE : | 901 | ASYNC_CLOSING_WAIT_NONE : |
| 902 | acm->port.closing_wait / 10; | 902 | jiffies_to_msecs(acm->port.closing_wait) / 10; |
| 903 | return 0; | 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 | struct acm *acm = tty->driver_data; | 908 | struct acm *acm = tty->driver_data; |
| 909 | unsigned int closing_wait, close_delay; | 909 | unsigned int closing_wait, close_delay; |
| 910 | unsigned int old_closing_wait, old_close_delay; | ||
| 910 | int retval = 0; | 911 | int retval = 0; |
| 911 | 912 | ||
| 912 | close_delay = ss->close_delay * 10; | 913 | close_delay = msecs_to_jiffies(ss->close_delay * 10); |
| 913 | closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? | 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 | mutex_lock(&acm->port.mutex); | 924 | mutex_lock(&acm->port.mutex); |
| 917 | 925 | ||
| 918 | if (!capable(CAP_SYS_ADMIN)) { | 926 | if ((ss->close_delay != old_close_delay) || |
| 919 | if ((close_delay != acm->port.close_delay) || | 927 | (ss->closing_wait != old_closing_wait)) { |
| 920 | (closing_wait != acm->port.closing_wait)) | 928 | if (!capable(CAP_SYS_ADMIN)) |
| 921 | retval = -EPERM; | 929 | retval = -EPERM; |
| 922 | else | 930 | else { |
| 923 | retval = -EOPNOTSUPP; | 931 | acm->port.close_delay = close_delay; |
| 924 | } else { | 932 | acm->port.closing_wait = closing_wait; |
| 925 | acm->port.close_delay = close_delay; | 933 | } |
| 926 | acm->port.closing_wait = closing_wait; | 934 | } else |
| 927 | } | 935 | retval = -EOPNOTSUPP; |
| 928 | 936 | ||
| 929 | mutex_unlock(&acm->port.mutex); | 937 | mutex_unlock(&acm->port.mutex); |
| 930 | return retval; | 938 | return retval; |
| @@ -378,6 +378,12 @@ static const struct usb_device_id usb_quirk_list[] = { · 377 unmodified lines | |||
| 378 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = | 378 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = |
| 379 | USB_QUIRK_IGNORE_REMOTE_WAKEUP }, | 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 | /* Action Semiconductor flash disk */ | 387 | /* Action Semiconductor flash disk */ |
| 382 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = | 388 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = |
| 383 | USB_QUIRK_STRING_FETCH_255 }, | 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 | xhci->quirks |= XHCI_AMD_PLL_FIX; | 136 | xhci->quirks |= XHCI_AMD_PLL_FIX; |
| 137 | 137 | ||
| 138 | if (pdev->vendor == PCI_VENDOR_ID_AMD && | 138 | if (pdev->vendor == PCI_VENDOR_ID_AMD && |
| 139 | (pdev->device == 0x15e0 || | 139 | (pdev->device == 0x145c || |
| 140 | pdev->device == 0x15e0 || | ||
| 140 | pdev->device == 0x15e1 || | 141 | pdev->device == 0x15e1 || |
| 141 | pdev->device == 0x43bb)) | 142 | pdev->device == 0x43bb)) |
| 142 | xhci->quirks |= XHCI_SUSPEND_DELAY; | 143 | xhci->quirks |= XHCI_SUSPEND_DELAY; |
| @@ -445,6 +445,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); · 444 unmodified lines | |||
| 445 | static struct platform_driver usb_xhci_driver = { | 445 | static struct platform_driver usb_xhci_driver = { |
| 446 | .probe = xhci_plat_probe, | 446 | .probe = xhci_plat_probe, |
| 447 | .remove = xhci_plat_remove, | 447 | .remove = xhci_plat_remove, |
| 448 | .shutdown = usb_hcd_platform_shutdown, | ||
| 448 | .driver = { | 449 | .driver = { |
| 449 | .name = "xhci-hcd", | 450 | .name = "xhci-hcd", |
| 450 | .pm = &xhci_plat_pm_ops, | 451 | .pm = &xhci_plat_pm_ops, |
| @@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb, · 288 unmodified lines | |||
| 289 | ), | 289 | ), |
| 290 | TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x", | 290 | TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x", |
| 291 | __entry->epnum, __entry->dir_in ? "in" : "out", | 291 | __entry->epnum, __entry->dir_in ? "in" : "out", |
| 292 | ({ char *s; | 292 | __print_symbolic(__entry->type, |
| 293 | switch (__entry->type) { | 293 | { USB_ENDPOINT_XFER_INT, "intr" }, |
| 294 | case USB_ENDPOINT_XFER_INT: | 294 | { USB_ENDPOINT_XFER_CONTROL, "control" }, |
| 295 | s = "intr"; | 295 | { USB_ENDPOINT_XFER_BULK, "bulk" }, |
| 296 | break; | 296 | { USB_ENDPOINT_XFER_ISOC, "isoc" }), |
| 297 | case USB_ENDPOINT_XFER_CONTROL: | 297 | __entry->urb, __entry->pipe, __entry->slot_id, |
| 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, | ||
| 309 | __entry->actual, __entry->length, __entry->num_mapped_sgs, | 298 | __entry->actual, __entry->length, __entry->num_mapped_sgs, |
| 310 | __entry->num_sgs, __entry->stream, __entry->flags | 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 | .driver_info = NCTRL(0) }, | 1183 | .driver_info = NCTRL(0) }, |
| 1184 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ | 1184 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ |
| 1185 | .driver_info = NCTRL(0) | RSVD(3) }, | 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 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), | 1188 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), |
| 1187 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, | 1189 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, |
| 1188 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), | 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 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, | 99 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, |
| 100 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, | 100 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
| 101 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, | 101 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, |
| 102 | { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) }, | ||
| 102 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, | 103 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, |
| 103 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, | 104 | { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, |
| 104 | { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, | 105 | { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, |
| @@ -130,6 +130,7 @@ · 129 unmodified lines | |||
| 130 | #define HP_LM920_PRODUCT_ID 0x026b | 130 | #define HP_LM920_PRODUCT_ID 0x026b |
| 131 | #define HP_TD620_PRODUCT_ID 0x0956 | 131 | #define HP_TD620_PRODUCT_ID 0x0956 |
| 132 | #define HP_LD960_PRODUCT_ID 0x0b39 | 132 | #define HP_LD960_PRODUCT_ID 0x0b39 |
| 133 | #define HP_LD381_PRODUCT_ID 0x0f7f | ||
| 133 | #define HP_LCM220_PRODUCT_ID 0x3139 | 134 | #define HP_LCM220_PRODUCT_ID 0x3139 |
| 134 | #define HP_LCM960_PRODUCT_ID 0x3239 | 135 | #define HP_LCM960_PRODUCT_ID 0x3239 |
| 135 | #define HP_LD220_PRODUCT_ID 0x3524 | 136 | #define HP_LD220_PRODUCT_ID 0x3524 |
| @@ -271,6 +271,9 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt) · 270 unmodified lines | |||
| 271 | return; | 271 | return; |
| 272 | 272 | ||
| 273 | dp = typec_altmode_get_drvdata(alt); | 273 | dp = typec_altmode_get_drvdata(alt); |
| 274 | if (!dp) | ||
| 275 | return; | ||
| 276 | |||
| 274 | dp->data.conf = 0; | 277 | dp->data.conf = 0; |
| 275 | dp->data.status = 0; | 278 | dp->data.status = 0; |
| 276 | dp->initialized = false; | 279 | dp->initialized = false; |
| @@ -285,6 +288,8 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, · 8 unmodified lines | |||
| 285 | struct typec_altmode *alt; | 288 | struct typec_altmode *alt; |
| 286 | struct ucsi_dp *dp; | 289 | struct ucsi_dp *dp; |
| 287 | 290 | ||
| 291 | mutex_lock(&con->lock); | ||
| 292 | |||
| 288 | /* We can't rely on the firmware with the capabilities. */ | 293 | /* We can't rely on the firmware with the capabilities. */ |
| 289 | desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE; | 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 | desc->vdo |= all_assignments << 16; | 298 | desc->vdo |= all_assignments << 16; |
| 294 | 299 | ||
| 295 | alt = typec_port_register_altmode(con->port, desc); | 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 | return alt; | 303 | return alt; |
| 304 | } | ||
| 298 | 305 | ||
| 299 | dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL); | 306 | dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL); |
| 300 | if (!dp) { | 307 | if (!dp) { |
| 301 | typec_unregister_altmode(alt); | 308 | typec_unregister_altmode(alt); |
| 309 | mutex_unlock(&con->lock); | ||
| 302 | return ERR_PTR(-ENOMEM); | 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 | alt->ops = &ucsi_displayport_ops; | 319 | alt->ops = &ucsi_displayport_ops; |
| 312 | typec_altmode_set_drvdata(alt, dp); | 320 | typec_altmode_set_drvdata(alt, dp); |
| 313 | 321 | ||
| 322 | mutex_unlock(&con->lock); | ||
| 323 | |||
| 314 | return alt; | 324 | return alt; |
| 315 | } | 325 | } |
| @@ -959,8 +959,8 @@ out_iput: · 958 unmodified lines | |||
| 959 | iput(vb->vb_dev_info.inode); | 959 | iput(vb->vb_dev_info.inode); |
| 960 | out_kern_unmount: | 960 | out_kern_unmount: |
| 961 | kern_unmount(balloon_mnt); | 961 | kern_unmount(balloon_mnt); |
| 962 | #endif | ||
| 963 | out_del_vqs: | 962 | out_del_vqs: |
| 963 | #endif | ||
| 964 | vdev->config->del_vqs(vdev); | 964 | vdev->config->del_vqs(vdev); |
| 965 | out_free_vb: | 965 | out_free_vb: |
| 966 | kfree(vb); | 966 | kfree(vb); |
| @@ -2203,10 +2203,10 @@ void vring_del_virtqueue(struct virtqueue *_vq) · 2202 unmodified lines | |||
| 2203 | vq->split.queue_size_in_bytes, | 2203 | vq->split.queue_size_in_bytes, |
| 2204 | vq->split.vring.desc, | 2204 | vq->split.vring.desc, |
| 2205 | vq->split.queue_dma_addr); | 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 | list_del(&_vq->list); | 2210 | list_del(&_vq->list); |
| 2211 | kfree(vq); | 2211 | kfree(vq); |
| 2212 | } | 2212 | } |
| @@ -1,10 +1,12 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | /* iTCO Vendor Specific Support hooks */ | 2 | /* iTCO Vendor Specific Support hooks */ |
| 3 | #ifdef CONFIG_ITCO_VENDOR_SUPPORT | 3 | #ifdef CONFIG_ITCO_VENDOR_SUPPORT |
| 4 | extern int iTCO_vendorsupport; | ||
| 4 | extern void iTCO_vendor_pre_start(struct resource *, unsigned int); | 5 | extern void iTCO_vendor_pre_start(struct resource *, unsigned int); |
| 5 | extern void iTCO_vendor_pre_stop(struct resource *); | 6 | extern void iTCO_vendor_pre_stop(struct resource *); |
| 6 | extern int iTCO_vendor_check_noreboot_on(void); | 7 | extern int iTCO_vendor_check_noreboot_on(void); |
| 7 | #else | 8 | #else |
| 9 | #define iTCO_vendorsupport 0 | ||
| 8 | #define iTCO_vendor_pre_start(acpibase, heartbeat) {} | 10 | #define iTCO_vendor_pre_start(acpibase, heartbeat) {} |
| 9 | #define iTCO_vendor_pre_stop(acpibase) {} | 11 | #define iTCO_vendor_pre_stop(acpibase) {} |
| 10 | #define iTCO_vendor_check_noreboot_on() 1 | 12 | #define iTCO_vendor_check_noreboot_on() 1 |
| @@ -39,8 +39,10 @@ · 38 unmodified lines | |||
| 39 | /* Broken BIOS */ | 39 | /* Broken BIOS */ |
| 40 | #define BROKEN_BIOS 911 | 40 | #define BROKEN_BIOS 911 |
| 41 | 41 | ||
| 42 | static int vendorsupport; | 42 | int iTCO_vendorsupport; |
| 43 | module_param(vendorsupport, int, 0); | 43 | EXPORT_SYMBOL(iTCO_vendorsupport); |
| 44 | |||
| 45 | module_param_named(vendorsupport, iTCO_vendorsupport, int, 0); | ||
| 44 | MODULE_PARM_DESC(vendorsupport, "iTCO vendor specific support mode, default=" | 46 | MODULE_PARM_DESC(vendorsupport, "iTCO vendor specific support mode, default=" |
| 45 | "0 (none), 1=SuperMicro Pent3, 911=Broken SMI BIOS"); | 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 | void iTCO_vendor_pre_start(struct resource *smires, | 154 | void iTCO_vendor_pre_start(struct resource *smires, |
| 153 | unsigned int heartbeat) | 155 | unsigned int heartbeat) |
| 154 | { | 156 | { |
| 155 | switch (vendorsupport) { | 157 | switch (iTCO_vendorsupport) { |
| 156 | case SUPERMICRO_OLD_BOARD: | 158 | case SUPERMICRO_OLD_BOARD: |
| 157 | supermicro_old_pre_start(smires); | 159 | supermicro_old_pre_start(smires); |
| 158 | break; | 160 | break; |
| @@ -165,7 +167,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_start); · 6 unmodified lines | |||
| 165 | 167 | ||
| 166 | void iTCO_vendor_pre_stop(struct resource *smires) | 168 | void iTCO_vendor_pre_stop(struct resource *smires) |
| 167 | { | 169 | { |
| 168 | switch (vendorsupport) { | 170 | switch (iTCO_vendorsupport) { |
| 169 | case SUPERMICRO_OLD_BOARD: | 171 | case SUPERMICRO_OLD_BOARD: |
| 170 | supermicro_old_pre_stop(smires); | 172 | supermicro_old_pre_stop(smires); |
| 171 | break; | 173 | break; |
| @@ -178,7 +180,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_stop); · 6 unmodified lines | |||
| 178 | 180 | ||
| 179 | int iTCO_vendor_check_noreboot_on(void) | 181 | int iTCO_vendor_check_noreboot_on(void) |
| 180 | { | 182 | { |
| 181 | switch (vendorsupport) { | 183 | switch (iTCO_vendorsupport) { |
| 182 | case SUPERMICRO_OLD_BOARD: | 184 | case SUPERMICRO_OLD_BOARD: |
| 183 | return 0; | 185 | return 0; |
| 184 | default: | 186 | default: |
| @@ -189,13 +191,13 @@ EXPORT_SYMBOL(iTCO_vendor_check_noreboot_on); · 4 unmodified lines | |||
| 189 | 191 | ||
| 190 | static int __init iTCO_vendor_init_module(void) | 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 | pr_warn("Option vendorsupport=%d is no longer supported, " | 195 | pr_warn("Option vendorsupport=%d is no longer supported, " |
| 194 | "please use the w83627hf_wdt driver instead\n", | 196 | "please use the w83627hf_wdt driver instead\n", |
| 195 | SUPERMICRO_NEW_BOARD); | 197 | SUPERMICRO_NEW_BOARD); |
| 196 | return -EINVAL; | 198 | return -EINVAL; |
| 197 | } | 199 | } |
| 198 | pr_info("vendor-support=%d\n", vendorsupport); | 200 | pr_info("vendor-support=%d\n", iTCO_vendorsupport); |
| 199 | return 0; | 201 | return 0; |
| 200 | } | 202 | } |
| 201 | 203 | ||
| @@ -459,13 +459,25 @@ static int iTCO_wdt_probe(struct platform_device *pdev) · 458 unmodified lines | |||
| 459 | if (!p->tco_res) | 459 | if (!p->tco_res) |
| 460 | return -ENODEV; | 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 | p->iTCO_version = pdata->version; | 462 | p->iTCO_version = pdata->version; |
| 467 | p->pci_dev = to_pci_dev(dev->parent); | 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 | iTCO_wdt_no_reboot_bit_setup(p, pdata); | 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 | /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ | 504 | /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ |
| 493 | p->update_no_reboot_bit(p->no_reboot_priv, true); | 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 | if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { | 507 | if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { |
| 504 | /* | 508 | /* |
| 505 | * Bit 13: TCO_EN -> 0 | 509 | * Bit 13: TCO_EN -> 0 |
| @@ -19,7 +19,7 @@ · 18 unmodified lines | |||
| 19 | void afs_put_addrlist(struct afs_addr_list *alist) | 19 | void afs_put_addrlist(struct afs_addr_list *alist) |
| 20 | { | 20 | { |
| 21 | if (alist && refcount_dec_and_test(&alist->usage)) | 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 | * List of server addresses. | 81 | * List of server addresses. |
| 82 | */ | 82 | */ |
| 83 | struct afs_addr_list { | 83 | struct afs_addr_list { |
| 84 | struct rcu_head rcu; /* Must be first */ | 84 | struct rcu_head rcu; |
| 85 | refcount_t usage; | 85 | refcount_t usage; |
| 86 | u32 version; /* Version */ | 86 | u32 version; /* Version */ |
| 87 | unsigned char max_addrs; | 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 | found_raid1c34 = true; | 856 | found_raid1c34 = true; |
| 857 | up_read(&sinfo->groups_sem); | 857 | up_read(&sinfo->groups_sem); |
| 858 | } | 858 | } |
| 859 | if (found_raid56) | 859 | if (!found_raid56) |
| 860 | btrfs_clear_fs_incompat(fs_info, RAID56); | 860 | btrfs_clear_fs_incompat(fs_info, RAID56); |
| 861 | if (found_raid1c34) | 861 | if (!found_raid1c34) |
| 862 | btrfs_clear_fs_incompat(fs_info, RAID1C34); | 862 | btrfs_clear_fs_incompat(fs_info, RAID1C34); |
| 863 | } | 863 | } |
| 864 | } | 864 | } |
| @@ -9496,6 +9496,10 @@ out_fail: · 9495 unmodified lines | |||
| 9496 | ret = btrfs_sync_log(trans, BTRFS_I(old_inode)->root, &ctx); | 9496 | ret = btrfs_sync_log(trans, BTRFS_I(old_inode)->root, &ctx); |
| 9497 | if (ret) | 9497 | if (ret) |
| 9498 | commit_transaction = true; | 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 | if (commit_transaction) { | 9504 | if (commit_transaction) { |
| 9501 | ret = btrfs_commit_transaction(trans); | 9505 | ret = btrfs_commit_transaction(trans); |
| @@ -555,7 +555,6 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, · 554 unmodified lines | |||
| 555 | if (server->ops->close) | 555 | if (server->ops->close) |
| 556 | server->ops->close(xid, tcon, &fid); | 556 | server->ops->close(xid, tcon, &fid); |
| 557 | cifs_del_pending_open(&open); | 557 | cifs_del_pending_open(&open); |
| 558 | fput(file); | ||
| 559 | rc = -ENOMEM; | 558 | rc = -ENOMEM; |
| 560 | } | 559 | } |
| 561 | 560 | ||
| @@ -1169,7 +1169,8 @@ try_again: · 1168 unmodified lines | |||
| 1169 | rc = posix_lock_file(file, flock, NULL); | 1169 | rc = posix_lock_file(file, flock, NULL); |
| 1170 | up_write(&cinode->lock_sem); | 1170 | up_write(&cinode->lock_sem); |
| 1171 | if (rc == FILE_LOCK_DEFERRED) { | 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 | if (!rc) | 1174 | if (!rc) |
| 1174 | goto try_again; | 1175 | goto try_again; |
| 1175 | locks_delete_block(flock); | 1176 | locks_delete_block(flock); |
| @@ -2191,7 +2191,7 @@ int cifs_getattr(const struct path *path, struct kstat *stat, · 2190 unmodified lines | |||
| 2191 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) | 2191 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) |
| 2192 | stat->gid = current_fsgid(); | 2192 | stat->gid = current_fsgid(); |
| 2193 | } | 2193 | } |
| 2194 | return rc; | 2194 | return 0; |
| 2195 | } | 2195 | } |
| 2196 | 2196 | ||
| 2197 | int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start, | 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 | goto qdf_free; | 2222 | goto qdf_free; |
| 2223 | } | 2223 | } |
| 2224 | 2224 | ||
| 2225 | atomic_inc(&tcon->num_remote_opens); | ||
| 2226 | |||
| 2225 | qd_rsp = (struct smb2_query_directory_rsp *)rsp_iov[1].iov_base; | 2227 | qd_rsp = (struct smb2_query_directory_rsp *)rsp_iov[1].iov_base; |
| 2226 | if (qd_rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) { | 2228 | if (qd_rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) { |
| 2227 | trace_smb3_query_dir_done(xid, fid->persistent_fid, | 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 | if (rc) | 3419 | if (rc) |
| 3418 | goto out; | 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 | rc = -EINVAL; | 3423 | rc = -EINVAL; |
| 3422 | goto out; | 3424 | goto out; |
| 3423 | } | 3425 | } |
| @@ -538,6 +538,15 @@ int fscrypt_drop_inode(struct inode *inode) · 537 unmodified lines | |||
| 538 | return 0; | 538 | return 0; |
| 539 | mk = ci->ci_master_key->payload.data[0]; | 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 | * Note: since we aren't holding ->mk_secret_sem, the result here can | 551 | * Note: since we aren't holding ->mk_secret_sem, the result here can |
| 543 | * immediately become outdated. But there's no correctness problem with | 552 | * immediately become outdated. But there's no correctness problem with |
| @@ -1854,9 +1854,9 @@ fetch_events: · 1853 unmodified lines | |||
| 1854 | waiter = true; | 1854 | waiter = true; |
| 1855 | init_waitqueue_entry(&wait, current); | 1855 | init_waitqueue_entry(&wait, current); |
| 1856 | 1856 | ||
| 1857 | spin_lock_irq(&ep->wq.lock); | 1857 | write_lock_irq(&ep->lock); |
| 1858 | __add_wait_queue_exclusive(&ep->wq, &wait); | 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 | for (;;) { | 1862 | for (;;) { |
| @@ -1904,9 +1904,9 @@ send_events: · 41 unmodified lines | |||
| 1904 | goto fetch_events; | 1904 | goto fetch_events; |
| 1905 | 1905 | ||
| 1906 | if (waiter) { | 1906 | if (waiter) { |
| 1907 | spin_lock_irq(&ep->wq.lock); | 1907 | write_lock_irq(&ep->lock); |
| 1908 | __remove_wait_queue(&ep->wq, &wait); | 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 | return res; | 1912 | return res; |
| @@ -540,9 +540,14 @@ static int alloc_fd(unsigned start, unsigned flags) · 539 unmodified lines | |||
| 540 | return __alloc_fd(current->files, start, rlimit(RLIMIT_NOFILE), flags); | 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 | int get_unused_fd_flags(unsigned flags) | 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 | EXPORT_SYMBOL(get_unused_fd_flags); | 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 | void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req) | 276 | void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req) |
| 277 | { | 277 | { |
| 278 | struct fuse_iqueue *fiq = &fc->iq; | 278 | struct fuse_iqueue *fiq = &fc->iq; |
| 279 | bool async; | ||
| 280 | 279 | ||
| 281 | if (test_and_set_bit(FR_FINISHED, &req->flags)) | 280 | if (test_and_set_bit(FR_FINISHED, &req->flags)) |
| 282 | goto put_request; | 281 | goto put_request; |
| 283 | 282 | ||
| 284 | async = req->args->end; | ||
| 285 | /* | 283 | /* |
| 286 | * test_and_set_bit() implies smp_mb() between bit | 284 | * test_and_set_bit() implies smp_mb() between bit |
| 287 | * changing and below intr_entry check. Pairs with | 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 | wake_up(&req->waitq); | 322 | wake_up(&req->waitq); |
| 325 | } | 323 | } |
| 326 | 324 | ||
| 327 | if (async) | 325 | if (test_bit(FR_ASYNC, &req->flags)) |
| 328 | req->args->end(fc, req->args, req->out.h.error); | 326 | req->args->end(fc, req->args, req->out.h.error); |
| 329 | put_request: | 327 | put_request: |
| 330 | fuse_put_request(fc, req); | 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 | req->in.h.opcode = args->opcode; | 469 | req->in.h.opcode = args->opcode; |
| 472 | req->in.h.nodeid = args->nodeid; | 470 | req->in.h.nodeid = args->nodeid; |
| 473 | req->args = args; | 471 | req->args = args; |
| 472 | if (args->end) | ||
| 473 | __set_bit(FR_ASYNC, &req->flags); | ||
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) | 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 | * FR_SENT: request is in userspace, waiting for an answer | 301 | * FR_SENT: request is in userspace, waiting for an answer |
| 302 | * FR_FINISHED: request is finished | 302 | * FR_FINISHED: request is finished |
| 303 | * FR_PRIVATE: request is on private list | 303 | * FR_PRIVATE: request is on private list |
| 304 | * FR_ASYNC: request is asynchronous | ||
| 304 | */ | 305 | */ |
| 305 | enum fuse_req_flag { | 306 | enum fuse_req_flag { |
| 306 | FR_ISREPLY, | 307 | FR_ISREPLY, |
| @@ -314,6 +315,7 @@ enum fuse_req_flag { · 7 unmodified lines | |||
| 314 | FR_SENT, | 315 | FR_SENT, |
| 315 | FR_FINISHED, | 316 | FR_FINISHED, |
| 316 | FR_PRIVATE, | 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 | if (!(file->f_mode & FMODE_OPENED)) | 1248 | if (!(file->f_mode & FMODE_OPENED)) |
| 1249 | return finish_no_open(file, d); | 1249 | return finish_no_open(file, d); |
| 1250 | dput(d); | 1250 | dput(d); |
| 1251 | return 0; | 1251 | return excl && (flags & O_CREAT) ? -EEXIST : 0; |
| 1252 | } | 1252 | } |
| 1253 | 1253 | ||
| 1254 | BUG_ON(d != NULL); | 1254 | BUG_ON(d != NULL); |
| @@ -138,6 +138,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) · 137 unmodified lines | |||
| 138 | inode->i_sb = sb; | 138 | inode->i_sb = sb; |
| 139 | inode->i_blkbits = sb->s_blocksize_bits; | 139 | inode->i_blkbits = sb->s_blocksize_bits; |
| 140 | inode->i_flags = 0; | 140 | inode->i_flags = 0; |
| 141 | atomic64_set(&inode->i_sequence, 0); | ||
| 141 | atomic_set(&inode->i_count, 1); | 142 | atomic_set(&inode->i_count, 1); |
| 142 | inode->i_op = &empty_iops; | 143 | inode->i_op = &empty_iops; |
| 143 | inode->i_fop = &no_open_fops; | 144 | inode->i_fop = &no_open_fops; |
| @@ -191,7 +191,6 @@ struct fixed_file_data { · 190 unmodified lines | |||
| 191 | struct llist_head put_llist; | 191 | struct llist_head put_llist; |
| 192 | struct work_struct ref_work; | 192 | struct work_struct ref_work; |
| 193 | struct completion done; | 193 | struct completion done; |
| 194 | struct rcu_head rcu; | ||
| 195 | }; | 194 | }; |
| 196 | 195 | ||
| 197 | struct io_ring_ctx { | 196 | struct io_ring_ctx { |
| @@ -344,6 +343,7 @@ struct io_accept { · 146 unmodified lines | |||
| 344 | struct sockaddr __user *addr; | 343 | struct sockaddr __user *addr; |
| 345 | int __user *addr_len; | 344 | int __user *addr_len; |
| 346 | int flags; | 345 | int flags; |
| 346 | unsigned long nofile; | ||
| 347 | }; | 347 | }; |
| 348 | 348 | ||
| 349 | struct io_sync { | 349 | struct io_sync { |
| @@ -398,6 +398,7 @@ struct io_open { · 48 unmodified lines | |||
| 398 | struct filename *filename; | 398 | struct filename *filename; |
| 399 | struct statx __user *buffer; | 399 | struct statx __user *buffer; |
| 400 | struct open_how how; | 400 | struct open_how how; |
| 401 | unsigned long nofile; | ||
| 401 | }; | 402 | }; |
| 402 | 403 | ||
| 403 | struct io_files_update { | 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 | return ret; | 2579 | return ret; |
| 2579 | } | 2580 | } |
| 2580 | 2581 | ||
| 2582 | req->open.nofile = rlimit(RLIMIT_NOFILE); | ||
| 2581 | req->flags |= REQ_F_NEED_CLEANUP; | 2583 | req->flags |= REQ_F_NEED_CLEANUP; |
| 2582 | return 0; | 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 | return ret; | 2621 | return ret; |
| 2620 | } | 2622 | } |
| 2621 | 2623 | ||
| 2624 | req->open.nofile = rlimit(RLIMIT_NOFILE); | ||
| 2622 | req->flags |= REQ_F_NEED_CLEANUP; | 2625 | req->flags |= REQ_F_NEED_CLEANUP; |
| 2623 | return 0; | 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 | if (ret) | 2640 | if (ret) |
| 2638 | goto err; | 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 | if (ret < 0) | 2644 | if (ret < 0) |
| 2642 | goto err; | 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 | accept->addr = u64_to_user_ptr(READ_ONCE(sqe->addr)); | 3325 | accept->addr = u64_to_user_ptr(READ_ONCE(sqe->addr)); |
| 3323 | accept->addr_len = u64_to_user_ptr(READ_ONCE(sqe->addr2)); | 3326 | accept->addr_len = u64_to_user_ptr(READ_ONCE(sqe->addr2)); |
| 3324 | accept->flags = READ_ONCE(sqe->accept_flags); | 3327 | accept->flags = READ_ONCE(sqe->accept_flags); |
| 3328 | accept->nofile = rlimit(RLIMIT_NOFILE); | ||
| 3325 | return 0; | 3329 | return 0; |
| 3326 | #else | 3330 | #else |
| 3327 | return -EOPNOTSUPP; | 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 | file_flags = force_nonblock ? O_NONBLOCK : 0; | 3343 | file_flags = force_nonblock ? O_NONBLOCK : 0; |
| 3340 | ret = __sys_accept4_file(req->file, file_flags, accept->addr, | 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 | if (ret == -EAGAIN && force_nonblock) | 3347 | if (ret == -EAGAIN && force_nonblock) |
| 3343 | return -EAGAIN; | 3348 | return -EAGAIN; |
| 3344 | if (ret == -ERESTARTSYS) | 3349 | if (ret == -ERESTARTSYS) |
| @@ -4132,6 +4137,9 @@ static int io_req_defer_prep(struct io_kiocb *req, · 787 unmodified lines | |||
| 4132 | { | 4137 | { |
| 4133 | ssize_t ret = 0; | 4138 | ssize_t ret = 0; |
| 4134 | 4139 | ||
| 4140 | if (!sqe) | ||
| 4141 | return 0; | ||
| 4142 | |||
| 4135 | if (io_op_defs[req->opcode].file_table) { | 4143 | if (io_op_defs[req->opcode].file_table) { |
| 4136 | ret = io_grab_files(req); | 4144 | ret = io_grab_files(req); |
| 4137 | if (unlikely(ret)) | 4145 | if (unlikely(ret)) |
| @@ -4908,6 +4916,11 @@ err_req: · 770 unmodified lines | |||
| 4908 | if (sqe_flags & (IOSQE_IO_LINK|IOSQE_IO_HARDLINK)) { | 4916 | if (sqe_flags & (IOSQE_IO_LINK|IOSQE_IO_HARDLINK)) { |
| 4909 | req->flags |= REQ_F_LINK; | 4917 | req->flags |= REQ_F_LINK; |
| 4910 | INIT_LIST_HEAD(&req->link_list); | 4918 | INIT_LIST_HEAD(&req->link_list); |
| 4919 | |||
| 4920 | if (io_alloc_async_ctx(req)) { | ||
| 4921 | ret = -EAGAIN; | ||
| 4922 | goto err_req; | ||
| 4923 | } | ||
| 4911 | ret = io_req_defer_prep(req, sqe); | 4924 | ret = io_req_defer_prep(req, sqe); |
| 4912 | if (ret) | 4925 | if (ret) |
| 4913 | req->flags |= REQ_F_FAIL_LINK; | 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 | complete(&data->done); | 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, | 5349 | struct fixed_file_data *data; |
| 5337 | rcu); | 5350 | |
| 5338 | percpu_ref_exit(&data->refs); | 5351 | data = container_of(work, struct fixed_file_data, ref_work); |
| 5339 | kfree(data); | ||
| 5340 | } | ||
| 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 | 5354 | * Ensure any percpu-ref atomic switch callback has run, it could have |
| 5346 | * existing call_rcu() for switching to atomic. One way to do that | 5355 | * been in progress when the files were being unregistered. Once |
| 5347 | * is to have this rcu callback queue the final put and free, as we | 5356 | * that's done, we can safely exit and free the ref and containing |
| 5348 | * could otherwise have a pre-existing atomic switch complete _after_ | 5357 | * data structure. |
| 5349 | * the free callback we queued. | ||
| 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 | static int io_sqe_files_unregister(struct io_ring_ctx *ctx) | 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 | for (i = 0; i < nr_tables; i++) | 5379 | for (i = 0; i < nr_tables; i++) |
| 5370 | kfree(data->table[i].files); | 5380 | kfree(data->table[i].files); |
| 5371 | kfree(data->table); | 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 | ctx->file_data = NULL; | 5384 | ctx->file_data = NULL; |
| 5374 | ctx->nr_user_files = 0; | 5385 | ctx->nr_user_files = 0; |
| 5375 | return 0; | 5386 | return 0; |
| @@ -725,7 +725,6 @@ static void __locks_delete_block(struct file_lock *waiter) · 724 unmodified lines | |||
| 725 | { | 725 | { |
| 726 | locks_delete_global_blocked(waiter); | 726 | locks_delete_global_blocked(waiter); |
| 727 | list_del_init(&waiter->fl_blocked_member); | 727 | list_del_init(&waiter->fl_blocked_member); |
| 728 | waiter->fl_blocker = NULL; | ||
| 729 | } | 728 | } |
| 730 | 729 | ||
| 731 | static void __locks_wake_up_blocks(struct file_lock *blocker) | 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 | waiter->fl_lmops->lm_notify(waiter); | 739 | waiter->fl_lmops->lm_notify(waiter); |
| 741 | else | 740 | else |
| 742 | wake_up(&waiter->fl_wait); | 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 | int status = -ENOENT; | 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 | spin_lock(&blocked_lock_lock); | 787 | spin_lock(&blocked_lock_lock); |
| 757 | if (waiter->fl_blocker) | 788 | if (waiter->fl_blocker) |
| 758 | status = 0; | 789 | status = 0; |
| 759 | __locks_wake_up_blocks(waiter); | 790 | __locks_wake_up_blocks(waiter); |
| 760 | __locks_delete_block(waiter); | 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 | spin_unlock(&blocked_lock_lock); | 798 | spin_unlock(&blocked_lock_lock); |
| 762 | return status; | 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 | error = posix_lock_inode(inode, fl, NULL); | 1387 | error = posix_lock_inode(inode, fl, NULL); |
| 1351 | if (error != FILE_LOCK_DEFERRED) | 1388 | if (error != FILE_LOCK_DEFERRED) |
| 1352 | break; | 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 | if (error) | 1392 | if (error) |
| 1355 | break; | 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 | error = posix_lock_inode(inode, &fl, NULL); | 1473 | error = posix_lock_inode(inode, &fl, NULL); |
| 1436 | if (error != FILE_LOCK_DEFERRED) | 1474 | if (error != FILE_LOCK_DEFERRED) |
| 1437 | break; | 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 | if (!error) { | 1478 | if (!error) { |
| 1440 | /* | 1479 | /* |
| 1441 | * If we've been sleeping someone might have | 1480 | * If we've been sleeping someone might have |
| @@ -1638,7 +1677,8 @@ restart: · 196 unmodified lines | |||
| 1638 | 1677 | ||
| 1639 | locks_dispose_list(&dispose); | 1678 | locks_dispose_list(&dispose); |
| 1640 | error = wait_event_interruptible_timeout(new_fl->fl_wait, | 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 | percpu_down_read(&file_rwsem); | 1683 | percpu_down_read(&file_rwsem); |
| 1644 | spin_lock(&ctx->flc_lock); | 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 | error = flock_lock_inode(inode, fl); | 2162 | error = flock_lock_inode(inode, fl); |
| 2123 | if (error != FILE_LOCK_DEFERRED) | 2163 | if (error != FILE_LOCK_DEFERRED) |
| 2124 | break; | 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 | if (error) | 2167 | if (error) |
| 2127 | break; | 2168 | break; |
| 2128 | } | 2169 | } |
| @@ -2399,7 +2440,8 @@ static int do_lock_file_wait(struct file *filp, unsigned int cmd, · 270 unmodified lines | |||
| 2399 | error = vfs_lock_file(filp, cmd, fl, NULL); | 2440 | error = vfs_lock_file(filp, cmd, fl, NULL); |
| 2400 | if (error != FILE_LOCK_DEFERRED) | 2441 | if (error != FILE_LOCK_DEFERRED) |
| 2401 | break; | 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 | if (error) | 2445 | if (error) |
| 2404 | break; | 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 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) | 153 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) |
| 154 | goto error_0; | 154 | goto error_0; |
| 155 | 155 | ||
| 156 | clp->cl_minorversion = cl_init->minorversion; | ||
| 156 | clp->cl_nfs_mod = cl_init->nfs_mod; | 157 | clp->cl_nfs_mod = cl_init->nfs_mod; |
| 157 | if (!try_module_get(clp->cl_nfs_mod->owner)) | 158 | if (!try_module_get(clp->cl_nfs_mod->owner)) |
| 158 | goto error_dealloc; | 159 | goto error_dealloc; |
| @@ -832,6 +832,8 @@ static int nfs_parse_source(struct fs_context *fc, · 831 unmodified lines | |||
| 832 | if (len > maxnamlen) | 832 | if (len > maxnamlen) |
| 833 | goto out_hostname; | 833 | goto out_hostname; |
| 834 | 834 | ||
| 835 | kfree(ctx->nfs_server.hostname); | ||
| 836 | |||
| 835 | /* N.B. caller will free nfs_server.hostname in all cases */ | 837 | /* N.B. caller will free nfs_server.hostname in all cases */ |
| 836 | ctx->nfs_server.hostname = kmemdup_nul(dev_name, len, GFP_KERNEL); | 838 | ctx->nfs_server.hostname = kmemdup_nul(dev_name, len, GFP_KERNEL); |
| 837 | if (!ctx->nfs_server.hostname) | 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 | ctx->nfs_mod = nfs_mod; | 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 | return 0; | 1252 | return 0; |
| 1244 | 1253 | ||
| 1245 | out_no_device_name: | 1254 | out_no_device_name: |
| @@ -31,6 +31,7 @@ static DEFINE_SPINLOCK(nfs_fscache_keys_lock); · 30 unmodified lines | |||
| 31 | struct nfs_server_key { | 31 | struct nfs_server_key { |
| 32 | struct { | 32 | struct { |
| 33 | uint16_t nfsversion; /* NFS protocol version */ | 33 | uint16_t nfsversion; /* NFS protocol version */ |
| 34 | uint32_t minorversion; /* NFSv4 minor version */ | ||
| 34 | uint16_t family; /* address family */ | 35 | uint16_t family; /* address family */ |
| 35 | __be16 port; /* IP port */ | 36 | __be16 port; /* IP port */ |
| 36 | } hdr; | 37 | } hdr; |
| @@ -55,6 +56,7 @@ void nfs_fscache_get_client_cookie(struct nfs_client *clp) · 18 unmodified lines | |||
| 55 | 56 | ||
| 56 | memset(&key, 0, sizeof(key)); | 57 | memset(&key, 0, sizeof(key)); |
| 57 | key.hdr.nfsversion = clp->rpc_ops->version; | 58 | key.hdr.nfsversion = clp->rpc_ops->version; |
| 59 | key.hdr.minorversion = clp->cl_minorversion; | ||
| 58 | key.hdr.family = clp->cl_addr.ss_family; | 60 | key.hdr.family = clp->cl_addr.ss_family; |
| 59 | 61 | ||
| 60 | switch (clp->cl_addr.ss_family) { | 62 | switch (clp->cl_addr.ss_family) { |
| @@ -153,7 +153,7 @@ struct vfsmount *nfs_d_automount(struct path *path) · 152 unmodified lines | |||
| 153 | /* Open a new filesystem context, transferring parameters from the | 153 | /* Open a new filesystem context, transferring parameters from the |
| 154 | * parent superblock, including the network namespace. | 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 | if (IS_ERR(fc)) | 157 | if (IS_ERR(fc)) |
| 158 | return ERR_CAST(fc); | 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 | INIT_LIST_HEAD(&clp->cl_ds_clients); | 216 | INIT_LIST_HEAD(&clp->cl_ds_clients); |
| 217 | rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); | 217 | rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); |
| 218 | clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; | 218 | clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; |
| 219 | clp->cl_minorversion = cl_init->minorversion; | ||
| 220 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; | 219 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; |
| 221 | clp->cl_mig_gen = 1; | 220 | clp->cl_mig_gen = 1; |
| 222 | #if IS_ENABLED(CONFIG_NFS_V4_1) | 221 | #if IS_ENABLED(CONFIG_NFS_V4_1) |
| @@ -860,9 +860,6 @@ cleanup_file: · 859 unmodified lines | |||
| 860 | * the return value of d_splice_alias(), then the caller needs to perform dput() | 860 | * the return value of d_splice_alias(), then the caller needs to perform dput() |
| 861 | * on it after finish_open(). | 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 | * Returns zero on success or -errno if the open failed. | 863 | * Returns zero on success or -errno if the open failed. |
| 867 | */ | 864 | */ |
| 868 | int finish_open(struct file *file, struct dentry *dentry, | 865 | int finish_open(struct file *file, struct dentry *dentry, |
| @@ -93,6 +93,7 @@ config OVERLAY_FS_XINO_AUTO · 92 unmodified lines | |||
| 93 | bool "Overlayfs: auto enable inode number mapping" | 93 | bool "Overlayfs: auto enable inode number mapping" |
| 94 | default n | 94 | default n |
| 95 | depends on OVERLAY_FS | 95 | depends on OVERLAY_FS |
| 96 | depends on 64BIT | ||
| 96 | help | 97 | help |
| 97 | If this config option is enabled then overlay filesystems will use | 98 | If this config option is enabled then overlay filesystems will use |
| 98 | unused high bits in undelying filesystem inode numbers to map all | 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 | if (iocb->ki_flags & IOCB_WRITE) { | 244 | if (iocb->ki_flags & IOCB_WRITE) { |
| 245 | struct inode *inode = file_inode(orig_iocb->ki_filp); | 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 | file_end_write(iocb->ki_filp); | 250 | file_end_write(iocb->ki_filp); |
| 248 | ovl_copyattr(ovl_inode_real(inode), inode); | 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 | goto out; | 349 | goto out; |
| 347 | 350 | ||
| 348 | file_start_write(real.file); | 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 | aio_req->fd = real; | 355 | aio_req->fd = real; |
| 350 | real.flags = 0; | 356 | real.flags = 0; |
| 351 | aio_req->orig_iocb = iocb; | 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 | return ovl_same_dev(sb) ? OVL_FS(sb)->xino_mode : 0; | 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 | return mutex_lock_interruptible(&OVL_I(inode)->lock); | 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 | if (ofs->config.xino == OVL_XINO_ON) | 1411 | if (ofs->config.xino == OVL_XINO_ON) |
| 1412 | pr_info("\"xino=on\" is useless with all layers on same fs, ignore.\n"); | 1412 | pr_info("\"xino=on\" is useless with all layers on same fs, ignore.\n"); |
| 1413 | ofs->xino_mode = 0; | 1413 | ofs->xino_mode = 0; |
| 1414 | } else if (ofs->config.xino == OVL_XINO_OFF) { | ||
| 1415 | ofs->xino_mode = -1; | ||
| 1414 | } else if (ofs->config.xino == OVL_XINO_ON && ofs->xino_mode < 0) { | 1416 | } else if (ofs->config.xino == OVL_XINO_ON && ofs->xino_mode < 0) { |
| 1415 | /* | 1417 | /* |
| 1416 | * This is a roundup of number of bits needed for encoding | 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 | sb->s_stack_depth = 0; | 1625 | sb->s_stack_depth = 0; |
| 1624 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 1626 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 1625 | /* Assume underlaying fs uses 32bit inodes unless proven otherwise */ | 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 | ofs->xino_mode = BITS_PER_LONG - 32; | 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 | /* alloc/destroy_inode needed for setting up traps in inode cache */ | 1636 | /* alloc/destroy_inode needed for setting up traps in inode cache */ |
| 1630 | sb->s_op = &ovl_super_operations; | 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 | struct inode *inode = d_inode(dentry); | 509 | struct inode *inode = d_inode(dentry); |
| 510 | int err; | 510 | int err; |
| 511 | 511 | ||
| 512 | err = ovl_inode_lock(inode); | 512 | err = ovl_inode_lock_interruptible(inode); |
| 513 | if (!err && ovl_already_copied_up_locked(dentry, flags)) { | 513 | if (!err && ovl_already_copied_up_locked(dentry, flags)) { |
| 514 | err = 1; /* Already copied up */ | 514 | err = 1; /* Already copied up */ |
| 515 | ovl_inode_unlock(inode); | 515 | ovl_inode_unlock(inode); |
| @@ -764,7 +764,7 @@ int ovl_nlink_start(struct dentry *dentry) · 248 unmodified lines | |||
| 764 | return err; | 764 | return err; |
| 765 | } | 765 | } |
| 766 | 766 | ||
| 767 | err = ovl_inode_lock(inode); | 767 | err = ovl_inode_lock_interruptible(inode); |
| 768 | if (err) | 768 | if (err) |
| 769 | return err; | 769 | return err; |
| 770 | 770 | ||
| @@ -33,7 +33,8 @@ bool __must_check curve25519(u8 mypublic[CURVE25519_KEY_SIZE], · 32 unmodified lines | |||
| 33 | const u8 secret[CURVE25519_KEY_SIZE], | 33 | const u8 secret[CURVE25519_KEY_SIZE], |
| 34 | const u8 basepoint[CURVE25519_KEY_SIZE]) | 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 | curve25519_arch(mypublic, secret, basepoint); | 38 | curve25519_arch(mypublic, secret, basepoint); |
| 38 | else | 39 | else |
| 39 | curve25519_generic(mypublic, secret, basepoint); | 40 | curve25519_generic(mypublic, secret, basepoint); |
| @@ -49,7 +50,8 @@ __must_check curve25519_generate_public(u8 pub[CURVE25519_KEY_SIZE], · 9 unmodified lines | |||
| 49 | CURVE25519_KEY_SIZE))) | 50 | CURVE25519_KEY_SIZE))) |
| 50 | return false; | 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 | curve25519_base_arch(pub, secret); | 55 | curve25519_base_arch(pub, secret); |
| 54 | else | 56 | else |
| 55 | curve25519_generic(pub, secret, curve25519_base_point); | 57 | curve25519_generic(pub, secret, curve25519_base_point); |
| @@ -81,7 +81,7 @@ struct drm_dp_vcpi { · 80 unmodified lines | |||
| 81 | * &drm_dp_mst_topology_mgr.base.lock. | 81 | * &drm_dp_mst_topology_mgr.base.lock. |
| 82 | * @num_sdp_stream_sinks: Number of stream sinks. Protected by | 82 | * @num_sdp_stream_sinks: Number of stream sinks. Protected by |
| 83 | * &drm_dp_mst_topology_mgr.base.lock. | 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 | * &drm_dp_mst_topology_mgr.base.lock. | 85 | * &drm_dp_mst_topology_mgr.base.lock. |
| 86 | * @next: link to next port on this branch device | 86 | * @next: link to next port on this branch device |
| 87 | * @aux: i2c aux transport to talk to device connected to this port, protected | 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 | u8 dpcd_rev; | 126 | u8 dpcd_rev; |
| 127 | u8 num_sdp_streams; | 127 | u8 num_sdp_streams; |
| 128 | u8 num_sdp_stream_sinks; | 128 | u8 num_sdp_stream_sinks; |
| 129 | uint16_t available_pbn; | 129 | uint16_t full_pbn; |
| 130 | struct list_head next; | 130 | struct list_head next; |
| 131 | /** | 131 | /** |
| 132 | * @mstb: the branch device connected to this port, if there is one. | 132 | * @mstb: the branch device connected to this port, if there is one. |
| @@ -122,8 +122,8 @@ · 121 unmodified lines | |||
| 122 | #define IMX8MN_CLK_I2C1 105 | 122 | #define IMX8MN_CLK_I2C1 105 |
| 123 | #define IMX8MN_CLK_I2C2 106 | 123 | #define IMX8MN_CLK_I2C2 106 |
| 124 | #define IMX8MN_CLK_I2C3 107 | 124 | #define IMX8MN_CLK_I2C3 107 |
| 125 | #define IMX8MN_CLK_I2C4 118 | 125 | #define IMX8MN_CLK_I2C4 108 |
| 126 | #define IMX8MN_CLK_UART1 119 | 126 | #define IMX8MN_CLK_UART1 109 |
| 127 | #define IMX8MN_CLK_UART2 110 | 127 | #define IMX8MN_CLK_UART2 110 |
| 128 | #define IMX8MN_CLK_UART3 111 | 128 | #define IMX8MN_CLK_UART3 111 |
| 129 | #define IMX8MN_CLK_UART4 112 | 129 | #define IMX8MN_CLK_UART4 112 |
| @@ -62,6 +62,7 @@ struct css_task_iter { · 61 unmodified lines | |||
| 62 | struct list_head *mg_tasks_head; | 62 | struct list_head *mg_tasks_head; |
| 63 | struct list_head *dying_tasks_head; | 63 | struct list_head *dying_tasks_head; |
| 64 | 64 | ||
| 65 | struct list_head *cur_tasks_head; | ||
| 65 | struct css_set *cur_cset; | 66 | struct css_set *cur_cset; |
| 66 | struct css_set *cur_dcset; | 67 | struct css_set *cur_dcset; |
| 67 | struct task_struct *cur_task; | 68 | struct task_struct *cur_task; |
| @@ -69,19 +69,23 @@ struct dmar_pci_notify_info { · 68 unmodified lines | |||
| 69 | extern struct rw_semaphore dmar_global_lock; | 69 | extern struct rw_semaphore dmar_global_lock; |
| 70 | extern struct list_head dmar_drhd_units; | 70 | extern struct list_head dmar_drhd_units; |
| 71 | 71 | ||
| 72 | #define for_each_drhd_unit(drhd) \ | 72 | #define for_each_drhd_unit(drhd) \ |
| 73 | list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) | 73 | list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \ |
| 74 | dmar_rcu_check()) | ||
| 74 | 75 | ||
| 75 | #define for_each_active_drhd_unit(drhd) \ | 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 | if (drhd->ignored) {} else | 79 | if (drhd->ignored) {} else |
| 78 | 80 | ||
| 79 | #define for_each_active_iommu(i, drhd) \ | 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 | if (i=drhd->iommu, drhd->ignored) {} else | 84 | if (i=drhd->iommu, drhd->ignored) {} else |
| 82 | 85 | ||
| 83 | #define for_each_iommu(i, drhd) \ | 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 | if (i=drhd->iommu, 0) {} else | 89 | if (i=drhd->iommu, 0) {} else |
| 86 | 90 | ||
| 87 | static inline bool dmar_rcu_check(void) | 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 | extern int replace_fd(unsigned fd, struct file *file, unsigned flags); | 85 | extern int replace_fd(unsigned fd, struct file *file, unsigned flags); |
| 86 | extern void set_close_on_exec(unsigned int fd, int flag); | 86 | extern void set_close_on_exec(unsigned int fd, int flag); |
| 87 | extern bool get_close_on_exec(unsigned int fd); | 87 | extern bool get_close_on_exec(unsigned int fd); |
| 88 | extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile); | ||
| 88 | extern int get_unused_fd_flags(unsigned flags); | 89 | extern int get_unused_fd_flags(unsigned flags); |
| 89 | extern void put_unused_fd(unsigned int fd); | 90 | extern void put_unused_fd(unsigned int fd); |
| 90 | 91 | ||
| @@ -698,6 +698,7 @@ struct inode { · 697 unmodified lines | |||
| 698 | struct rcu_head i_rcu; | 698 | struct rcu_head i_rcu; |
| 699 | }; | 699 | }; |
| 700 | atomic64_t i_version; | 700 | atomic64_t i_version; |
| 701 | atomic64_t i_sequence; /* see futex */ | ||
| 701 | atomic_t i_count; | 702 | atomic_t i_count; |
| 702 | atomic_t i_dio_count; | 703 | atomic_t i_dio_count; |
| 703 | atomic_t i_writecount; | 704 | atomic_t i_writecount; |
| @@ -31,23 +31,26 @@ struct task_struct; · 30 unmodified lines | |||
| 31 | 31 | ||
| 32 | union futex_key { | 32 | union futex_key { |
| 33 | struct { | 33 | struct { |
| 34 | u64 i_seq; | ||
| 34 | unsigned long pgoff; | 35 | unsigned long pgoff; |
| 35 | struct inode *inode; | 36 | unsigned int offset; |
| 36 | int offset; | ||
| 37 | } shared; | 37 | } shared; |
| 38 | struct { | 38 | struct { |
| 39 | union { | ||
| 40 | struct mm_struct *mm; | ||
| 41 | u64 __tmp; | ||
| 42 | }; | ||
| 39 | unsigned long address; | 43 | unsigned long address; |
| 40 | struct mm_struct *mm; | 44 | unsigned int offset; |
| 41 | int offset; | ||
| 42 | } private; | 45 | } private; |
| 43 | struct { | 46 | struct { |
| 47 | u64 ptr; | ||
| 44 | unsigned long word; | 48 | unsigned long word; |
| 45 | void *ptr; | 49 | unsigned int offset; |
| 46 | int offset; | ||
| 47 | } both; | 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 | #ifdef CONFIG_FUTEX | 55 | #ifdef CONFIG_FUTEX |
| 53 | enum { | 56 | enum { |
| @@ -245,18 +245,6 @@ static inline bool disk_part_scan_enabled(struct gendisk *disk) · 244 unmodified lines | |||
| 245 | !(disk->flags & GENHD_FL_NO_PART_SCAN); | 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 | static inline dev_t disk_devt(struct gendisk *disk) | 248 | static inline dev_t disk_devt(struct gendisk *disk) |
| 261 | { | 249 | { |
| 262 | return MKDEV(disk->major, disk->first_minor); | 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 | extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, | 287 | extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, |
| 300 | sector_t sector); | 288 | sector_t sector); |
| 289 | bool disk_has_partitions(struct gendisk *disk); | ||
| 301 | 290 | ||
| 302 | /* | 291 | /* |
| 303 | * Macros to operate on percpu disk statistics: | 292 | * Macros to operate on percpu disk statistics: |
| @@ -2,15 +2,10 @@ · 1 unmodified line | |||
| 2 | #ifndef _INET_DIAG_H_ | 2 | #ifndef _INET_DIAG_H_ |
| 3 | #define _INET_DIAG_H_ 1 | 3 | #define _INET_DIAG_H_ 1 |
| 4 | 4 | ||
| 5 | #include <net/netlink.h> | ||
| 5 | #include <uapi/linux/inet_diag.h> | 6 | #include <uapi/linux/inet_diag.h> |
| 6 | 7 | ||
| 7 | struct net; | ||
| 8 | struct sock; | ||
| 9 | struct inet_hashinfo; | 8 | struct inet_hashinfo; |
| 10 | struct nlattr; | ||
| 11 | struct nlmsghdr; | ||
| 12 | struct sk_buff; | ||
| 13 | struct netlink_callback; | ||
| 14 | 9 | ||
| 15 | struct inet_diag_handler { | 10 | struct inet_diag_handler { |
| 16 | void (*dump)(struct sk_buff *skb, | 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 | void inet_diag_msg_common_fill(struct inet_diag_msg *r, struct sock *sk); | 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 | int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb, | 71 | int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb, |
| 66 | struct inet_diag_msg *r, int ext, | 72 | struct inet_diag_msg *r, int ext, |
| 67 | struct user_namespace *user_ns, bool net_admin); | 73 | struct user_namespace *user_ns, bool net_admin); |
| @@ -123,6 +123,8 @@ · 122 unmodified lines | |||
| 123 | 123 | ||
| 124 | #define dmar_readq(a) readq(a) | 124 | #define dmar_readq(a) readq(a) |
| 125 | #define dmar_writeq(a,v) writeq(v,a) | 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 | #define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4) | 129 | #define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4) |
| 128 | #define DMAR_VER_MINOR(v) ((v) & 0x0f) | 130 | #define DMAR_VER_MINOR(v) ((v) & 0x0f) |
| @@ -333,6 +333,7 @@ struct mmc_host { · 332 unmodified lines | |||
| 333 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | \ | 333 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | \ |
| 334 | MMC_CAP_UHS_DDR50) | 334 | MMC_CAP_UHS_DDR50) |
| 335 | #define MMC_CAP_SYNC_RUNTIME_PM (1 << 21) /* Synced runtime PM suspends. */ | 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 | #define MMC_CAP_DRIVER_TYPE_A (1 << 23) /* Host supports Driver Type A */ | 337 | #define MMC_CAP_DRIVER_TYPE_A (1 << 23) /* Host supports Driver Type A */ |
| 337 | #define MMC_CAP_DRIVER_TYPE_C (1 << 24) /* Host supports Driver Type C */ | 338 | #define MMC_CAP_DRIVER_TYPE_C (1 << 24) /* Host supports Driver Type C */ |
| 338 | #define MMC_CAP_DRIVER_TYPE_D (1 << 25) /* Host supports Driver Type D */ | 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 | #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_OF) | 12 | #if defined(CONFIG_COMMON_CLK) && defined(CONFIG_OF) |
| 13 | 13 | ||
| 14 | unsigned int of_clk_get_parent_count(struct device_node *np); | 14 | unsigned int of_clk_get_parent_count(const struct device_node *np); |
| 15 | const char *of_clk_get_parent_name(struct device_node *np, int index); | 15 | const char *of_clk_get_parent_name(const struct device_node *np, int index); |
| 16 | void of_clk_init(const struct of_device_id *matches); | 16 | void of_clk_init(const struct of_device_id *matches); |
| 17 | 17 | ||
| 18 | #else /* !CONFIG_COMMON_CLK || !CONFIG_OF */ | 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 | return 0; | 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 | int index) | 25 | int index) |
| 26 | { | 26 | { |
| 27 | return NULL; | 27 | return NULL; |
| @@ -311,7 +311,7 @@ static inline int TestClearPage##uname(struct page *page) { return 0; } · 310 unmodified lines | |||
| 311 | 311 | ||
| 312 | __PAGEFLAG(Locked, locked, PF_NO_TAIL) | 312 | __PAGEFLAG(Locked, locked, PF_NO_TAIL) |
| 313 | PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) | 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 | PAGEFLAG(Referenced, referenced, PF_HEAD) | 315 | PAGEFLAG(Referenced, referenced, PF_HEAD) |
| 316 | TESTCLEARFLAG(Referenced, referenced, PF_HEAD) | 316 | TESTCLEARFLAG(Referenced, referenced, PF_HEAD) |
| 317 | __SETPAGEFLAG(Referenced, referenced, PF_HEAD) | 317 | __SETPAGEFLAG(Referenced, referenced, PF_HEAD) |
| @@ -357,6 +357,7 @@ struct macsec_ops; · 356 unmodified lines | |||
| 357 | * is_gigabit_capable: Set to true if PHY supports 1000Mbps | 357 | * is_gigabit_capable: Set to true if PHY supports 1000Mbps |
| 358 | * has_fixups: Set to true if this phy has fixups/quirks. | 358 | * has_fixups: Set to true if this phy has fixups/quirks. |
| 359 | * suspended: Set to true if this phy has been suspended successfully. | 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 | * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. | 361 | * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. |
| 361 | * loopback_enabled: Set true if this phy has been loopbacked successfully. | 362 | * loopback_enabled: Set true if this phy has been loopbacked successfully. |
| 362 | * state: state of the PHY for management purposes | 363 | * state: state of the PHY for management purposes |
| @@ -396,6 +397,7 @@ struct phy_device { · 33 unmodified lines | |||
| 396 | unsigned is_gigabit_capable:1; | 397 | unsigned is_gigabit_capable:1; |
| 397 | unsigned has_fixups:1; | 398 | unsigned has_fixups:1; |
| 398 | unsigned suspended:1; | 399 | unsigned suspended:1; |
| 400 | unsigned suspended_by_mdio_bus:1; | ||
| 399 | unsigned sysfs_links:1; | 401 | unsigned sysfs_links:1; |
| 400 | unsigned loopback_enabled:1; | 402 | unsigned loopback_enabled:1; |
| 401 | 403 | ||
| @@ -557,6 +559,7 @@ struct phy_driver { · 155 unmodified lines | |||
| 557 | /* | 559 | /* |
| 558 | * Checks if the PHY generated an interrupt. | 560 | * Checks if the PHY generated an interrupt. |
| 559 | * For multi-PHY devices with shared PHY interrupt pin | 561 | * For multi-PHY devices with shared PHY interrupt pin |
| 562 | * Set interrupt bits have to be cleared. | ||
| 560 | */ | 563 | */ |
| 561 | int (*did_interrupt)(struct phy_device *phydev); | 564 | int (*did_interrupt)(struct phy_device *phydev); |
| 562 | 565 | ||
| @@ -24,7 +24,7 @@ struct platform_device { · 23 unmodified lines | |||
| 24 | int id; | 24 | int id; |
| 25 | bool id_auto; | 25 | bool id_auto; |
| 26 | struct device dev; | 26 | struct device dev; |
| 27 | u64 dma_mask; | 27 | u64 platform_dma_mask; |
| 28 | u32 num_resources; | 28 | u32 num_resources; |
| 29 | struct resource *resource; | 29 | struct resource *resource; |
| 30 | 30 | ||
| @@ -972,9 +972,9 @@ static inline int rhashtable_lookup_insert_key( · 971 unmodified lines | |||
| 972 | /** | 972 | /** |
| 973 | * rhashtable_lookup_get_insert_key - lookup and insert object into hash table | 973 | * rhashtable_lookup_get_insert_key - lookup and insert object into hash table |
| 974 | * @ht: hash table | 974 | * @ht: hash table |
| 975 | * @key: key | ||
| 975 | * @obj: pointer to hash head inside object | 976 | * @obj: pointer to hash head inside object |
| 976 | * @params: hash table parameters | 977 | * @params: hash table parameters |
| 977 | * @data: pointer to element data already in hashes | ||
| 978 | * | 978 | * |
| 979 | * Just like rhashtable_lookup_insert_key(), but this function returns the | 979 | * Just like rhashtable_lookup_insert_key(), but this function returns the |
| 980 | * object if it exists, NULL if it does not and the insertion was successful, | 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 | int addr_len); | 401 | int addr_len); |
| 402 | extern int __sys_accept4_file(struct file *file, unsigned file_flags, | 402 | extern int __sys_accept4_file(struct file *file, unsigned file_flags, |
| 403 | struct sockaddr __user *upeer_sockaddr, | 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 | extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, | 406 | extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, |
| 406 | int __user *upeer_addrlen, int flags); | 407 | int __user *upeer_addrlen, int flags); |
| 407 | extern int __sys_socket(int family, int type, int protocol); | 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 | extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, | 142 | extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, |
| 143 | unsigned long pgoff); | 143 | unsigned long pgoff); |
| 144 | void vmalloc_sync_all(void); | 144 | void vmalloc_sync_mappings(void); |
| 145 | 145 | void vmalloc_sync_unmappings(void); | |
| 146 | |||
| 146 | /* | 147 | /* |
| 147 | * Lowlevel-APIs (not for driver use!) | 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 | * We queue the work to the CPU on which it was submitted, but if the CPU dies | 488 | * We queue the work to the CPU on which it was submitted, but if the CPU dies |
| 489 | * it can be processed by another CPU. | 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 | static inline bool queue_work(struct workqueue_struct *wq, | 504 | static inline bool queue_work(struct workqueue_struct *wq, |
| 492 | struct work_struct *work) | 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 | * This puts a job in the kernel-global workqueue if it was not already | 559 | * This puts a job in the kernel-global workqueue if it was not already |
| 547 | * queued and leaves it in the same position on the kernel-global | 560 | * queued and leaves it in the same position on the kernel-global |
| 548 | * workqueue otherwise. | 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 | static inline bool schedule_work(struct work_struct *work) | 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 | [FRA_OIFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, \ | 108 | [FRA_OIFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, \ |
| 109 | [FRA_PRIORITY] = { .type = NLA_U32 }, \ | 109 | [FRA_PRIORITY] = { .type = NLA_U32 }, \ |
| 110 | [FRA_FWMARK] = { .type = NLA_U32 }, \ | 110 | [FRA_FWMARK] = { .type = NLA_U32 }, \ |
| 111 | [FRA_TUN_ID] = { .type = NLA_U64 }, \ | ||
| 111 | [FRA_FWMASK] = { .type = NLA_U32 }, \ | 112 | [FRA_FWMASK] = { .type = NLA_U32 }, \ |
| 112 | [FRA_TABLE] = { .type = NLA_U32 }, \ | 113 | [FRA_TABLE] = { .type = NLA_U32 }, \ |
| 113 | [FRA_SUPPRESS_PREFIXLEN] = { .type = NLA_U32 }, \ | 114 | [FRA_SUPPRESS_PREFIXLEN] = { .type = NLA_U32 }, \ |
| @@ -74,7 +74,7 @@ · 73 unmodified lines | |||
| 74 | #define DEV_MAC_TAGS_CFG_TAG_ID_M GENMASK(31, 16) | 74 | #define DEV_MAC_TAGS_CFG_TAG_ID_M GENMASK(31, 16) |
| 75 | #define DEV_MAC_TAGS_CFG_TAG_ID_X(x) (((x) & GENMASK(31, 16)) >> 16) | 75 | #define DEV_MAC_TAGS_CFG_TAG_ID_X(x) (((x) & GENMASK(31, 16)) >> 16) |
| 76 | #define DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA BIT(2) | 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 | #define DEV_MAC_TAGS_CFG_VLAN_AWR_ENA BIT(0) | 78 | #define DEV_MAC_TAGS_CFG_VLAN_AWR_ENA BIT(0) |
| 79 | 79 | ||
| 80 | #define DEV_MAC_ADV_CHK_CFG 0x2c | 80 | #define DEV_MAC_ADV_CHK_CFG 0x2c |
| @@ -74,6 +74,8 @@ enum { · 73 unmodified lines | |||
| 74 | #define IPPROTO_UDPLITE IPPROTO_UDPLITE | 74 | #define IPPROTO_UDPLITE IPPROTO_UDPLITE |
| 75 | IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ | 75 | IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ |
| 76 | #define IPPROTO_MPLS IPPROTO_MPLS | 76 | #define IPPROTO_MPLS IPPROTO_MPLS |
| 77 | IPPROTO_ETHERNET = 143, /* Ethernet-within-IPv6 Encapsulation */ | ||
| 78 | #define IPPROTO_ETHERNET IPPROTO_ETHERNET | ||
| 77 | IPPROTO_RAW = 255, /* Raw IP packets */ | 79 | IPPROTO_RAW = 255, /* Raw IP packets */ |
| 78 | #define IPPROTO_RAW IPPROTO_RAW | 80 | #define IPPROTO_RAW IPPROTO_RAW |
| 79 | IPPROTO_MPTCP = 262, /* Multipath TCP connection */ | 81 | IPPROTO_MPTCP = 262, /* Multipath TCP connection */ |
| @@ -767,8 +767,7 @@ config ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH · 766 unmodified lines | |||
| 767 | bool | 767 | bool |
| 768 | 768 | ||
| 769 | config CC_HAS_INT128 | 769 | config CC_HAS_INT128 |
| 770 | def_bool y | 770 | def_bool !$(cc-option,$(m64-flag) -D__SIZEOF_INT128__=0) && 64BIT |
| 771 | depends on !$(cc-option,-D__SIZEOF_INT128__=0) | ||
| 772 | 771 | ||
| 773 | # | 772 | # |
| 774 | # For architectures that know their GCC __int128 support is sound | 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 | p++; | 472 | p++; |
| 473 | if (p >= end) { | 473 | if (p >= end) { |
| 474 | (*pos)++; | ||
| 474 | return NULL; | 475 | return NULL; |
| 475 | } else { | 476 | } else { |
| 476 | *pos = *p; | 477 | *pos = *p; |
| @@ -782,7 +783,7 @@ void cgroup1_release_agent(struct work_struct *work) · 305 unmodified lines | |||
| 782 | 783 | ||
| 783 | pathbuf = kmalloc(PATH_MAX, GFP_KERNEL); | 784 | pathbuf = kmalloc(PATH_MAX, GFP_KERNEL); |
| 784 | agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); | 785 | agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); |
| 785 | if (!pathbuf || !agentbuf) | 786 | if (!pathbuf || !agentbuf || !strlen(agentbuf)) |
| 786 | goto out; | 787 | goto out; |
| 787 | 788 | ||
| 788 | spin_lock_irq(&css_set_lock); | 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 | static int cgroup_io_pressure_show(struct seq_file *seq, void *v) | 3542 | static int cgroup_io_pressure_show(struct seq_file *seq, void *v) |
| 3543 | { | 3543 | { |
| 3544 | struct cgroup *cgrp = seq_css(seq)->cgroup; | 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 | return psi_show(seq, psi, PSI_IO); | 3547 | return psi_show(seq, psi, PSI_IO); |
| 3548 | } | 3548 | } |
| 3549 | static int cgroup_memory_pressure_show(struct seq_file *seq, void *v) | 3549 | static int cgroup_memory_pressure_show(struct seq_file *seq, void *v) |
| 3550 | { | 3550 | { |
| 3551 | struct cgroup *cgrp = seq_css(seq)->cgroup; | 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 | return psi_show(seq, psi, PSI_MEM); | 3554 | return psi_show(seq, psi, PSI_MEM); |
| 3555 | } | 3555 | } |
| 3556 | static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v) | 3556 | static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v) |
| 3557 | { | 3557 | { |
| 3558 | struct cgroup *cgrp = seq_css(seq)->cgroup; | 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 | return psi_show(seq, psi, PSI_CPU); | 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 | } while (!css_set_populated(cset) && list_empty(&cset->dying_tasks)); | 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 | it->task_pos = cset->tasks.next; | 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 | it->task_pos = cset->mg_tasks.next; | 4407 | it->task_pos = cset->mg_tasks.next; |
| 4407 | else | 4408 | it->cur_tasks_head = &cset->mg_tasks; |
| 4409 | } else { | ||
| 4408 | it->task_pos = cset->dying_tasks.next; | 4410 | it->task_pos = cset->dying_tasks.next; |
| 4411 | it->cur_tasks_head = &cset->dying_tasks; | ||
| 4412 | } | ||
| 4409 | 4413 | ||
| 4410 | it->tasks_head = &cset->tasks; | 4414 | it->tasks_head = &cset->tasks; |
| 4411 | it->mg_tasks_head = &cset->mg_tasks; | 4415 | it->mg_tasks_head = &cset->mg_tasks; |
| @@ -4463,10 +4467,14 @@ repeat: · 51 unmodified lines | |||
| 4463 | else | 4467 | else |
| 4464 | it->task_pos = it->task_pos->next; | 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 | it->task_pos = it->mg_tasks_head->next; | 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 | it->task_pos = it->dying_tasks_head->next; | 4475 | it->task_pos = it->dying_tasks_head->next; |
| 4476 | it->cur_tasks_head = it->dying_tasks_head; | ||
| 4477 | } | ||
| 4470 | if (it->task_pos == it->dying_tasks_head) | 4478 | if (it->task_pos == it->dying_tasks_head) |
| 4471 | css_task_iter_advance_css_set(it); | 4479 | css_task_iter_advance_css_set(it); |
| 4472 | } else { | 4480 | } else { |
| @@ -4485,11 +4493,12 @@ repeat: · 12 unmodified lines | |||
| 4485 | goto repeat; | 4493 | goto repeat; |
| 4486 | 4494 | ||
| 4487 | /* and dying leaders w/o live member threads */ | 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 | goto repeat; | 4498 | goto repeat; |
| 4490 | } else { | 4499 | } else { |
| 4491 | /* skip all dying ones */ | 4500 | /* skip all dying ones */ |
| 4492 | if (task->flags & PF_EXITING) | 4501 | if (it->cur_tasks_head == it->dying_tasks_head) |
| 4493 | goto repeat; | 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 | struct kernfs_open_file *of = s->private; | 4604 | struct kernfs_open_file *of = s->private; |
| 4596 | struct css_task_iter *it = of->priv; | 4605 | struct css_task_iter *it = of->priv; |
| 4597 | 4606 | ||
| 4607 | if (pos) | ||
| 4608 | (*pos)++; | ||
| 4609 | |||
| 4598 | return css_task_iter_next(it); | 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 | * from position 0, so we can simply keep iterating on !0 *pos. | 4622 | * from position 0, so we can simply keep iterating on !0 *pos. |
| 4611 | */ | 4623 | */ |
| 4612 | if (!it) { | 4624 | if (!it) { |
| 4613 | if (WARN_ON_ONCE((*pos)++)) | 4625 | if (WARN_ON_ONCE((*pos))) |
| 4614 | return ERR_PTR(-EINVAL); | 4626 | return ERR_PTR(-EINVAL); |
| 4615 | 4627 | ||
| 4616 | it = kzalloc(sizeof(*it), GFP_KERNEL); | 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 | return ERR_PTR(-ENOMEM); | 4630 | return ERR_PTR(-ENOMEM); |
| 4619 | of->priv = it; | 4631 | of->priv = it; |
| 4620 | css_task_iter_start(&cgrp->self, iter_flags, it); | 4632 | css_task_iter_start(&cgrp->self, iter_flags, it); |
| 4621 | } else if (!(*pos)++) { | 4633 | } else if (!(*pos)) { |
| 4622 | css_task_iter_end(it); | 4634 | css_task_iter_end(it); |
| 4623 | css_task_iter_start(&cgrp->self, iter_flags, it); | 4635 | css_task_iter_start(&cgrp->self, iter_flags, it); |
| 4624 | } | 4636 | } else |
| 4637 | return it->cur_task; | ||
| 4625 | 4638 | ||
| 4626 | return cgroup_procs_next(s, NULL, NULL); | 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 | return; | 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 | rcu_read_lock(); | 6278 | rcu_read_lock(); |
| 6262 | 6279 | ||
| 6263 | while (true) { | 6280 | while (true) { |
| @@ -385,9 +385,9 @@ static inline int hb_waiters_pending(struct futex_hash_bucket *hb) · 384 unmodified lines | |||
| 385 | */ | 385 | */ |
| 386 | static struct futex_hash_bucket *hash_futex(union futex_key *key) | 386 | static struct futex_hash_bucket *hash_futex(union futex_key *key) |
| 387 | { | 387 | { |
| 388 | u32 hash = jhash2((u32*)&key->both.word, | 388 | u32 hash = jhash2((u32 *)key, offsetof(typeof(*key), both.offset) / 4, |
| 389 | (sizeof(key->both.word)+sizeof(key->both.ptr))/4, | ||
| 390 | key->both.offset); | 389 | key->both.offset); |
| 390 | |||
| 391 | return &futex_queues[hash & (futex_hashsize - 1)]; | 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 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { | 430 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
| 431 | case FUT_OFF_INODE: | 431 | case FUT_OFF_INODE: |
| 432 | ihold(key->shared.inode); /* implies smp_mb(); (B) */ | 432 | smp_mb(); /* explicit smp_mb(); (B) */ |
| 433 | break; | 433 | break; |
| 434 | case FUT_OFF_MMSHARED: | 434 | case FUT_OFF_MMSHARED: |
| 435 | futex_get_mm(key); /* implies smp_mb(); (B) */ | 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 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { | 464 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
| 465 | case FUT_OFF_INODE: | 465 | case FUT_OFF_INODE: |
| 466 | iput(key->shared.inode); | ||
| 467 | break; | 466 | break; |
| 468 | case FUT_OFF_MMSHARED: | 467 | case FUT_OFF_MMSHARED: |
| 469 | mmdrop(key->private.mm); | 468 | mmdrop(key->private.mm); |
| @@ -505,6 +504,46 @@ futex_setup_timer(ktime_t *time, struct hrtimer_sleeper *timeout, · 35 unmodified lines | |||
| 505 | return timeout; | 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 | * get_futex_key() - Get parameters which are the keys for a futex | 548 | * get_futex_key() - Get parameters which are the keys for a futex |
| 510 | * @uaddr: virtual address of the futex | 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 | * The key words are stored in @key on success. | 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), | 559 | * For shared mappings (when @fshared), the key is: |
| 521 | * offset_within_page). For private mappings, it's (uaddr, current->mm). | 560 | * ( inode->i_sequence, page->index, offset_within_page ) |
| 522 | * We can usually work out the index without swapping in the 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 | * lock_page() might sleep, the caller should not hold a spinlock. | 569 | * lock_page() might sleep, the caller should not hold a spinlock. |
| 525 | */ | 570 | */ |
| @@ -659,8 +704,6 @@ again: · 133 unmodified lines | |||
| 659 | key->private.mm = mm; | 704 | key->private.mm = mm; |
| 660 | key->private.address = address; | 705 | key->private.address = address; |
| 661 | 706 | ||
| 662 | get_futex_key_refs(key); /* implies smp_mb(); (B) */ | ||
| 663 | |||
| 664 | } else { | 707 | } else { |
| 665 | struct inode *inode; | 708 | struct inode *inode; |
| 666 | 709 | ||
| @@ -692,40 +735,14 @@ again: · 25 unmodified lines | |||
| 692 | goto again; | 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 | key->both.offset |= FUT_OFF_INODE; /* inode-based key */ | 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 | key->shared.pgoff = basepage_index(tail); | 740 | key->shared.pgoff = basepage_index(tail); |
| 726 | rcu_read_unlock(); | 741 | rcu_read_unlock(); |
| 727 | } | 742 | } |
| 728 | 743 | ||
| 744 | get_futex_key_refs(key); /* implies smp_mb(); (B) */ | ||
| 745 | |||
| 729 | out: | 746 | out: |
| 730 | put_page(page); | 747 | put_page(page); |
| 731 | return err; | 748 | return err; |
| @@ -519,7 +519,7 @@ NOKPROBE_SYMBOL(notify_die); · 518 unmodified lines | |||
| 519 | 519 | ||
| 520 | int register_die_notifier(struct notifier_block *nb) | 520 | int register_die_notifier(struct notifier_block *nb) |
| 521 | { | 521 | { |
| 522 | vmalloc_sync_all(); | 522 | vmalloc_sync_mappings(); |
| 523 | return atomic_notifier_chain_register(&die_chain, nb); | 523 | return atomic_notifier_chain_register(&die_chain, nb); |
| 524 | } | 524 | } |
| 525 | EXPORT_SYMBOL_GPL(register_die_notifier); | 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 | tmp = tmp->parent; | 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 | if (unlikely(is_child_reaper(pid))) { | 260 | if (unlikely(is_child_reaper(pid))) { |
| 251 | if (pid_ns_prepare_proc(ns)) | 261 | if (pid_ns_prepare_proc(ns)) |
| 252 | goto out_free; | 262 | goto out_free; |
| @@ -47,6 +47,7 @@ · 46 unmodified lines | |||
| 47 | #include <linux/syscalls.h> | 47 | #include <linux/syscalls.h> |
| 48 | #include <linux/kprobes.h> | 48 | #include <linux/kprobes.h> |
| 49 | #include <linux/user_namespace.h> | 49 | #include <linux/user_namespace.h> |
| 50 | #include <linux/time_namespace.h> | ||
| 50 | #include <linux/binfmts.h> | 51 | #include <linux/binfmts.h> |
| 51 | 52 | ||
| 52 | #include <linux/sched.h> | 53 | #include <linux/sched.h> |
| @@ -2546,6 +2547,7 @@ static int do_sysinfo(struct sysinfo *info) · 2493 unmodified lines | |||
| 2546 | memset(info, 0, sizeof(struct sysinfo)); | 2547 | memset(info, 0, sizeof(struct sysinfo)); |
| 2547 | 2548 | ||
| 2548 | ktime_get_boottime_ts64(&tp); | 2549 | ktime_get_boottime_ts64(&tp); |
| 2550 | timens_add_boottime(&tp); | ||
| 2549 | info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); | 2551 | info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); |
| 2550 | 2552 | ||
| 2551 | get_avenrun(info->loads, 0, SI_LOAD_SHIFT - FSHIFT); | 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 | rec = bsearch(&key, pg->records, pg->index, | 1547 | rec = bsearch(&key, pg->records, pg->index, |
| 1548 | sizeof(struct dyn_ftrace), | 1548 | sizeof(struct dyn_ftrace), |
| 1549 | ftrace_cmp_recs); | 1549 | ftrace_cmp_recs); |
| 1550 | if (rec) | ||
| 1551 | break; | ||
| 1550 | } | 1552 | } |
| 1551 | return rec; | 1553 | return rec; |
| 1552 | } | 1554 | } |
| @@ -1411,14 +1411,16 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, · 1410 unmodified lines | |||
| 1411 | return; | 1411 | return; |
| 1412 | rcu_read_lock(); | 1412 | rcu_read_lock(); |
| 1413 | retry: | 1413 | retry: |
| 1414 | if (req_cpu == WORK_CPU_UNBOUND) | ||
| 1415 | cpu = wq_select_unbound_cpu(raw_smp_processor_id()); | ||
| 1416 | |||
| 1417 | /* pwq which will be used unless @work is executing elsewhere */ | 1414 | /* pwq which will be used unless @work is executing elsewhere */ |
| 1418 | if (!(wq->flags & WQ_UNBOUND)) | 1415 | if (wq->flags & WQ_UNBOUND) { |
| 1419 | pwq = per_cpu_ptr(wq->cpu_pwqs, cpu); | 1416 | if (req_cpu == WORK_CPU_UNBOUND) |
| 1420 | else | 1417 | cpu = wq_select_unbound_cpu(raw_smp_processor_id()); |
| 1421 | pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); | 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 | * If @work was previously on a different pool, it might still be | 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 | page = pmd_page(orig_pmd); | 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 | if (next - addr != HPAGE_PMD_SIZE) { | 343 | if (next - addr != HPAGE_PMD_SIZE) { |
| 339 | int err; | 344 | int err; |
| 340 | 345 | ||
| 341 | if (page_mapcount(page) != 1) | ||
| 342 | goto huge_unlock; | ||
| 343 | |||
| 344 | get_page(page); | 346 | get_page(page); |
| 345 | spin_unlock(ptl); | 347 | spin_unlock(ptl); |
| 346 | lock_page(page); | 348 | lock_page(page); |
| @@ -426,6 +428,10 @@ regular_page: · 79 unmodified lines | |||
| 426 | continue; | 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 | VM_BUG_ON_PAGE(PageTransCompound(page), page); | 435 | VM_BUG_ON_PAGE(PageTransCompound(page), page); |
| 430 | 436 | ||
| 431 | if (pte_young(ptent)) { | 437 | if (pte_young(ptent)) { |
| @@ -2297,28 +2297,41 @@ static void high_work_func(struct work_struct *work) · 2296 unmodified lines | |||
| 2297 | #define MEMCG_DELAY_SCALING_SHIFT 14 | 2297 | #define MEMCG_DELAY_SCALING_SHIFT 14 |
| 2298 | 2298 | ||
| 2299 | /* | 2299 | /* |
| 2300 | * Scheduled by try_charge() to be executed from the userland return path | 2300 | * Get the number of jiffies that we should penalise a mischievous cgroup which |
| 2301 | * and reclaims memory over the high limit. | 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 penalty_jiffies; |
| 2306 | unsigned long pflags; | 2307 | u64 max_overage = 0; |
| 2307 | unsigned long penalty_jiffies, overage; | ||
| 2308 | unsigned int nr_pages = current->memcg_nr_pages_over_high; | ||
| 2309 | struct mem_cgroup *memcg; | ||
| 2310 | 2308 | ||
| 2311 | if (likely(!nr_pages)) | 2309 | do { |
| 2312 | return; | 2310 | unsigned long usage, high; |
| 2311 | u64 overage; | ||
| 2313 | 2312 | ||
| 2314 | memcg = get_mem_cgroup_from_mm(current->mm); | 2313 | usage = page_counter_read(&memcg->memory); |
| 2315 | reclaim_high(memcg, nr_pages, GFP_KERNEL); | 2314 | high = READ_ONCE(memcg->high); |
| 2316 | current->memcg_nr_pages_over_high = 0; | 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 | * We use overage compared to memory.high to calculate the number of | 2335 | * We use overage compared to memory.high to calculate the number of |
| 2323 | * jiffies to sleep (penalty_jiffies). Ideally this value should be | 2336 | * jiffies to sleep (penalty_jiffies). Ideally this value should be |
| 2324 | * fairly lenient on small overages, and increasingly harsh when the | 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 | * its crazy behaviour, so we exponentially increase the delay based on | 2339 | * its crazy behaviour, so we exponentially increase the delay based on |
| 2327 | * overage amount. | 2340 | * overage amount. |
| 2328 | */ | 2341 | */ |
| 2329 | 2342 | penalty_jiffies = max_overage * max_overage * HZ; | |
| 2330 | usage = page_counter_read(&memcg->memory); | 2343 | penalty_jiffies >>= MEMCG_DELAY_PRECISION_SHIFT; |
| 2331 | high = READ_ONCE(memcg->high); | 2344 | penalty_jiffies >>= MEMCG_DELAY_SCALING_SHIFT; |
| 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); | ||
| 2347 | 2345 | ||
| 2348 | /* | 2346 | /* |
| 2349 | * Factor in the task's own contribution to the overage, such that four | 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 | * application moving forwards and also permit diagnostics, albeit | 2358 | * application moving forwards and also permit diagnostics, albeit |
| 2361 | * extremely slowly. | 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 | * Don't sleep if the amount of jiffies this memcg owes us is so low | 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 | struct mem_cgroup_thresholds *thresholds; | 4050 | struct mem_cgroup_thresholds *thresholds; |
| 4028 | struct mem_cgroup_threshold_ary *new; | 4051 | struct mem_cgroup_threshold_ary *new; |
| 4029 | unsigned long usage; | 4052 | unsigned long usage; |
| 4030 | int i, j, size; | 4053 | int i, j, size, entries; |
| 4031 | 4054 | ||
| 4032 | mutex_lock(&memcg->thresholds_lock); | 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 | __mem_cgroup_threshold(memcg, type == _MEMSWAP); | 4070 | __mem_cgroup_threshold(memcg, type == _MEMSWAP); |
| 4048 | 4071 | ||
| 4049 | /* Calculate new number of threshold */ | 4072 | /* Calculate new number of threshold */ |
| 4050 | size = 0; | 4073 | size = entries = 0; |
| 4051 | for (i = 0; i < thresholds->primary->size; i++) { | 4074 | for (i = 0; i < thresholds->primary->size; i++) { |
| 4052 | if (thresholds->primary->entries[i].eventfd != eventfd) | 4075 | if (thresholds->primary->entries[i].eventfd != eventfd) |
| 4053 | size++; | 4076 | size++; |
| 4077 | else | ||
| 4078 | entries++; | ||
| 4054 | } | 4079 | } |
| 4055 | 4080 | ||
| 4056 | new = thresholds->spare; | 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 | /* Set thresholds array to NULL if we don't have thresholds */ | 4087 | /* Set thresholds array to NULL if we don't have thresholds */ |
| 4059 | if (!size) { | 4088 | if (!size) { |
| 4060 | kfree(new); | 4089 | kfree(new); |
| @@ -6682,19 +6711,9 @@ void mem_cgroup_sk_alloc(struct sock *sk) · 2621 unmodified lines | |||
| 6682 | if (!mem_cgroup_sockets_enabled) | 6711 | if (!mem_cgroup_sockets_enabled) |
| 6683 | return; | 6712 | return; |
| 6684 | 6713 | ||
| 6685 | /* | 6714 | /* Do not associate the sock with unrelated interrupted task's memcg. */ |
| 6686 | * Socket cloning can throw us here with sk_memcg already | 6715 | if (in_interrupt()) |
| 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); | ||
| 6696 | return; | 6716 | return; |
| 6697 | } | ||
| 6698 | 6717 | ||
| 6699 | rcu_read_lock(); | 6718 | rcu_read_lock(); |
| 6700 | memcg = mem_cgroup_from_task(current); | 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 | * ->release returns. | 307 | * ->release returns. |
| 308 | */ | 308 | */ |
| 309 | id = srcu_read_lock(&srcu); | 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 | * If ->release runs before mmu_notifier_unregister it must be | 313 | * If ->release runs before mmu_notifier_unregister it must be |
| 313 | * handled, as it's the only way for the driver to flush all | 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 | id = srcu_read_lock(&srcu); | 372 | id = srcu_read_lock(&srcu); |
| 372 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops->clear_flush_young) | 376 | if (subscription->ops->clear_flush_young) |
| 375 | young |= subscription->ops->clear_flush_young( | 377 | young |= subscription->ops->clear_flush_young( |
| 376 | subscription, mm, start, end); | 378 | subscription, mm, start, end); |
| @@ -389,7 +391,8 @@ int __mmu_notifier_clear_young(struct mm_struct *mm, · 12 unmodified lines | |||
| 389 | 391 | ||
| 390 | id = srcu_read_lock(&srcu); | 392 | id = srcu_read_lock(&srcu); |
| 391 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops->clear_young) | 396 | if (subscription->ops->clear_young) |
| 394 | young |= subscription->ops->clear_young(subscription, | 397 | young |= subscription->ops->clear_young(subscription, |
| 395 | mm, start, end); | 398 | mm, start, end); |
| @@ -407,7 +410,8 @@ int __mmu_notifier_test_young(struct mm_struct *mm, · 11 unmodified lines | |||
| 407 | 410 | ||
| 408 | id = srcu_read_lock(&srcu); | 411 | id = srcu_read_lock(&srcu); |
| 409 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops->test_young) { | 415 | if (subscription->ops->test_young) { |
| 412 | young = subscription->ops->test_young(subscription, mm, | 416 | young = subscription->ops->test_young(subscription, mm, |
| 413 | address); | 417 | address); |
| @@ -428,7 +432,8 @@ void __mmu_notifier_change_pte(struct mm_struct *mm, unsigned long address, · 14 unmodified lines | |||
| 428 | 432 | ||
| 429 | id = srcu_read_lock(&srcu); | 433 | id = srcu_read_lock(&srcu); |
| 430 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops->change_pte) | 437 | if (subscription->ops->change_pte) |
| 433 | subscription->ops->change_pte(subscription, mm, address, | 438 | subscription->ops->change_pte(subscription, mm, address, |
| 434 | pte); | 439 | pte); |
| @@ -476,7 +481,8 @@ static int mn_hlist_invalidate_range_start( · 41 unmodified lines | |||
| 476 | int id; | 481 | int id; |
| 477 | 482 | ||
| 478 | id = srcu_read_lock(&srcu); | 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 | const struct mmu_notifier_ops *ops = subscription->ops; | 486 | const struct mmu_notifier_ops *ops = subscription->ops; |
| 481 | 487 | ||
| 482 | if (ops->invalidate_range_start) { | 488 | if (ops->invalidate_range_start) { |
| @@ -528,7 +534,8 @@ mn_hlist_invalidate_end(struct mmu_notifier_subscriptions *subscriptions, · 45 unmodified lines | |||
| 528 | int id; | 534 | int id; |
| 529 | 535 | ||
| 530 | id = srcu_read_lock(&srcu); | 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 | * Call invalidate_range here too to avoid the need for the | 540 | * Call invalidate_range here too to avoid the need for the |
| 534 | * subsystem of having to register an invalidate_range_end | 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 | id = srcu_read_lock(&srcu); | 590 | id = srcu_read_lock(&srcu); |
| 584 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops->invalidate_range) | 594 | if (subscription->ops->invalidate_range) |
| 587 | subscription->ops->invalidate_range(subscription, mm, | 595 | subscription->ops->invalidate_range(subscription, mm, |
| 588 | start, end); | 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 | spin_lock(&mm->notifier_subscriptions->lock); | 723 | spin_lock(&mm->notifier_subscriptions->lock); |
| 716 | hlist_for_each_entry_rcu(subscription, | 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 | if (subscription->ops != ops) | 727 | if (subscription->ops != ops) |
| 719 | continue; | 728 | continue; |
| 720 | 729 | ||
| @@ -370,10 +370,14 @@ void vm_unmap_aliases(void) · 369 unmodified lines | |||
| 370 | EXPORT_SYMBOL_GPL(vm_unmap_aliases); | 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 | 373 | * Implement a stub for vmalloc_sync_[un]mapping() if the architecture |
| 374 | * have one. | 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 | if (node == NUMA_NO_NODE) | 1974 | if (node == NUMA_NO_NODE) |
| 1975 | searchnode = numa_mem_id(); | 1975 | searchnode = numa_mem_id(); |
| 1976 | else if (!node_present_pages(node)) | ||
| 1977 | searchnode = node_to_mem_node(node); | ||
| 1978 | 1976 | ||
| 1979 | object = get_partial_node(s, get_node(s, searchnode), c, flags); | 1977 | object = get_partial_node(s, get_node(s, searchnode), c, flags); |
| 1980 | if (object || node != NUMA_NO_NODE) | 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 | struct page *page; | 2561 | struct page *page; |
| 2564 | 2562 | ||
| 2565 | page = c->page; | 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 | goto new_slab; | 2572 | goto new_slab; |
| 2573 | } | ||
| 2568 | redo: | 2574 | redo: |
| 2569 | 2575 | ||
| 2570 | if (unlikely(!node_match(page, node))) { | 2576 | if (unlikely(!node_match(page, node))) { |
| 2571 | int searchnode = node; | 2577 | /* |
| 2572 | 2578 | * same as above but node_match() being false already | |
| 2573 | if (node != NUMA_NO_NODE && !node_present_pages(node)) | 2579 | * implies node != NUMA_NO_NODE |
| 2574 | searchnode = node_to_mem_node(node); | 2580 | */ |
| 2575 | 2581 | if (!node_state(node, N_NORMAL_MEMORY)) { | |
| 2576 | if (unlikely(!node_match(page, searchnode))) { | 2582 | node = NUMA_NO_NODE; |
| 2583 | goto redo; | ||
| 2584 | } else { | ||
| 2577 | stat(s, ALLOC_NODE_MISMATCH); | 2585 | stat(s, ALLOC_NODE_MISMATCH); |
| 2578 | deactivate_slab(s, page, c->freelist, c); | 2586 | deactivate_slab(s, page, c->freelist, c); |
| 2579 | goto new_slab; | 2587 | goto new_slab; |
| @@ -2997,11 +3005,13 @@ redo: · 417 unmodified lines | |||
| 2997 | barrier(); | 3005 | barrier(); |
| 2998 | 3006 | ||
| 2999 | if (likely(page == c->page)) { | 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 | if (unlikely(!this_cpu_cmpxchg_double( | 3012 | if (unlikely(!this_cpu_cmpxchg_double( |
| 3003 | s->cpu_slab->freelist, s->cpu_slab->tid, | 3013 | s->cpu_slab->freelist, s->cpu_slab->tid, |
| 3004 | c->freelist, tid, | 3014 | freelist, tid, |
| 3005 | head, next_tid(tid)))) { | 3015 | head, next_tid(tid)))) { |
| 3006 | 3016 | ||
| 3007 | note_cmpxchg_failure("slab_free", s, tid); | 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 | void *object = c->freelist; | 3184 | void *object = c->freelist; |
| 3175 | 3185 | ||
| 3176 | if (unlikely(!object)) { | 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 | * Invoking slow path likely have side-effect | 3197 | * Invoking slow path likely have side-effect |
| 3179 | * of re-populating per CPU c->freelist | 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 | struct mem_section *ms = __pfn_to_section(pfn); | 734 | struct mem_section *ms = __pfn_to_section(pfn); |
| 735 | bool section_is_early = early_section(ms); | 735 | bool section_is_early = early_section(ms); |
| 736 | struct page *memmap = NULL; | 736 | struct page *memmap = NULL; |
| 737 | bool empty; | ||
| 737 | unsigned long *subsection_map = ms->usage | 738 | unsigned long *subsection_map = ms->usage |
| 738 | ? &ms->usage->subsection_map[0] : NULL; | 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 | * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified | 765 | * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified |
| 765 | */ | 766 | */ |
| 766 | bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); | 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 | unsigned long section_nr = pfn_to_section_nr(pfn); | 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 | ms->usage = NULL; | 781 | ms->usage = NULL; |
| 780 | } | 782 | } |
| 781 | memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); | 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 | if (section_is_early && memmap) | 786 | if (section_is_early && memmap) |
| 786 | free_map_bootmem(memmap); | 787 | free_map_bootmem(memmap); |
| 787 | else | 788 | else |
| 788 | depopulate_section_memmap(pfn, nr_pages, altmap); | 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 | static struct page * __meminit section_activate(int nid, unsigned long pfn, | 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 | * First make sure the mappings are removed from all page-tables | 1295 | * First make sure the mappings are removed from all page-tables |
| 1296 | * before they are freed. | 1296 | * before they are freed. |
| 1297 | */ | 1297 | */ |
| 1298 | vmalloc_sync_all(); | 1298 | vmalloc_sync_unmappings(); |
| 1299 | 1299 | ||
| 1300 | /* | 1300 | /* |
| 1301 | * TODO: to calculate a flush range without looping. | 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 | EXPORT_SYMBOL(remap_vmalloc_range); | 3128 | EXPORT_SYMBOL(remap_vmalloc_range); |
| 3129 | 3129 | ||
| 3130 | /* | 3130 | /* |
| 3131 | * Implement a stub for vmalloc_sync_all() if the architecture chose not to | 3131 | * Implement stubs for vmalloc_sync_[un]mappings () if the architecture chose |
| 3132 | * have one. | 3132 | * not to have one. |
| 3133 | * | 3133 | * |
| 3134 | * The purpose of this function is to make sure the vmalloc area | 3134 | * The purpose of this function is to make sure the vmalloc area |
| 3135 | * mappings are identical in all page-tables in the system. | 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 | static int f(pte_t *pte, unsigned long addr, void *data) | 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 | lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex); | 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 | /* the interface gets activated here to avoid race conditions between | 796 | /* the interface gets activated here to avoid race conditions between |
| 793 | * the moment of activating the interface in | 797 | * the moment of activating the interface in |
| 794 | * hardif_activate_interface() where the originator mac is set and | 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 | caif_device_list(dev_net(dev)); | 112 | caif_device_list(dev_net(dev)); |
| 113 | struct caif_device_entry *caifd; | 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 | if (caifd->netdev == dev) | 117 | if (caifd->netdev == dev) |
| 117 | return caifd; | 118 | return caifd; |
| 118 | } | 119 | } |
| @@ -3352,34 +3352,41 @@ devlink_param_value_get_from_info(const struct devlink_param *param, · 3351 unmodified lines | |||
| 3352 | struct genl_info *info, | 3352 | struct genl_info *info, |
| 3353 | union devlink_param_value *value) | 3353 | union devlink_param_value *value) |
| 3354 | { | 3354 | { |
| 3355 | struct nlattr *param_data; | ||
| 3355 | int len; | 3356 | int len; |
| 3356 | 3357 | ||
| 3357 | if (param->type != DEVLINK_PARAM_TYPE_BOOL && | 3358 | param_data = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]; |
| 3358 | !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) | 3359 | |
| 3360 | if (param->type != DEVLINK_PARAM_TYPE_BOOL && !param_data) | ||
| 3359 | return -EINVAL; | 3361 | return -EINVAL; |
| 3360 | 3362 | ||
| 3361 | switch (param->type) { | 3363 | switch (param->type) { |
| 3362 | case DEVLINK_PARAM_TYPE_U8: | 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 | break; | 3368 | break; |
| 3365 | case DEVLINK_PARAM_TYPE_U16: | 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 | break; | 3373 | break; |
| 3368 | case DEVLINK_PARAM_TYPE_U32: | 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 | break; | 3378 | break; |
| 3371 | case DEVLINK_PARAM_TYPE_STRING: | 3379 | case DEVLINK_PARAM_TYPE_STRING: |
| 3372 | len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]), | 3380 | len = strnlen(nla_data(param_data), nla_len(param_data)); |
| 3373 | nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); | 3381 | if (len == nla_len(param_data) || |
| 3374 | if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) || | ||
| 3375 | len >= __DEVLINK_PARAM_MAX_STRING_VALUE) | 3382 | len >= __DEVLINK_PARAM_MAX_STRING_VALUE) |
| 3376 | return -EINVAL; | 3383 | return -EINVAL; |
| 3377 | strcpy(value->vstr, | 3384 | strcpy(value->vstr, nla_data(param_data)); |
| 3378 | nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); | ||
| 3379 | break; | 3385 | break; |
| 3380 | case DEVLINK_PARAM_TYPE_BOOL: | 3386 | case DEVLINK_PARAM_TYPE_BOOL: |
| 3381 | value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? | 3387 | if (param_data && nla_len(param_data)) |
| 3382 | true : false; | 3388 | return -EINVAL; |
| 3389 | value->vbool = nla_get_flag(param_data); | ||
| 3383 | break; | 3390 | break; |
| 3384 | } | 3391 | } |
| 3385 | return 0; | 3392 | return 0; |
| @@ -5951,6 +5958,8 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { · 2565 unmodified lines | |||
| 5951 | [DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .type = NLA_U8 }, | 5958 | [DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .type = NLA_U8 }, |
| 5952 | [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING }, | 5959 | [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING }, |
| 5953 | [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32 }, | 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 | [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING }, | 5963 | [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING }, |
| 5955 | [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64 }, | 5964 | [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64 }, |
| 5956 | [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .type = NLA_U8 }, | 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 | kfree(css_cls_state(css)); | 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 | static int update_classid_sock(const void *v, struct file *file, unsigned n) | 69 | static int update_classid_sock(const void *v, struct file *file, unsigned n) |
| 57 | { | 70 | { |
| 58 | int err; | 71 | int err; |
| 72 | struct update_classid_context *ctx = (void *)v; | ||
| 59 | struct socket *sock = sock_from_file(file, &err); | 73 | struct socket *sock = sock_from_file(file, &err); |
| 60 | 74 | ||
| 61 | if (sock) { | 75 | if (sock) { |
| 62 | spin_lock(&cgroup_sk_update_lock); | 76 | spin_lock(&cgroup_sk_update_lock); |
| 63 | sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, | 77 | sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, ctx->classid); |
| 64 | (unsigned long)v); | ||
| 65 | spin_unlock(&cgroup_sk_update_lock); | 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 | return 0; | 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 | static void cgrp_attach(struct cgroup_taskset *tset) | 103 | static void cgrp_attach(struct cgroup_taskset *tset) |
| 71 | { | 104 | { |
| 72 | struct cgroup_subsys_state *css; | 105 | struct cgroup_subsys_state *css; |
| 73 | struct task_struct *p; | 106 | struct task_struct *p; |
| 74 | 107 | ||
| 75 | cgroup_taskset_for_each(p, css, tset) { | 108 | cgroup_taskset_for_each(p, css, tset) { |
| 76 | task_lock(p); | 109 | update_classid_task(p, css_cls_state(css)->classid); |
| 77 | iterate_fd(p->files, 0, update_classid_sock, | ||
| 78 | (void *)(unsigned long)css_cls_state(css)->classid); | ||
| 79 | task_unlock(p); | ||
| 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 | css_task_iter_start(css, 0, &it); | 129 | css_task_iter_start(css, 0, &it); |
| 100 | while ((p = css_task_iter_next(&it))) { | 130 | while ((p = css_task_iter_next(&it))) { |
| 101 | task_lock(p); | 131 | update_classid_task(p, cs->classid); |
| 102 | iterate_fd(p->files, 0, update_classid_sock, | ||
| 103 | (void *)(unsigned long)cs->classid); | ||
| 104 | task_unlock(p); | ||
| 105 | cond_resched(); | 132 | cond_resched(); |
| 106 | } | 133 | } |
| 107 | css_task_iter_end(&it); | 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 | atomic_set(&newsk->sk_zckey, 0); | 1830 | atomic_set(&newsk->sk_zckey, 0); |
| 1831 | 1831 | ||
| 1832 | sock_reset_flag(newsk, SOCK_DONE); | 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 | cgroup_sk_alloc(&newsk->sk_cgrp_data); | 1837 | cgroup_sk_alloc(&newsk->sk_cgrp_data); |
| 1835 | 1838 | ||
| 1836 | rcu_read_lock(); | 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 | /* port.c */ | 117 | /* port.c */ |
| 118 | int dsa_port_set_state(struct dsa_port *dp, u8 state, | 118 | int dsa_port_set_state(struct dsa_port *dp, u8 state, |
| 119 | struct switchdev_trans *trans); | 119 | struct switchdev_trans *trans); |
| 120 | int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy); | ||
| 120 | int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); | 121 | int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); |
| 122 | void dsa_port_disable_rt(struct dsa_port *dp); | ||
| 121 | void dsa_port_disable(struct dsa_port *dp); | 123 | void dsa_port_disable(struct dsa_port *dp); |
| 122 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br); | 124 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br); |
| 123 | void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br); | 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 | pr_err("DSA: failed to set STP state %u (%d)\n", state, err); | 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 | struct dsa_switch *ds = dp->ds; | 68 | struct dsa_switch *ds = dp->ds; |
| 69 | int port = dp->index; | 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 | if (!dp->bridge_dev) | 78 | if (!dp->bridge_dev) |
| 79 | dsa_port_set_state_now(dp, BR_STATE_FORWARDING); | 79 | dsa_port_set_state_now(dp, BR_STATE_FORWARDING); |
| 80 | 80 | ||
| 81 | if (dp->pl) | ||
| 82 | phylink_start(dp->pl); | ||
| 83 | |||
| 81 | return 0; | 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 | struct dsa_switch *ds = dp->ds; | 100 | struct dsa_switch *ds = dp->ds; |
| 87 | int port = dp->index; | 101 | int port = dp->index; |
| 88 | 102 | ||
| 103 | if (dp->pl) | ||
| 104 | phylink_stop(dp->pl); | ||
| 105 | |||
| 89 | if (!dp->bridge_dev) | 106 | if (!dp->bridge_dev) |
| 90 | dsa_port_set_state_now(dp, BR_STATE_DISABLED); | 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 | ds->ops->port_disable(ds, port); | 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 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br) | 120 | int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br) |
| 97 | { | 121 | { |
| 98 | struct dsa_notifier_bridge_info info = { | 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 | goto err_phy_connect; | 638 | goto err_phy_connect; |
| 615 | } | 639 | } |
| 616 | 640 | ||
| 617 | rtnl_lock(); | ||
| 618 | phylink_start(dp->pl); | ||
| 619 | rtnl_unlock(); | ||
| 620 | |||
| 621 | return 0; | 641 | return 0; |
| 622 | 642 | ||
| 623 | err_phy_connect: | 643 | err_phy_connect: |
| @@ -628,9 +648,14 @@ err_phy_connect: · 4 unmodified lines | |||
| 628 | int dsa_port_link_register_of(struct dsa_port *dp) | 648 | int dsa_port_link_register_of(struct dsa_port *dp) |
| 629 | { | 649 | { |
| 630 | struct dsa_switch *ds = dp->ds; | 650 | struct dsa_switch *ds = dp->ds; |
| 651 | struct device_node *phy_np; | ||
| 631 | 652 | ||
| 632 | if (!ds->ops->adjust_link) | 653 | if (!ds->ops->adjust_link) { |
| 633 | return dsa_port_phylink_register(dp); | 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 | dev_warn(ds->dev, | 660 | dev_warn(ds->dev, |
| 636 | "Using legacy PHYLIB callbacks. Please migrate to PHYLINK!\n"); | 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 | struct dsa_switch *ds = dp->ds; | 671 | struct dsa_switch *ds = dp->ds; |
| 647 | 672 | ||
| 648 | if (!ds->ops->adjust_link) { | 673 | if (!ds->ops->adjust_link && dp->pl) { |
| 649 | rtnl_lock(); | 674 | rtnl_lock(); |
| 650 | phylink_disconnect_phy(dp->pl); | 675 | phylink_disconnect_phy(dp->pl); |
| 651 | rtnl_unlock(); | 676 | rtnl_unlock(); |
| 652 | phylink_destroy(dp->pl); | 677 | phylink_destroy(dp->pl); |
| 678 | dp->pl = NULL; | ||
| 653 | return; | 679 | return; |
| 654 | } | 680 | } |
| 655 | 681 | ||
| @@ -88,12 +88,10 @@ static int dsa_slave_open(struct net_device *dev) · 87 unmodified lines | |||
| 88 | goto clear_allmulti; | 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 | if (err) | 92 | if (err) |
| 93 | goto clear_promisc; | 93 | goto clear_promisc; |
| 94 | 94 | ||
| 95 | phylink_start(dp->pl); | ||
| 96 | |||
| 97 | return 0; | 95 | return 0; |
| 98 | 96 | ||
| 99 | clear_promisc: | 97 | clear_promisc: |
| @@ -114,9 +112,7 @@ static int dsa_slave_close(struct net_device *dev) · 14 unmodified lines | |||
| 114 | struct net_device *master = dsa_slave_to_master(dev); | 112 | struct net_device *master = dsa_slave_to_master(dev); |
| 115 | struct dsa_port *dp = dsa_slave_to_port(dev); | 113 | struct dsa_port *dp = dsa_slave_to_port(dev); |
| 116 | 114 | ||
| 117 | phylink_stop(dp->pl); | 115 | dsa_port_disable_rt(dp); |
| 118 | |||
| 119 | dsa_port_disable(dp); | ||
| 120 | 116 | ||
| 121 | dev_mc_unsync(master, dev); | 117 | dev_mc_unsync(master, dev); |
| 122 | dev_uc_unsync(master, dev); | 118 | dev_uc_unsync(master, dev); |
| @@ -21,7 +21,13 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { · 20 unmodified lines | |||
| 21 | [IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, }, | 21 | [IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, }, |
| 22 | [IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, }, | 22 | [IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, }, |
| 23 | [IEEE802154_ATTR_CHANNEL] = { .type = NLA_U8, }, | 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 | [IEEE802154_ATTR_PAGE] = { .type = NLA_U8, }, | 29 | [IEEE802154_ATTR_PAGE] = { .type = NLA_U8, }, |
| 30 | [IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, }, | ||
| 25 | [IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, }, | 31 | [IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, }, |
| 26 | [IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, }, | 32 | [IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, }, |
| 27 | [IEEE802154_ATTR_COORD_PAN_ID] = { .type = NLA_U16, }, | 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 | EXPORT_SYMBOL_GPL(gre_del_protocol); | 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 | int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, | 62 | int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, |
| 61 | bool *csum_err, __be16 proto, int nhs) | 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 | * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header | 112 | * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header |
| 111 | */ | 113 | */ |
| 112 | if (greh->flags == 0 && tpi->proto == htons(ETH_P_WCCP)) { | 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 | tpi->proto = proto; | 121 | tpi->proto = proto; |
| 114 | if ((*(u8 *)options & 0xF0) != 0x40) | 122 | if ((*val & 0xF0) != 0x40) |
| 115 | hdr_len += 4; | 123 | hdr_len += 4; |
| 116 | } | 124 | } |
| 117 | tpi->hdr_len = hdr_len; | 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 | spin_unlock_bh(&queue->fastopenq.lock); | 483 | spin_unlock_bh(&queue->fastopenq.lock); |
| 484 | } | 484 | } |
| 485 | |||
| 485 | out: | 486 | out: |
| 486 | release_sock(sk); | 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 | if (req) | 507 | if (req) |
| 488 | reqsk_put(req); | 508 | reqsk_put(req); |
| 489 | return newsk; | 509 | return newsk; |
| @@ -100,13 +100,9 @@ static size_t inet_sk_attr_size(struct sock *sk, · 99 unmodified lines | |||
| 100 | aux = handler->idiag_get_aux_size(sk, net_admin); | 100 | aux = handler->idiag_get_aux_size(sk, net_admin); |
| 101 | 101 | ||
| 102 | return nla_total_size(sizeof(struct tcp_info)) | 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 | + nla_total_size(sizeof(struct inet_diag_msg)) | 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 | + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) | 106 | + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) |
| 111 | + nla_total_size(TCP_CA_NAME_MAX) | 107 | + nla_total_size(TCP_CA_NAME_MAX) |
| 112 | + nla_total_size(sizeof(struct tcpvegas_info)) | 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 | if (net_admin && nla_put_u32(skb, INET_DIAG_MARK, sk->sk_mark)) | 143 | if (net_admin && nla_put_u32(skb, INET_DIAG_MARK, sk->sk_mark)) |
| 148 | goto errout; | 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 | r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk)); | 164 | r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk)); |
| 151 | r->idiag_inode = sock_i_ino(sk); | 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 | goto errout; | 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 | out: | 301 | out: |
| 306 | nlmsg_end(skb, nlh); | 302 | nlmsg_end(skb, nlh); |
| 307 | return 0; | 303 | return 0; |
| @@ -100,8 +100,9 @@ static int raw_diag_dump_one(struct sk_buff *in_skb, · 99 unmodified lines | |||
| 100 | if (IS_ERR(sk)) | 100 | if (IS_ERR(sk)) |
| 101 | return PTR_ERR(sk); | 101 | return PTR_ERR(sk); |
| 102 | 102 | ||
| 103 | rep = nlmsg_new(sizeof(struct inet_diag_msg) + | 103 | rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + |
| 104 | sizeof(struct inet_diag_meminfo) + 64, | 104 | inet_diag_msg_attrs_size() + |
| 105 | nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, | ||
| 105 | GFP_KERNEL); | 106 | GFP_KERNEL); |
| 106 | if (!rep) { | 107 | if (!rep) { |
| 107 | sock_put(sk); | 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 | goto out; | 64 | goto out; |
| 65 | 65 | ||
| 66 | err = -ENOMEM; | 66 | err = -ENOMEM; |
| 67 | rep = nlmsg_new(sizeof(struct inet_diag_msg) + | 67 | rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + |
| 68 | sizeof(struct inet_diag_meminfo) + 64, | 68 | inet_diag_msg_attrs_size() + |
| 69 | nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, | ||
| 69 | GFP_KERNEL); | 70 | GFP_KERNEL); |
| 70 | if (!rep) | 71 | if (!rep) |
| 71 | goto out; | 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 | static void | 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 | struct fib6_info *f6i; | 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 | ifp->idev->dev, 0, RTF_DEFAULT, true); | 1236 | ifp->idev->dev, 0, RTF_DEFAULT, true); |
| 1235 | if (f6i) { | 1237 | if (f6i) { |
| 1236 | if (del_rt) | 1238 | if (del_rt) |
| @@ -1293,7 +1295,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) · 56 unmodified lines | |||
| 1293 | 1295 | ||
| 1294 | if (action != CLEANUP_PREFIX_RT_NOP) { | 1296 | if (action != CLEANUP_PREFIX_RT_NOP) { |
| 1295 | cleanup_prefix_route(ifp, expires, | 1297 | cleanup_prefix_route(ifp, expires, |
| 1296 | action == CLEANUP_PREFIX_RT_DEL); | 1298 | action == CLEANUP_PREFIX_RT_DEL, false); |
| 1297 | } | 1299 | } |
| 1298 | 1300 | ||
| 1299 | /* clean up prefsrc entries */ | 1301 | /* clean up prefsrc entries */ |
| @@ -3345,6 +3347,10 @@ static void addrconf_dev_config(struct net_device *dev) · 2045 unmodified lines | |||
| 3345 | (dev->type != ARPHRD_NONE) && | 3347 | (dev->type != ARPHRD_NONE) && |
| 3346 | (dev->type != ARPHRD_RAWIP)) { | 3348 | (dev->type != ARPHRD_RAWIP)) { |
| 3347 | /* Alas, we support only Ethernet autoconfiguration. */ | 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 | return; | 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 | static int modify_prefix_route(struct inet6_ifaddr *ifp, | 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 | struct fib6_info *f6i; | 4598 | struct fib6_info *f6i; |
| 4592 | u32 prio; | 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 | ifp->idev->dev, 0, RTF_DEFAULT, true); | 4603 | ifp->idev->dev, 0, RTF_DEFAULT, true); |
| 4596 | if (!f6i) | 4604 | if (!f6i) |
| 4597 | return -ENOENT; | 4605 | return -ENOENT; |
| @@ -4602,7 +4610,8 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, · 4 unmodified lines | |||
| 4602 | ip6_del_rt(dev_net(ifp->idev->dev), f6i); | 4610 | ip6_del_rt(dev_net(ifp->idev->dev), f6i); |
| 4603 | 4611 | ||
| 4604 | /* add new one */ | 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 | ifp->rt_priority, ifp->idev->dev, | 4615 | ifp->rt_priority, ifp->idev->dev, |
| 4607 | expires, flags, GFP_KERNEL); | 4616 | expires, flags, GFP_KERNEL); |
| 4608 | } else { | 4617 | } else { |
| @@ -4624,6 +4633,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) · 15 unmodified lines | |||
| 4624 | unsigned long timeout; | 4633 | unsigned long timeout; |
| 4625 | bool was_managetempaddr; | 4634 | bool was_managetempaddr; |
| 4626 | bool had_prefixroute; | 4635 | bool had_prefixroute; |
| 4636 | bool new_peer = false; | ||
| 4627 | 4637 | ||
| 4628 | ASSERT_RTNL(); | 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 | cfg->preferred_lft = timeout; | 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 | spin_lock_bh(&ifp->lock); | 4675 | spin_lock_bh(&ifp->lock); |
| 4659 | was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; | 4676 | was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; |
| 4660 | had_prefixroute = ifp->flags & IFA_F_PERMANENT && | 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 | if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) | 4687 | if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) |
| 4671 | ifp->rt_priority = cfg->rt_priority; | 4688 | ifp->rt_priority = cfg->rt_priority; |
| 4672 | 4689 | ||
| 4690 | if (new_peer) | ||
| 4691 | ifp->peer_addr = *cfg->peer_pfx; | ||
| 4692 | |||
| 4673 | spin_unlock_bh(&ifp->lock); | 4693 | spin_unlock_bh(&ifp->lock); |
| 4674 | if (!(ifp->flags&IFA_F_TENTATIVE)) | 4694 | if (!(ifp->flags&IFA_F_TENTATIVE)) |
| 4675 | ipv6_ifa_notify(0, ifp); | 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 | int rc = -ENOENT; | 4698 | int rc = -ENOENT; |
| 4679 | 4699 | ||
| 4680 | if (had_prefixroute) | 4700 | if (had_prefixroute) |
| 4681 | rc = modify_prefix_route(ifp, expires, flags); | 4701 | rc = modify_prefix_route(ifp, expires, flags, false); |
| 4682 | 4702 | ||
| 4683 | /* prefix route could have been deleted; if so restore it */ | 4703 | /* prefix route could have been deleted; if so restore it */ |
| 4684 | if (rc == -ENOENT) { | 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 | ifp->rt_priority, ifp->idev->dev, | 4706 | ifp->rt_priority, ifp->idev->dev, |
| 4687 | expires, flags, GFP_KERNEL); | 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 | } else if (had_prefixroute) { | 4718 | } else if (had_prefixroute) { |
| 4690 | enum cleanup_prefix_rt_t action; | 4719 | enum cleanup_prefix_rt_t action; |
| 4691 | unsigned long rt_expires; | 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 | if (action != CLEANUP_PREFIX_RT_NOP) { | 4726 | if (action != CLEANUP_PREFIX_RT_NOP) { |
| 4698 | cleanup_prefix_route(ifp, rt_expires, | 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 | if (ifp->idev->cnf.forwarding) | 6012 | if (ifp->idev->cnf.forwarding) |
| 5984 | addrconf_join_anycast(ifp); | 6013 | addrconf_join_anycast(ifp); |
| 5985 | if (!ipv6_addr_any(&ifp->peer_addr)) | 6014 | if (!ipv6_addr_any(&ifp->peer_addr)) |
| 5986 | addrconf_prefix_route(&ifp->peer_addr, 128, 0, | 6015 | addrconf_prefix_route(&ifp->peer_addr, 128, |
| 5987 | ifp->idev->dev, 0, 0, | 6016 | ifp->rt_priority, ifp->idev->dev, |
| 5988 | GFP_ATOMIC); | 6017 | 0, 0, GFP_ATOMIC); |
| 5989 | break; | 6018 | break; |
| 5990 | case RTM_DELADDR: | 6019 | case RTM_DELADDR: |
| 5991 | if (ifp->idev->cnf.forwarding) | 6020 | if (ifp->idev->cnf.forwarding) |
| @@ -268,7 +268,7 @@ static int seg6_do_srh(struct sk_buff *skb) · 267 unmodified lines | |||
| 268 | skb_mac_header_rebuild(skb); | 268 | skb_mac_header_rebuild(skb); |
| 269 | skb_push(skb, skb->mac_len); | 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 | if (err) | 272 | if (err) |
| 273 | return err; | 273 | return err; |
| 274 | 274 | ||
| @@ -282,7 +282,7 @@ static int input_action_end_dx2(struct sk_buff *skb, · 281 unmodified lines | |||
| 282 | struct net_device *odev; | 282 | struct net_device *odev; |
| 283 | struct ethhdr *eth; | 283 | struct ethhdr *eth; |
| 284 | 284 | ||
| 285 | if (!decap_and_validate(skb, NEXTHDR_NONE)) | 285 | if (!decap_and_validate(skb, IPPROTO_ETHERNET)) |
| 286 | goto drop; | 286 | goto drop; |
| 287 | 287 | ||
| 288 | if (!pskb_may_pull(skb, ETH_HLEN)) | 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 | mesh_queue_preq(mpath, PREQ_Q_F_START); | 1157 | mesh_queue_preq(mpath, PREQ_Q_F_START); |
| 1157 | 1158 | ||
| 1158 | if (skb_queue_len(&mpath->frame_queue) >= MESH_FRAME_QUEUE_LEN) | 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 | struct mptcp_sock *msk; | 334 | struct mptcp_sock *msk; |
| 335 | unsigned int ack_size; | 335 | unsigned int ack_size; |
| 336 | bool ret = false; | 336 | bool ret = false; |
| 337 | bool can_ack; | ||
| 338 | u64 ack_seq; | ||
| 337 | u8 tcp_fin; | 339 | u8 tcp_fin; |
| 338 | 340 | ||
| 339 | if (skb) { | 341 | if (skb) { |
| @@ -360,9 +362,22 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, · 20 unmodified lines | |||
| 360 | ret = true; | 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 | opts->ext_copy.use_ack = 0; | 369 | opts->ext_copy.use_ack = 0; |
| 364 | msk = mptcp_sk(subflow->conn); | 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 | *size = ALIGN(dss_size, 4); | 381 | *size = ALIGN(dss_size, 4); |
| 367 | return ret; | 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 | dss_size += ack_size; | 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 | opts->ext_copy.ack64 = 1; | 394 | opts->ext_copy.ack64 = 1; |
| 380 | opts->ext_copy.use_ack = 1; | 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 | *pos = cpu + 1; | 411 | *pos = cpu + 1; |
| 412 | return per_cpu_ptr(net->ct.stat, cpu); | 412 | return per_cpu_ptr(net->ct.stat, cpu); |
| 413 | } | 413 | } |
| 414 | 414 | (*pos)++; | |
| 415 | return NULL; | 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 | *pos = cpu + 1; | 267 | *pos = cpu + 1; |
| 268 | return per_cpu_ptr(snet->stats, cpu); | 268 | return per_cpu_ptr(snet->stats, cpu); |
| 269 | } | 269 | } |
| 270 | 270 | (*pos)++; | |
| 271 | return NULL; | 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 | lockdep_commit_lock_is_held(net)); | 1405 | lockdep_commit_lock_is_held(net)); |
| 1406 | if (nft_dump_stats(skb, stats)) | 1406 | if (nft_dump_stats(skb, stats)) |
| 1407 | goto nla_put_failure; | 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 | if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use))) | 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 | goto err4; | 6305 | goto err4; |
| 6301 | 6306 | ||
| 6302 | err = nft_register_flowtable_net_hooks(ctx.net, table, flowtable); | 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 | goto err4; | 6313 | goto err4; |
| 6314 | } | ||
| 6305 | 6315 | ||
| 6306 | err = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable); | 6316 | err = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable); |
| 6307 | if (err < 0) | 6317 | if (err < 0) |
| @@ -7378,13 +7388,8 @@ static void nf_tables_module_autoload(struct net *net) · 1070 unmodified lines | |||
| 7378 | list_splice_init(&net->nft.module_list, &module_list); | 7388 | list_splice_init(&net->nft.module_list, &module_list); |
| 7379 | mutex_unlock(&net->nft.commit_mutex); | 7389 | mutex_unlock(&net->nft.commit_mutex); |
| 7380 | list_for_each_entry_safe(req, next, &module_list, list) { | 7390 | list_for_each_entry_safe(req, next, &module_list, list) { |
| 7381 | if (req->done) { | 7391 | request_module("%s", req->module); |
| 7382 | list_del(&req->list); | 7392 | req->done = true; |
| 7383 | kfree(req); | ||
| 7384 | } else { | ||
| 7385 | request_module("%s", req->module); | ||
| 7386 | req->done = true; | ||
| 7387 | } | ||
| 7388 | } | 7393 | } |
| 7389 | mutex_lock(&net->nft.commit_mutex); | 7394 | mutex_lock(&net->nft.commit_mutex); |
| 7390 | list_splice(&module_list, &net->nft.module_list); | 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 | __nft_release_tables(net); | 8172 | __nft_release_tables(net); |
| 8168 | mutex_unlock(&net->nft.commit_mutex); | 8173 | mutex_unlock(&net->nft.commit_mutex); |
| 8169 | WARN_ON_ONCE(!list_empty(&net->nft.tables)); | 8174 | WARN_ON_ONCE(!list_empty(&net->nft.tables)); |
| 8175 | WARN_ON_ONCE(!list_empty(&net->nft.module_list)); | ||
| 8170 | } | 8176 | } |
| 8171 | 8177 | ||
| 8172 | static struct pernet_operations nf_tables_net_ops = { | 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 | [NFCTH_NAME] = { .type = NLA_NUL_STRING, | 742 | [NFCTH_NAME] = { .type = NLA_NUL_STRING, |
| 743 | .len = NF_CT_HELPER_NAME_LEN-1 }, | 743 | .len = NF_CT_HELPER_NAME_LEN-1 }, |
| 744 | [NFCTH_QUEUE_NUM] = { .type = NLA_U32, }, | 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 | static const struct nfnl_callback nfnl_cthelper_cb[NFNL_MSG_CTHELPER_MAX] = { | 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 | .name = "nat", | 89 | .name = "nat", |
| 90 | .type = NFT_CHAIN_T_NAT, | 90 | .type = NFT_CHAIN_T_NAT, |
| 91 | .family = NFPROTO_INET, | 91 | .family = NFPROTO_INET, |
| 92 | .owner = THIS_MODULE, | ||
| 92 | .hook_mask = (1 << NF_INET_PRE_ROUTING) | | 93 | .hook_mask = (1 << NF_INET_PRE_ROUTING) | |
| 93 | (1 << NF_INET_LOCAL_IN) | | 94 | (1 << NF_INET_LOCAL_IN) | |
| 94 | (1 << NF_INET_LOCAL_OUT) | | 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 | [NFTA_PAYLOAD_LEN] = { .type = NLA_U32 }, | 129 | [NFTA_PAYLOAD_LEN] = { .type = NLA_U32 }, |
| 130 | [NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 }, | 130 | [NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 }, |
| 131 | [NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 }, | 131 | [NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 }, |
| 132 | [NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 }, | ||
| 132 | }; | 133 | }; |
| 133 | 134 | ||
| 134 | static int nft_payload_init(const struct nft_ctx *ctx, | 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 | [NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, }, | 339 | [NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, }, |
| 340 | [NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, }, | 340 | [NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, }, |
| 341 | [NFTA_TUNNEL_KEY_TTL] = { .type = NLA_U8, }, | 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 | [NFTA_TUNNEL_KEY_OPTS] = { .type = NLA_NESTED, }, | 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 | uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file)); | 1551 | uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file)); |
| 1552 | struct nf_mttg_trav *trav = seq->private; | 1552 | struct nf_mttg_trav *trav = seq->private; |
| 1553 | 1553 | ||
| 1554 | if (ppos != NULL) | ||
| 1555 | ++(*ppos); | ||
| 1556 | |||
| 1554 | switch (trav->class) { | 1557 | switch (trav->class) { |
| 1555 | case MTTG_TRAV_INIT: | 1558 | case MTTG_TRAV_INIT: |
| 1556 | trav->class = MTTG_TRAV_NFP_UNSPEC; | 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 | default: | 1579 | default: |
| 1577 | return NULL; | 1580 | return NULL; |
| 1578 | } | 1581 | } |
| 1579 | |||
| 1580 | if (ppos != NULL) | ||
| 1581 | ++*ppos; | ||
| 1582 | return trav; | 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 | const struct recent_entry *e = v; | 492 | const struct recent_entry *e = v; |
| 493 | const struct list_head *head = e->list.next; | 493 | const struct list_head *head = e->list.next; |
| 494 | 494 | ||
| 495 | (*pos)++; | ||
| 495 | while (head == &t->iphash[st->bucket]) { | 496 | while (head == &t->iphash[st->bucket]) { |
| 496 | if (++st->bucket >= ip_list_hash_size) | 497 | if (++st->bucket >= ip_list_hash_size) |
| 497 | return NULL; | 498 | return NULL; |
| 498 | head = t->iphash[st->bucket].next; | 499 | head = t->iphash[st->bucket].next; |
| 499 | } | 500 | } |
| 500 | (*pos)++; | ||
| 501 | return list_entry(head, struct recent_entry, list); | 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 | in_skb->len)) | 2434 | in_skb->len)) |
| 2435 | WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS, | 2435 | WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS, |
| 2436 | (u8 *)extack->bad_attr - | 2436 | (u8 *)extack->bad_attr - |
| 2437 | in_skb->data)); | 2437 | (u8 *)nlh)); |
| 2438 | } else { | 2438 | } else { |
| 2439 | if (extack->cookie_len) | 2439 | if (extack->cookie_len) |
| 2440 | WARN_ON(nla_put(skb, NLMSGERR_ATTR_COOKIE, | 2440 | WARN_ON(nla_put(skb, NLMSGERR_ATTR_COOKIE, |
| @@ -181,13 +181,20 @@ exit: · 180 unmodified lines | |||
| 181 | void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, | 181 | void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, |
| 182 | struct sk_buff *skb) | 182 | struct sk_buff *skb) |
| 183 | { | 183 | { |
| 184 | u8 gate = hdev->pipes[pipe].gate; | ||
| 185 | u8 status = NFC_HCI_ANY_OK; | 184 | u8 status = NFC_HCI_ANY_OK; |
| 186 | struct hci_create_pipe_resp *create_info; | 185 | struct hci_create_pipe_resp *create_info; |
| 187 | struct hci_delete_pipe_noti *delete_info; | 186 | struct hci_delete_pipe_noti *delete_info; |
| 188 | struct hci_all_pipe_cleared_noti *cleared_info; | 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 | switch (cmd) { | 199 | switch (cmd) { |
| 193 | case NFC_HCI_ADM_NOTIFY_PIPE_CREATED: | 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 | struct sk_buff *skb) | 382 | struct sk_buff *skb) |
| 376 | { | 383 | { |
| 377 | int r = 0; | 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 | if (gate == NFC_HCI_INVALID_GATE) { | 393 | if (gate == NFC_HCI_INVALID_GATE) { |
| 381 | pr_err("Discarded event %x to unopened pipe %x\n", event, pipe); | 394 | pr_err("Discarded event %x to unopened pipe %x\n", event, pipe); |
| 382 | goto exit; | 395 | goto exit; |
| @@ -32,6 +32,7 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = { · 31 unmodified lines | |||
| 32 | [NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING, | 32 | [NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING, |
| 33 | .len = NFC_DEVICE_NAME_MAXSIZE }, | 33 | .len = NFC_DEVICE_NAME_MAXSIZE }, |
| 34 | [NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 }, | 34 | [NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 }, |
| 35 | [NFC_ATTR_TARGET_INDEX] = { .type = NLA_U32 }, | ||
| 35 | [NFC_ATTR_COMM_MODE] = { .type = NLA_U8 }, | 36 | [NFC_ATTR_COMM_MODE] = { .type = NLA_U8 }, |
| 36 | [NFC_ATTR_RF_MODE] = { .type = NLA_U8 }, | 37 | [NFC_ATTR_RF_MODE] = { .type = NLA_U8 }, |
| 37 | [NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 }, | 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 | [NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED }, | 44 | [NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED }, |
| 44 | [NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING, | 45 | [NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING, |
| 45 | .len = NFC_FIRMWARE_NAME_MAXSIZE }, | 46 | .len = NFC_FIRMWARE_NAME_MAXSIZE }, |
| 47 | [NFC_ATTR_SE_INDEX] = { .type = NLA_U32 }, | ||
| 46 | [NFC_ATTR_SE_APDU] = { .type = NLA_BINARY }, | 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 | [NFC_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, | 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 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, | 645 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, |
| 646 | [OVS_PACKET_ATTR_PROBE] = { .type = NLA_FLAG }, | 646 | [OVS_PACKET_ATTR_PROBE] = { .type = NLA_FLAG }, |
| 647 | [OVS_PACKET_ATTR_MRU] = { .type = NLA_U16 }, | 647 | [OVS_PACKET_ATTR_MRU] = { .type = NLA_U16 }, |
| 648 | [OVS_PACKET_ATTR_HASH] = { .type = NLA_U64 }, | ||
| 648 | }; | 649 | }; |
| 649 | 650 | ||
| 650 | static const struct genl_ops dp_packet_genl_ops[] = { | 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 | TP_STATUS_KERNEL, (macoff+snaplen)); | 2274 | TP_STATUS_KERNEL, (macoff+snaplen)); |
| 2275 | if (!h.raw) | 2275 | if (!h.raw) |
| 2276 | goto drop_n_account; | 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 | if (po->tp_version <= TPACKET_V2) { | 2284 | if (po->tp_version <= TPACKET_V2) { |
| 2278 | packet_increment_rx_head(po, &po->rx_ring); | 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 | status |= TP_STATUS_LOSING; | 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 | po->stats.stats1.tp_packets++; | 2296 | po->stats.stats1.tp_packets++; |
| 2296 | if (copy_skb) { | 2297 | if (copy_skb) { |
| 2297 | status |= TP_STATUS_COPY; | 2298 | status |= TP_STATUS_COPY; |
| @@ -744,6 +744,7 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = { · 743 unmodified lines | |||
| 744 | [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, | 744 | [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, |
| 745 | [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, | 745 | [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, |
| 746 | [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, | 746 | [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, |
| 747 | [TCA_FQ_ORPHAN_MASK] = { .type = NLA_U32 }, | ||
| 747 | [TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, | 748 | [TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, |
| 748 | [TCA_FQ_CE_THRESHOLD] = { .type = NLA_U32 }, | 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 | prio = skb->priority; | 564 | prio = skb->priority; |
| 565 | tc = netdev_get_prio_tc_map(dev, prio); | 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 | continue; | 569 | continue; |
| 570 | } | ||
| 569 | 571 | ||
| 570 | len = qdisc_pkt_len(skb); | 572 | len = qdisc_pkt_len(skb); |
| 571 | guard = ktime_add_ns(taprio_get_time(q), | 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 | * guard band ... | 577 | * guard band ... |
| 576 | */ | 578 | */ |
| 577 | if (gate_mask != TAPRIO_ALL_GATES_OPEN && | 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 | continue; | 582 | continue; |
| 583 | } | ||
| 580 | 584 | ||
| 581 | /* ... and no budget. */ | 585 | /* ... and no budget. */ |
| 582 | if (gate_mask != TAPRIO_ALL_GATES_OPEN && | 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 | continue; | 589 | continue; |
| 590 | } | ||
| 585 | 591 | ||
| 586 | skb = child->ops->dequeue(child); | 592 | skb = child->ops->dequeue(child); |
| 587 | if (unlikely(!skb)) | 593 | if (unlikely(!skb)) |
| @@ -768,6 +774,7 @@ static const struct nla_policy taprio_policy[TCA_TAPRIO_ATTR_MAX + 1] = { · 180 unmodified lines | |||
| 768 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME] = { .type = NLA_S64 }, | 774 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME] = { .type = NLA_S64 }, |
| 769 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 }, | 775 | [TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION] = { .type = NLA_S64 }, |
| 770 | [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 }, | 776 | [TCA_TAPRIO_ATTR_FLAGS] = { .type = NLA_U32 }, |
| 777 | [TCA_TAPRIO_ATTR_TXTIME_DELAY] = { .type = NLA_U32 }, | ||
| 771 | }; | 778 | }; |
| 772 | 779 | ||
| 773 | static int fill_sched_entry(struct nlattr **tb, struct sched_entry *entry, | 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 | addrcnt++; | 237 | addrcnt++; |
| 238 | 238 | ||
| 239 | return nla_total_size(sizeof(struct sctp_info)) | 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 | + nla_total_size(addrlen * asoc->peer.transport_count) | 240 | + nla_total_size(addrlen * asoc->peer.transport_count) |
| 246 | + nla_total_size(addrlen * addrcnt) | 241 | + nla_total_size(addrlen * addrcnt) |
| 247 | + nla_total_size(sizeof(struct inet_diag_meminfo)) | ||
| 248 | + nla_total_size(sizeof(struct inet_diag_msg)) | 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 | + 64; | 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 | smc_smcr_terminate_all(smcibdev); | 582 | smc_smcr_terminate_all(smcibdev); |
| 583 | smc_ib_cleanup_per_ibdev(smcibdev); | 583 | smc_ib_cleanup_per_ibdev(smcibdev); |
| 584 | ib_unregister_event_handler(&smcibdev->event_handler); | 584 | ib_unregister_event_handler(&smcibdev->event_handler); |
| 585 | cancel_work_sync(&smcibdev->port_event_work); | ||
| 585 | kfree(smcibdev); | 586 | kfree(smcibdev); |
| 586 | } | 587 | } |
| 587 | 588 | ||
| @@ -1707,7 +1707,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog) · 1706 unmodified lines | |||
| 1707 | 1707 | ||
| 1708 | int __sys_accept4_file(struct file *file, unsigned file_flags, | 1708 | int __sys_accept4_file(struct file *file, unsigned file_flags, |
| 1709 | struct sockaddr __user *upeer_sockaddr, | 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 | struct socket *sock, *newsock; | 1713 | struct socket *sock, *newsock; |
| 1713 | struct file *newfile; | 1714 | struct file *newfile; |
| @@ -1738,7 +1739,7 @@ int __sys_accept4_file(struct file *file, unsigned file_flags, · 24 unmodified lines | |||
| 1738 | */ | 1739 | */ |
| 1739 | __module_get(newsock->ops->owner); | 1740 | __module_get(newsock->ops->owner); |
| 1740 | 1741 | ||
| 1741 | newfd = get_unused_fd_flags(flags); | 1742 | newfd = __get_unused_fd_flags(flags, nofile); |
| 1742 | if (unlikely(newfd < 0)) { | 1743 | if (unlikely(newfd < 0)) { |
| 1743 | err = newfd; | 1744 | err = newfd; |
| 1744 | sock_release(newsock); | 1745 | sock_release(newsock); |
| @@ -1807,7 +1808,8 @@ int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, · 62 unmodified lines | |||
| 1807 | f = fdget(fd); | 1808 | f = fdget(fd); |
| 1808 | if (f.file) { | 1809 | if (f.file) { |
| 1809 | ret = __sys_accept4_file(f.file, 0, upeer_sockaddr, | 1810 | ret = __sys_accept4_file(f.file, 0, upeer_sockaddr, |
| 1810 | upeer_addrlen, flags); | 1811 | upeer_addrlen, flags, |
| 1812 | rlimit(RLIMIT_NOFILE)); | ||
| 1811 | if (f.flags) | 1813 | if (f.flags) |
| 1812 | fput(f.file); | 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 | [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, | 116 | [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, |
| 117 | [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, | 117 | [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, |
| 118 | [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }, | 118 | [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }, |
| 119 | [TIPC_NLA_PROP_MTU] = { .type = NLA_U32 }, | ||
| 119 | [TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 }, | 120 | [TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 }, |
| 120 | [TIPC_NLA_PROP_BROADCAST_RATIO] = { .type = NLA_U32 } | 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 | [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, | 470 | [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, |
| 471 | [NL80211_ATTR_STA_PLINK_STATE] = | 471 | [NL80211_ATTR_STA_PLINK_STATE] = |
| 472 | NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), | 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 | [NL80211_ATTR_MESH_PEER_AID] = | 475 | [NL80211_ATTR_MESH_PEER_AID] = |
| 474 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), | 476 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), |
| 475 | [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, | 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 | [NL80211_ATTR_MDID] = { .type = NLA_U16 }, | 533 | [NL80211_ATTR_MDID] = { .type = NLA_U16 }, |
| 532 | [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, | 534 | [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, |
| 533 | .len = IEEE80211_MAX_DATA_LEN }, | 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 | [NL80211_ATTR_PEER_AID] = | 538 | [NL80211_ATTR_PEER_AID] = |
| 535 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), | 539 | NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), |
| 536 | [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, | 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 | NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), | 565 | NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), |
| 562 | [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, | 566 | [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, |
| 563 | [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, | 567 | [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, |
| 568 | [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, | ||
| 564 | [NL80211_ATTR_MAC_MASK] = { | 569 | [NL80211_ATTR_MAC_MASK] = { |
| 565 | .type = NLA_EXACT_LEN_WARN, | 570 | .type = NLA_EXACT_LEN_WARN, |
| 566 | .len = ETH_ALEN | 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 | # gcc version including patch level | 45 | # gcc version including patch level |
| 46 | gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) | 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 | KBUILD_CFLAGS += -Wno-format | 48 | KBUILD_CFLAGS += -Wno-format |
| 49 | KBUILD_CFLAGS += -Wno-sign-compare | 49 | KBUILD_CFLAGS += -Wno-sign-compare |
| 50 | KBUILD_CFLAGS += -Wno-format-zero-length | 50 | KBUILD_CFLAGS += -Wno-format-zero-length |
| 51 | KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) | ||
| 51 | endif | 52 | endif |
| 52 | 53 | ||
| 53 | endif | 54 | endif |
| @@ -94,7 +94,7 @@ if (defined $opt{'o'}) { · 93 unmodified lines | |||
| 94 | # | 94 | # |
| 95 | while ( <$module_symvers> ) { | 95 | while ( <$module_symvers> ) { |
| 96 | chomp; | 96 | chomp; |
| 97 | my (undef, $symbol, $namespace, $module, $gpl) = split('\t'); | 97 | my (undef, $symbol, $module, $gpl, $namespace) = split('\t'); |
| 98 | $SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; | 98 | $SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; |
| 99 | } | 99 | } |
| 100 | close($module_symvers); | 100 | close($module_symvers); |
| @@ -195,13 +195,13 @@ static struct sym_entry *read_symbol(FILE *in) · 194 unmodified lines | |||
| 195 | return NULL; | 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 | if (strcmp(name, "_text") == 0) | 198 | if (strcmp(name, "_text") == 0) |
| 203 | _text = addr; | 199 | _text = addr; |
| 204 | 200 | ||
| 201 | /* Ignore most absolute/undefined (?) symbols. */ | ||
| 202 | if (is_ignored_symbol(name, type)) | ||
| 203 | return NULL; | ||
| 204 | |||
| 205 | check_symbol_range(name, addr, text_ranges, ARRAY_SIZE(text_ranges)); | 205 | check_symbol_range(name, addr, text_ranges, ARRAY_SIZE(text_ranges)); |
| 206 | check_symbol_range(name, addr, &percpu_range, 1); | 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 | static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym) | 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 | unsigned long offset; | 313 | unsigned long offset; |
| 313 | 314 | ||
| 314 | offset = sym->st_value; | 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 | /* parse Module.symvers file. line format: | 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 | static void read_dump(const char *fname, unsigned int kernel) | 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 | return; | 2441 | return; |
| 2441 | 2442 | ||
| 2442 | while ((line = get_next_line(&pos, file, size))) { | 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 | unsigned int crc; | 2445 | unsigned int crc; |
| 2445 | struct module *mod; | 2446 | struct module *mod; |
| 2446 | struct symbol *s; | 2447 | struct symbol *s; |
| @@ -2448,16 +2449,16 @@ static void read_dump(const char *fname, unsigned int kernel) · 1 unmodified line | |||
| 2448 | if (!(symname = strchr(line, '\t'))) | 2449 | if (!(symname = strchr(line, '\t'))) |
| 2449 | goto fail; | 2450 | goto fail; |
| 2450 | *symname++ = '\0'; | 2451 | *symname++ = '\0'; |
| 2451 | if (!(namespace = strchr(symname, '\t'))) | 2452 | if (!(modname = strchr(symname, '\t'))) |
| 2452 | goto fail; | ||
| 2453 | *namespace++ = '\0'; | ||
| 2454 | if (!(modname = strchr(namespace, '\t'))) | ||
| 2455 | goto fail; | 2453 | goto fail; |
| 2456 | *modname++ = '\0'; | 2454 | *modname++ = '\0'; |
| 2457 | if ((export = strchr(modname, '\t')) != NULL) | 2455 | if (!(export = strchr(modname, '\t'))) |
| 2458 | *export++ = '\0'; | 2456 | goto fail; |
| 2459 | if (export && ((end = strchr(export, '\t')) != NULL)) | 2457 | *export++ = '\0'; |
| 2460 | *end = '\0'; | 2458 | if (!(namespace = strchr(export, '\t'))) |
| 2459 | goto fail; | ||
| 2460 | *namespace++ = '\0'; | ||
| 2461 | |||
| 2461 | crc = strtoul(line, &d, 16); | 2462 | crc = strtoul(line, &d, 16); |
| 2462 | if (*symname == '\0' || *modname == '\0' || *d != '\0') | 2463 | if (*symname == '\0' || *modname == '\0' || *d != '\0') |
| 2463 | goto fail; | 2464 | goto fail; |
| @@ -2508,9 +2509,9 @@ static void write_dump(const char *fname) · 44 unmodified lines | |||
| 2508 | namespace = symbol->namespace; | 2509 | namespace = symbol->namespace; |
| 2509 | buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n", | 2510 | buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n", |
| 2510 | symbol->crc, symbol->name, | 2511 | symbol->crc, symbol->name, |
| 2511 | namespace ? namespace : "", | ||
| 2512 | symbol->module->name, | 2512 | symbol->module->name, |
| 2513 | export_str(symbol->export)); | 2513 | export_str(symbol->export), |
| 2514 | namespace ? namespace : ""); | ||
| 2514 | } | 2515 | } |
| 2515 | symbol = symbol->next; | 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 | while (plugin->next) { | 111 | while (plugin->next) { |
| 112 | if (plugin->dst_frames) | 112 | if (plugin->dst_frames) |
| 113 | frames = plugin->dst_frames(plugin, frames); | 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 | return -ENXIO; | 115 | return -ENXIO; |
| 116 | plugin = plugin->next; | 116 | plugin = plugin->next; |
| 117 | err = snd_pcm_plugin_alloc(plugin, frames); | 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 | while (plugin->prev) { | 123 | while (plugin->prev) { |
| 124 | if (plugin->src_frames) | 124 | if (plugin->src_frames) |
| 125 | frames = plugin->src_frames(plugin, frames); | 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 | return -ENXIO; | 127 | return -ENXIO; |
| 128 | plugin = plugin->prev; | 128 | plugin = plugin->prev; |
| 129 | err = snd_pcm_plugin_alloc(plugin, frames); | 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 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | 209 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 210 | plugin = snd_pcm_plug_last(plug); | 210 | plugin = snd_pcm_plug_last(plug); |
| 211 | while (plugin && drv_frames > 0) { | 211 | while (plugin && drv_frames > 0) { |
| 212 | if (drv_frames > plugin->buf_frames) | ||
| 213 | drv_frames = plugin->buf_frames; | ||
| 212 | plugin_prev = plugin->prev; | 214 | plugin_prev = plugin->prev; |
| 213 | if (plugin->src_frames) | 215 | if (plugin->src_frames) |
| 214 | drv_frames = plugin->src_frames(plugin, drv_frames); | 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 | plugin_next = plugin->next; | 222 | plugin_next = plugin->next; |
| 221 | if (plugin->dst_frames) | 223 | if (plugin->dst_frames) |
| 222 | drv_frames = plugin->dst_frames(plugin, drv_frames); | 224 | drv_frames = plugin->dst_frames(plugin, drv_frames); |
| 225 | if (drv_frames > plugin->buf_frames) | ||
| 226 | drv_frames = plugin->buf_frames; | ||
| 223 | plugin = plugin_next; | 227 | plugin = plugin_next; |
| 224 | } | 228 | } |
| 225 | } else | 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 | if (frames < 0) | 252 | if (frames < 0) |
| 249 | return frames; | 253 | return frames; |
| 250 | } | 254 | } |
| 255 | if (frames > plugin->buf_frames) | ||
| 256 | frames = plugin->buf_frames; | ||
| 251 | plugin = plugin_next; | 257 | plugin = plugin_next; |
| 252 | } | 258 | } |
| 253 | } else if (stream == SNDRV_PCM_STREAM_CAPTURE) { | 259 | } else if (stream == SNDRV_PCM_STREAM_CAPTURE) { |
| 254 | plugin = snd_pcm_plug_last(plug); | 260 | plugin = snd_pcm_plug_last(plug); |
| 255 | while (plugin) { | 261 | while (plugin) { |
| 262 | if (frames > plugin->buf_frames) | ||
| 263 | frames = plugin->buf_frames; | ||
| 256 | plugin_prev = plugin->prev; | 264 | plugin_prev = plugin->prev; |
| 257 | if (plugin->src_frames) { | 265 | if (plugin->src_frames) { |
| 258 | frames = plugin->src_frames(plugin, frames); | 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 | len = snd_seq_oss_timer_start(dp->timer); | 602 | len = snd_seq_oss_timer_start(dp->timer); |
| 603 | if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { | 603 | if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { |
| 604 | snd_seq_oss_readq_sysex(dp->readq, mdev->seq_device, ev); | 604 | snd_seq_oss_readq_sysex(dp->readq, mdev->seq_device, ev); |
| 605 | snd_midi_event_reset_decode(mdev->coder); | ||
| 605 | } else { | 606 | } else { |
| 606 | len = snd_midi_event_decode(mdev->coder, msg, sizeof(msg), ev); | 607 | len = snd_midi_event_decode(mdev->coder, msg, sizeof(msg), ev); |
| 607 | if (len > 0) | 608 | if (len > 0) |
| @@ -81,6 +81,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, · 80 unmodified lines | |||
| 81 | if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) | 81 | if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) |
| 82 | continue; | 82 | continue; |
| 83 | snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); | 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 | } else { | 85 | } else { |
| 85 | len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); | 86 | len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); |
| 86 | if (len > 0) | 87 | if (len > 0) |
| @@ -8051,6 +8051,8 @@ static int patch_alc269(struct hda_codec *codec) · 8050 unmodified lines | |||
| 8051 | spec->gen.mixer_nid = 0; | 8051 | spec->gen.mixer_nid = 0; |
| 8052 | break; | 8052 | break; |
| 8053 | case 0x10ec0225: | 8053 | case 0x10ec0225: |
| 8054 | codec->power_save_node = 1; | ||
| 8055 | /* fall through */ | ||
| 8054 | case 0x10ec0295: | 8056 | case 0x10ec0295: |
| 8055 | case 0x10ec0299: | 8057 | case 0x10ec0299: |
| 8056 | spec->codec_variant = ALC269_TYPE_ALC225; | 8058 | spec->codec_variant = ALC269_TYPE_ALC225; |
| @@ -8610,6 +8612,8 @@ enum { · 553 unmodified lines | |||
| 8610 | ALC669_FIXUP_ACER_ASPIRE_ETHOS, | 8612 | ALC669_FIXUP_ACER_ASPIRE_ETHOS, |
| 8611 | ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET, | 8613 | ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET, |
| 8612 | ALC671_FIXUP_HP_HEADSET_MIC2, | 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 | static const struct hda_fixup alc662_fixups[] = { | 8619 | static const struct hda_fixup alc662_fixups[] = { |
| @@ -8955,6 +8959,25 @@ static const struct hda_fixup alc662_fixups[] = { · 339 unmodified lines | |||
| 8955 | .type = HDA_FIXUP_FUNC, | 8959 | .type = HDA_FIXUP_FUNC, |
| 8956 | .v.func = alc671_fixup_hp_headset_mic2, | 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 | static const struct snd_pci_quirk alc662_fixup_tbl[] = { | 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 | SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC), | 8989 | SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC), |
| 8967 | SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC), | 8990 | SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC), |
| 8968 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), | 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 | SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 8994 | SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 8970 | SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 8995 | SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 8971 | SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13), | 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 | line6_midibuf_read(mb, line6->buffer_message, | 305 | line6_midibuf_read(mb, line6->buffer_message, |
| 306 | LINE6_MIDI_MESSAGE_MAXLEN); | 306 | LINE6_MIDI_MESSAGE_MAXLEN); |
| 307 | 307 | ||
| 308 | if (done == 0) | 308 | if (done <= 0) |
| 309 | break; | 309 | break; |
| 310 | 310 | ||
| 311 | line6->message_length = done; | 311 | line6->message_length = done; |
| @@ -159,7 +159,7 @@ int line6_midibuf_read(struct midi_buffer *this, unsigned char *data, · 158 unmodified lines | |||
| 159 | int midi_length_prev = | 159 | int midi_length_prev = |
| 160 | midibuf_message_length(this->command_prev); | 160 | midibuf_message_length(this->command_prev); |
| 161 | 161 | ||
| 162 | if (midi_length_prev > 0) { | 162 | if (midi_length_prev > 1) { |
| 163 | midi_length = midi_length_prev - 1; | 163 | midi_length = midi_length_prev - 1; |
| 164 | repeat = 1; | 164 | repeat = 1; |
| 165 | } else | 165 | } else |
| @@ -1,18 +1,18 @@ | |||
| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | #if defined(__i386__) || defined(__x86_64__) | 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 | #elif defined(__powerpc__) | 4 | #elif defined(__powerpc__) |
| 5 | #include "../../arch/powerpc/include/uapi/asm/errno.h" | 5 | #include "../../../arch/powerpc/include/uapi/asm/errno.h" |
| 6 | #elif defined(__sparc__) | 6 | #elif defined(__sparc__) |
| 7 | #include "../../arch/sparc/include/uapi/asm/errno.h" | 7 | #include "../../../arch/sparc/include/uapi/asm/errno.h" |
| 8 | #elif defined(__alpha__) | 8 | #elif defined(__alpha__) |
| 9 | #include "../../arch/alpha/include/uapi/asm/errno.h" | 9 | #include "../../../arch/alpha/include/uapi/asm/errno.h" |
| 10 | #elif defined(__mips__) | 10 | #elif defined(__mips__) |
| 11 | #include "../../arch/mips/include/uapi/asm/errno.h" | 11 | #include "../../../arch/mips/include/uapi/asm/errno.h" |
| 12 | #elif defined(__ia64__) | 12 | #elif defined(__ia64__) |
| 13 | #include "../../arch/ia64/include/uapi/asm/errno.h" | 13 | #include "../../../arch/ia64/include/uapi/asm/errno.h" |
| 14 | #elif defined(__xtensa__) | 14 | #elif defined(__xtensa__) |
| 15 | #include "../../arch/xtensa/include/uapi/asm/errno.h" | 15 | #include "../../../arch/xtensa/include/uapi/asm/errno.h" |
| 16 | #else | 16 | #else |
| 17 | #include <asm-generic/errno.h> | 17 | #include <asm-generic/errno.h> |
| 18 | #endif | 18 | #endif |
| @@ -11,17 +11,17 @@ · 10 unmodified lines | |||
| 11 | #include <linux/zalloc.h> | 11 | #include <linux/zalloc.h> |
| 12 | #include <time.h> | 12 | #include <time.h> |
| 13 | 13 | ||
| 14 | #include "../../util/cpumap.h" | 14 | #include "../../../util/cpumap.h" |
| 15 | #include "../../util/event.h" | 15 | #include "../../../util/event.h" |
| 16 | #include "../../util/evsel.h" | 16 | #include "../../../util/evsel.h" |
| 17 | #include "../../util/evlist.h" | 17 | #include "../../../util/evlist.h" |
| 18 | #include "../../util/session.h" | 18 | #include "../../../util/session.h" |
| 19 | #include <internal/lib.h> // page_size | 19 | #include <internal/lib.h> // page_size |
| 20 | #include "../../util/pmu.h" | 20 | #include "../../../util/pmu.h" |
| 21 | #include "../../util/debug.h" | 21 | #include "../../../util/debug.h" |
| 22 | #include "../../util/auxtrace.h" | 22 | #include "../../../util/auxtrace.h" |
| 23 | #include "../../util/record.h" | 23 | #include "../../../util/record.h" |
| 24 | #include "../../util/arm-spe.h" | 24 | #include "../../../util/arm-spe.h" |
| 25 | 25 | ||
| 26 | #define KiB(x) ((x) * 1024) | 26 | #define KiB(x) ((x) * 1024) |
| 27 | #define MiB(x) ((x) * 1024 * 1024) | 27 | #define MiB(x) ((x) * 1024 * 1024) |
| @@ -1,5 +1,5 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | #include "../../util/perf_regs.h" | 2 | #include "../../../util/perf_regs.h" |
| 3 | 3 | ||
| 4 | const struct sample_reg sample_reg_masks[] = { | 4 | const struct sample_reg sample_reg_masks[] = { |
| 5 | SMPL_REG_END | 5 | SMPL_REG_END |
| @@ -4,8 +4,8 @@ · 3 unmodified lines | |||
| 4 | #include <regex.h> | 4 | #include <regex.h> |
| 5 | #include <linux/zalloc.h> | 5 | #include <linux/zalloc.h> |
| 6 | 6 | ||
| 7 | #include "../../util/perf_regs.h" | 7 | #include "../../../util/perf_regs.h" |
| 8 | #include "../../util/debug.h" | 8 | #include "../../../util/debug.h" |
| 9 | 9 | ||
| 10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 11 | 11 | ||
| @@ -7,13 +7,13 @@ · 6 unmodified lines | |||
| 7 | #include <errno.h> | 7 | #include <errno.h> |
| 8 | #include <stdbool.h> | 8 | #include <stdbool.h> |
| 9 | 9 | ||
| 10 | #include "../../util/header.h" | 10 | #include "../../../util/header.h" |
| 11 | #include "../../util/debug.h" | 11 | #include "../../../util/debug.h" |
| 12 | #include "../../util/pmu.h" | 12 | #include "../../../util/pmu.h" |
| 13 | #include "../../util/auxtrace.h" | 13 | #include "../../../util/auxtrace.h" |
| 14 | #include "../../util/intel-pt.h" | 14 | #include "../../../util/intel-pt.h" |
| 15 | #include "../../util/intel-bts.h" | 15 | #include "../../../util/intel-bts.h" |
| 16 | #include "../../util/evlist.h" | 16 | #include "../../../util/evlist.h" |
| 17 | 17 | ||
| 18 | static | 18 | static |
| 19 | struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, | 19 | struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, |
| @@ -3,12 +3,12 @@ · 2 unmodified lines | |||
| 3 | #include <linux/string.h> | 3 | #include <linux/string.h> |
| 4 | #include <linux/zalloc.h> | 4 | #include <linux/zalloc.h> |
| 5 | 5 | ||
| 6 | #include "../../util/event.h" | 6 | #include "../../../util/event.h" |
| 7 | #include "../../util/synthetic-events.h" | 7 | #include "../../../util/synthetic-events.h" |
| 8 | #include "../../util/machine.h" | 8 | #include "../../../util/machine.h" |
| 9 | #include "../../util/tool.h" | 9 | #include "../../../util/tool.h" |
| 10 | #include "../../util/map.h" | 10 | #include "../../../util/map.h" |
| 11 | #include "../../util/debug.h" | 11 | #include "../../../util/debug.h" |
| 12 | 12 | ||
| 13 | #if defined(__x86_64__) | 13 | #if defined(__x86_64__) |
| 14 | 14 | ||
| @@ -7,8 +7,8 @@ · 6 unmodified lines | |||
| 7 | #include <string.h> | 7 | #include <string.h> |
| 8 | #include <regex.h> | 8 | #include <regex.h> |
| 9 | 9 | ||
| 10 | #include "../../util/debug.h" | 10 | #include "../../../util/debug.h" |
| 11 | #include "../../util/header.h" | 11 | #include "../../../util/header.h" |
| 12 | 12 | ||
| 13 | static inline void | 13 | static inline void |
| 14 | cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c, | 14 | cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c, |
| @@ -11,18 +11,18 @@ · 10 unmodified lines | |||
| 11 | #include <linux/log2.h> | 11 | #include <linux/log2.h> |
| 12 | #include <linux/zalloc.h> | 12 | #include <linux/zalloc.h> |
| 13 | 13 | ||
| 14 | #include "../../util/cpumap.h" | 14 | #include "../../../util/cpumap.h" |
| 15 | #include "../../util/event.h" | 15 | #include "../../../util/event.h" |
| 16 | #include "../../util/evsel.h" | 16 | #include "../../../util/evsel.h" |
| 17 | #include "../../util/evlist.h" | 17 | #include "../../../util/evlist.h" |
| 18 | #include "../../util/mmap.h" | 18 | #include "../../../util/mmap.h" |
| 19 | #include "../../util/session.h" | 19 | #include "../../../util/session.h" |
| 20 | #include "../../util/pmu.h" | 20 | #include "../../../util/pmu.h" |
| 21 | #include "../../util/debug.h" | 21 | #include "../../../util/debug.h" |
| 22 | #include "../../util/record.h" | 22 | #include "../../../util/record.h" |
| 23 | #include "../../util/tsc.h" | 23 | #include "../../../util/tsc.h" |
| 24 | #include "../../util/auxtrace.h" | 24 | #include "../../../util/auxtrace.h" |
| 25 | #include "../../util/intel-bts.h" | 25 | #include "../../../util/intel-bts.h" |
| 26 | #include <internal/lib.h> // page_size | 26 | #include <internal/lib.h> // page_size |
| 27 | 27 | ||
| 28 | #define KiB(x) ((x) * 1024) | 28 | #define KiB(x) ((x) * 1024) |
| @@ -13,23 +13,23 @@ · 12 unmodified lines | |||
| 13 | #include <linux/zalloc.h> | 13 | #include <linux/zalloc.h> |
| 14 | #include <cpuid.h> | 14 | #include <cpuid.h> |
| 15 | 15 | ||
| 16 | #include "../../util/session.h" | 16 | #include "../../../util/session.h" |
| 17 | #include "../../util/event.h" | 17 | #include "../../../util/event.h" |
| 18 | #include "../../util/evlist.h" | 18 | #include "../../../util/evlist.h" |
| 19 | #include "../../util/evsel.h" | 19 | #include "../../../util/evsel.h" |
| 20 | #include "../../util/evsel_config.h" | 20 | #include "../../../util/evsel_config.h" |
| 21 | #include "../../util/cpumap.h" | 21 | #include "../../../util/cpumap.h" |
| 22 | #include "../../util/mmap.h" | 22 | #include "../../../util/mmap.h" |
| 23 | #include <subcmd/parse-options.h> | 23 | #include <subcmd/parse-options.h> |
| 24 | #include "../../util/parse-events.h" | 24 | #include "../../../util/parse-events.h" |
| 25 | #include "../../util/pmu.h" | 25 | #include "../../../util/pmu.h" |
| 26 | #include "../../util/debug.h" | 26 | #include "../../../util/debug.h" |
| 27 | #include "../../util/auxtrace.h" | 27 | #include "../../../util/auxtrace.h" |
| 28 | #include "../../util/record.h" | 28 | #include "../../../util/record.h" |
| 29 | #include "../../util/target.h" | 29 | #include "../../../util/target.h" |
| 30 | #include "../../util/tsc.h" | 30 | #include "../../../util/tsc.h" |
| 31 | #include <internal/lib.h> // page_size | 31 | #include <internal/lib.h> // page_size |
| 32 | #include "../../util/intel-pt.h" | 32 | #include "../../../util/intel-pt.h" |
| 33 | 33 | ||
| 34 | #define KiB(x) ((x) * 1024) | 34 | #define KiB(x) ((x) * 1024) |
| 35 | #define MiB(x) ((x) * 1024 * 1024) | 35 | #define MiB(x) ((x) * 1024 * 1024) |
| @@ -5,9 +5,9 @@ · 4 unmodified lines | |||
| 5 | #include <stdlib.h> | 5 | #include <stdlib.h> |
| 6 | 6 | ||
| 7 | #include <internal/lib.h> // page_size | 7 | #include <internal/lib.h> // page_size |
| 8 | #include "../../util/machine.h" | 8 | #include "../../../util/machine.h" |
| 9 | #include "../../util/map.h" | 9 | #include "../../../util/map.h" |
| 10 | #include "../../util/symbol.h" | 10 | #include "../../../util/symbol.h" |
| 11 | #include <linux/ctype.h> | 11 | #include <linux/ctype.h> |
| 12 | 12 | ||
| 13 | #include <symbol/kallsyms.h> | 13 | #include <symbol/kallsyms.h> |
| @@ -5,10 +5,10 @@ · 4 unmodified lines | |||
| 5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
| 6 | #include <linux/zalloc.h> | 6 | #include <linux/zalloc.h> |
| 7 | 7 | ||
| 8 | #include "../../perf-sys.h" | 8 | #include "../../../perf-sys.h" |
| 9 | #include "../../util/perf_regs.h" | 9 | #include "../../../util/perf_regs.h" |
| 10 | #include "../../util/debug.h" | 10 | #include "../../../util/debug.h" |
| 11 | #include "../../util/event.h" | 11 | #include "../../../util/event.h" |
| 12 | 12 | ||
| 13 | const struct sample_reg sample_reg_masks[] = { | 13 | const struct sample_reg sample_reg_masks[] = { |
| 14 | SMPL_REG(AX, PERF_REG_X86_AX), | 14 | SMPL_REG(AX, PERF_REG_X86_AX), |
| @@ -4,9 +4,9 @@ · 3 unmodified lines | |||
| 4 | #include <linux/stddef.h> | 4 | #include <linux/stddef.h> |
| 5 | #include <linux/perf_event.h> | 5 | #include <linux/perf_event.h> |
| 6 | 6 | ||
| 7 | #include "../../util/intel-pt.h" | 7 | #include "../../../util/intel-pt.h" |
| 8 | #include "../../util/intel-bts.h" | 8 | #include "../../../util/intel-bts.h" |
| 9 | #include "../../util/pmu.h" | 9 | #include "../../../util/pmu.h" |
| 10 | 10 | ||
| 11 | struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused) | 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 | #ifndef BENCH_H | 2 | #ifndef BENCH_H |
| 3 | #define BENCH_H | 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 | * The madvise transparent hugepage constants were added in glibc | 10 | * The madvise transparent hugepage constants were added in glibc |
| 7 | * 2.13. For compatibility with older versions of glibc, define these | 11 | * 2.13. For compatibility with older versions of glibc, define these |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | |||
| 35 | 35 | ||
| 36 | static unsigned int nthreads = 0; | 36 | static unsigned int nthreads = 0; |
| 37 | static unsigned int nsecs = 8; | 37 | static unsigned int nsecs = 8; |
| 38 | struct timeval start, end, runtime; | ||
| 39 | static bool done, __verbose, randomize; | 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 | /* inform all threads that we're done for the day */ | 94 | /* inform all threads that we're done for the day */ |
| 96 | done = true; | 95 | done = true; |
| 97 | gettimeofday(&end, NULL); | 96 | gettimeofday(&bench__end, NULL); |
| 98 | timersub(&end, &start, &runtime); | 97 | timersub(&bench__end, &bench__start, &bench__runtime); |
| 99 | } | 98 | } |
| 100 | 99 | ||
| 101 | static void nest_epollfd(void) | 100 | static void nest_epollfd(void) |
| @@ -313,6 +312,7 @@ int bench_epoll_ctl(int argc, const char **argv) · 211 unmodified lines | |||
| 313 | exit(EXIT_FAILURE); | 312 | exit(EXIT_FAILURE); |
| 314 | } | 313 | } |
| 315 | 314 | ||
| 315 | memset(&act, 0, sizeof(act)); | ||
| 316 | sigfillset(&act.sa_mask); | 316 | sigfillset(&act.sa_mask); |
| 317 | act.sa_sigaction = toggle_done; | 317 | act.sa_sigaction = toggle_done; |
| 318 | sigaction(SIGINT, &act, NULL); | 318 | sigaction(SIGINT, &act, NULL); |
| @@ -361,7 +361,7 @@ int bench_epoll_ctl(int argc, const char **argv) · 42 unmodified lines | |||
| 361 | 361 | ||
| 362 | threads_starting = nthreads; | 362 | threads_starting = nthreads; |
| 363 | 363 | ||
| 364 | gettimeofday(&start, NULL); | 364 | gettimeofday(&bench__start, NULL); |
| 365 | 365 | ||
| 366 | do_threads(worker, cpu); | 366 | do_threads(worker, cpu); |
| 367 | 367 | ||
| @@ -90,7 +90,6 @@ · 89 unmodified lines | |||
| 90 | 90 | ||
| 91 | static unsigned int nthreads = 0; | 91 | static unsigned int nthreads = 0; |
| 92 | static unsigned int nsecs = 8; | 92 | static unsigned int nsecs = 8; |
| 93 | struct timeval start, end, runtime; | ||
| 94 | static bool wdone, done, __verbose, randomize, nonblocking; | 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 | /* inform all threads that we're done for the day */ | 276 | /* inform all threads that we're done for the day */ |
| 278 | done = true; | 277 | done = true; |
| 279 | gettimeofday(&end, NULL); | 278 | gettimeofday(&bench__end, NULL); |
| 280 | timersub(&end, &start, &runtime); | 279 | timersub(&bench__end, &bench__start, &bench__runtime); |
| 281 | } | 280 | } |
| 282 | 281 | ||
| 283 | static void print_summary(void) | 282 | static void print_summary(void) |
| @@ -287,7 +286,7 @@ static void print_summary(void) · 3 unmodified lines | |||
| 287 | 286 | ||
| 288 | printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", | 287 | printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 289 | avg, rel_stddev_stats(stddev, avg), | 288 | avg, rel_stddev_stats(stddev, avg), |
| 290 | (int) runtime.tv_sec); | 289 | (int)bench__runtime.tv_sec); |
| 291 | } | 290 | } |
| 292 | 291 | ||
| 293 | static int do_threads(struct worker *worker, struct perf_cpu_map *cpu) | 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 | exit(EXIT_FAILURE); | 426 | exit(EXIT_FAILURE); |
| 428 | } | 427 | } |
| 429 | 428 | ||
| 429 | memset(&act, 0, sizeof(act)); | ||
| 430 | sigfillset(&act.sa_mask); | 430 | sigfillset(&act.sa_mask); |
| 431 | act.sa_sigaction = toggle_done; | 431 | act.sa_sigaction = toggle_done; |
| 432 | sigaction(SIGINT, &act, NULL); | 432 | sigaction(SIGINT, &act, NULL); |
| @@ -479,7 +479,7 @@ int bench_epoll_wait(int argc, const char **argv) · 46 unmodified lines | |||
| 479 | 479 | ||
| 480 | threads_starting = nthreads; | 480 | threads_starting = nthreads; |
| 481 | 481 | ||
| 482 | gettimeofday(&start, NULL); | 482 | gettimeofday(&bench__start, NULL); |
| 483 | 483 | ||
| 484 | do_threads(worker, cpu); | 484 | do_threads(worker, cpu); |
| 485 | 485 | ||
| @@ -519,7 +519,7 @@ int bench_epoll_wait(int argc, const char **argv) · 33 unmodified lines | |||
| 519 | qsort(worker, nthreads, sizeof(struct worker), cmpworker); | 519 | qsort(worker, nthreads, sizeof(struct worker), cmpworker); |
| 520 | 520 | ||
| 521 | for (i = 0; i < nthreads; i++) { | 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 | update_stats(&throughput_stats, t); | 524 | update_stats(&throughput_stats, t); |
| 525 | 525 | ||
| @@ -37,7 +37,7 @@ static unsigned int nfutexes = 1024; · 36 unmodified lines | |||
| 37 | static bool fshared = false, done = false, silent = false; | 37 | static bool fshared = false, done = false, silent = false; |
| 38 | static int futex_flag = 0; | 38 | static int futex_flag = 0; |
| 39 | 39 | ||
| 40 | struct timeval start, end, runtime; | 40 | struct timeval bench__start, bench__end, bench__runtime; |
| 41 | static pthread_mutex_t thread_lock; | 41 | static pthread_mutex_t thread_lock; |
| 42 | static unsigned int threads_starting; | 42 | static unsigned int threads_starting; |
| 43 | static struct stats throughput_stats; | 43 | static struct stats throughput_stats; |
| @@ -103,8 +103,8 @@ static void toggle_done(int sig __maybe_unused, · 59 unmodified lines | |||
| 103 | { | 103 | { |
| 104 | /* inform all threads that we're done for the day */ | 104 | /* inform all threads that we're done for the day */ |
| 105 | done = true; | 105 | done = true; |
| 106 | gettimeofday(&end, NULL); | 106 | gettimeofday(&bench__end, NULL); |
| 107 | timersub(&end, &start, &runtime); | 107 | timersub(&bench__end, &bench__start, &bench__runtime); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static void print_summary(void) | 110 | static void print_summary(void) |
| @@ -114,7 +114,7 @@ static void print_summary(void) · 3 unmodified lines | |||
| 114 | 114 | ||
| 115 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", | 115 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 116 | !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), | 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 | int bench_futex_hash(int argc, const char **argv) | 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 | if (!cpu) | 137 | if (!cpu) |
| 138 | goto errmem; | 138 | goto errmem; |
| 139 | 139 | ||
| 140 | memset(&act, 0, sizeof(act)); | ||
| 140 | sigfillset(&act.sa_mask); | 141 | sigfillset(&act.sa_mask); |
| 141 | act.sa_sigaction = toggle_done; | 142 | act.sa_sigaction = toggle_done; |
| 142 | sigaction(SIGINT, &act, NULL); | 143 | sigaction(SIGINT, &act, NULL); |
| @@ -161,7 +162,7 @@ int bench_futex_hash(int argc, const char **argv) · 18 unmodified lines | |||
| 161 | 162 | ||
| 162 | threads_starting = nthreads; | 163 | threads_starting = nthreads; |
| 163 | pthread_attr_init(&thread_attr); | 164 | pthread_attr_init(&thread_attr); |
| 164 | gettimeofday(&start, NULL); | 165 | gettimeofday(&bench__start, NULL); |
| 165 | for (i = 0; i < nthreads; i++) { | 166 | for (i = 0; i < nthreads; i++) { |
| 166 | worker[i].tid = i; | 167 | worker[i].tid = i; |
| 167 | worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); | 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 | pthread_mutex_destroy(&thread_lock); | 205 | pthread_mutex_destroy(&thread_lock); |
| 205 | 206 | ||
| 206 | for (i = 0; i < nthreads; i++) { | 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 | update_stats(&throughput_stats, t); | 209 | update_stats(&throughput_stats, t); |
| 209 | if (!silent) { | 210 | if (!silent) { |
| 210 | if (nfutexes == 1) | 211 | if (nfutexes == 1) |
| @@ -37,7 +37,6 @@ static bool silent = false, multi = false; · 36 unmodified lines | |||
| 37 | static bool done = false, fshared = false; | 37 | static bool done = false, fshared = false; |
| 38 | static unsigned int nthreads = 0; | 38 | static unsigned int nthreads = 0; |
| 39 | static int futex_flag = 0; | 39 | static int futex_flag = 0; |
| 40 | struct timeval start, end, runtime; | ||
| 41 | static pthread_mutex_t thread_lock; | 40 | static pthread_mutex_t thread_lock; |
| 42 | static unsigned int threads_starting; | 41 | static unsigned int threads_starting; |
| 43 | static struct stats throughput_stats; | 42 | static struct stats throughput_stats; |
| @@ -64,7 +63,7 @@ static void print_summary(void) · 20 unmodified lines | |||
| 64 | 63 | ||
| 65 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", | 64 | printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", |
| 66 | !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), | 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 | static void toggle_done(int sig __maybe_unused, | 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 | /* inform all threads that we're done for the day */ | 73 | /* inform all threads that we're done for the day */ |
| 75 | done = true; | 74 | done = true; |
| 76 | gettimeofday(&end, NULL); | 75 | gettimeofday(&bench__end, NULL); |
| 77 | timersub(&end, &start, &runtime); | 76 | timersub(&bench__end, &bench__start, &bench__runtime); |
| 78 | } | 77 | } |
| 79 | 78 | ||
| 80 | static void *workerfn(void *arg) | 79 | static void *workerfn(void *arg) |
| @@ -161,6 +160,7 @@ int bench_futex_lock_pi(int argc, const char **argv) · 80 unmodified lines | |||
| 161 | if (!cpu) | 160 | if (!cpu) |
| 162 | err(EXIT_FAILURE, "calloc"); | 161 | err(EXIT_FAILURE, "calloc"); |
| 163 | 162 | ||
| 163 | memset(&act, 0, sizeof(act)); | ||
| 164 | sigfillset(&act.sa_mask); | 164 | sigfillset(&act.sa_mask); |
| 165 | act.sa_sigaction = toggle_done; | 165 | act.sa_sigaction = toggle_done; |
| 166 | sigaction(SIGINT, &act, NULL); | 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 | threads_starting = nthreads; | 186 | threads_starting = nthreads; |
| 187 | pthread_attr_init(&thread_attr); | 187 | pthread_attr_init(&thread_attr); |
| 188 | gettimeofday(&start, NULL); | 188 | gettimeofday(&bench__start, NULL); |
| 189 | 189 | ||
| 190 | create_threads(worker, thread_attr, cpu); | 190 | create_threads(worker, thread_attr, cpu); |
| 191 | pthread_attr_destroy(&thread_attr); | 191 | pthread_attr_destroy(&thread_attr); |
| @@ -211,7 +211,7 @@ int bench_futex_lock_pi(int argc, const char **argv) · 19 unmodified lines | |||
| 211 | pthread_mutex_destroy(&thread_lock); | 211 | pthread_mutex_destroy(&thread_lock); |
| 212 | 212 | ||
| 213 | for (i = 0; i < nthreads; i++) { | 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 | update_stats(&throughput_stats, t); | 216 | update_stats(&throughput_stats, t); |
| 217 | if (!silent) | 217 | if (!silent) |
| @@ -128,6 +128,7 @@ int bench_futex_requeue(int argc, const char **argv) · 127 unmodified lines | |||
| 128 | if (!cpu) | 128 | if (!cpu) |
| 129 | err(EXIT_FAILURE, "cpu_map__new"); | 129 | err(EXIT_FAILURE, "cpu_map__new"); |
| 130 | 130 | ||
| 131 | memset(&act, 0, sizeof(act)); | ||
| 131 | sigfillset(&act.sa_mask); | 132 | sigfillset(&act.sa_mask); |
| 132 | act.sa_sigaction = toggle_done; | 133 | act.sa_sigaction = toggle_done; |
| 133 | sigaction(SIGINT, &act, NULL); | 134 | sigaction(SIGINT, &act, NULL); |
| @@ -234,6 +234,7 @@ int bench_futex_wake_parallel(int argc, const char **argv) · 233 unmodified lines | |||
| 234 | exit(EXIT_FAILURE); | 234 | exit(EXIT_FAILURE); |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | memset(&act, 0, sizeof(act)); | ||
| 237 | sigfillset(&act.sa_mask); | 238 | sigfillset(&act.sa_mask); |
| 238 | act.sa_sigaction = toggle_done; | 239 | act.sa_sigaction = toggle_done; |
| 239 | sigaction(SIGINT, &act, NULL); | 240 | sigaction(SIGINT, &act, NULL); |
| @@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false; · 42 unmodified lines | |||
| 43 | static pthread_mutex_t thread_lock; | 43 | static pthread_mutex_t thread_lock; |
| 44 | static pthread_cond_t thread_parent, thread_worker; | 44 | static pthread_cond_t thread_parent, thread_worker; |
| 45 | static struct stats waketime_stats, wakeup_stats; | 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 | static int futex_flag = 0; | 47 | static int futex_flag = 0; |
| 48 | 48 | ||
| 49 | static const struct option options[] = { | 49 | static const struct option options[] = { |
| @@ -136,12 +136,13 @@ int bench_futex_wake(int argc, const char **argv) · 86 unmodified lines | |||
| 136 | if (!cpu) | 136 | if (!cpu) |
| 137 | err(EXIT_FAILURE, "calloc"); | 137 | err(EXIT_FAILURE, "calloc"); |
| 138 | 138 | ||
| 139 | memset(&act, 0, sizeof(act)); | ||
| 139 | sigfillset(&act.sa_mask); | 140 | sigfillset(&act.sa_mask); |
| 140 | act.sa_sigaction = toggle_done; | 141 | act.sa_sigaction = toggle_done; |
| 141 | sigaction(SIGINT, &act, NULL); | 142 | sigaction(SIGINT, &act, NULL); |
| 142 | 143 | ||
| 143 | if (!nthreads) | 144 | if (!nthreads) |
| 144 | nthreads = ncpus; | 145 | nthreads = cpu->nr; |
| 145 | 146 | ||
| 146 | worker = calloc(nthreads, sizeof(*worker)); | 147 | worker = calloc(nthreads, sizeof(*worker)); |
| 147 | if (!worker) | 148 | if (!worker) |
| @@ -1312,7 +1312,8 @@ static int cycles_printf(struct hist_entry *he, struct hist_entry *pair, · 1311 unmodified lines | |||
| 1312 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, | 1312 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, |
| 1313 | he->ms.sym); | 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 | scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld", | 1317 | scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld", |
| 1317 | start_line, end_line, block_he->diff.cycles); | 1318 | start_line, end_line, block_he->diff.cycles); |
| 1318 | } else { | 1319 | } else { |
| @@ -684,7 +684,9 @@ repeat: · 683 unmodified lines | |||
| 684 | delay_msecs = top->delay_secs * MSEC_PER_SEC; | 684 | delay_msecs = top->delay_secs * MSEC_PER_SEC; |
| 685 | set_term_quiet_input(&save); | 685 | set_term_quiet_input(&save); |
| 686 | /* trash return*/ | 686 | /* trash return*/ |
| 687 | getc(stdin); | 687 | clearerr(stdin); |
| 688 | if (poll(&stdin_poll, 1, 0) > 0) | ||
| 689 | getc(stdin); | ||
| 688 | 690 | ||
| 689 | while (!done) { | 691 | while (!done) { |
| 690 | perf_top__print_sym_table(top); | 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 | int main(int argc, char *argv[]) | 1083 | int main(int argc, char *argv[]) |
| 1084 | { | 1084 | { |
| 1085 | int rc; | 1085 | int rc, ret = 0; |
| 1086 | int maxfds; | 1086 | int maxfds; |
| 1087 | char ldirname[PATH_MAX]; | 1087 | char ldirname[PATH_MAX]; |
| 1088 | |||
| 1089 | const char *arch; | 1088 | const char *arch; |
| 1090 | const char *output_file; | 1089 | const char *output_file; |
| 1091 | const char *start_dirname; | 1090 | const char *start_dirname; |
| @@ -1156,7 +1155,8 @@ int main(int argc, char *argv[]) · 64 unmodified lines | |||
| 1156 | /* Make build fail */ | 1155 | /* Make build fail */ |
| 1157 | fclose(eventsfp); | 1156 | fclose(eventsfp); |
| 1158 | free_arch_std_events(); | 1157 | free_arch_std_events(); |
| 1159 | return 1; | 1158 | ret = 1; |
| 1159 | goto out_free_mapfile; | ||
| 1160 | } else if (rc) { | 1160 | } else if (rc) { |
| 1161 | goto empty_map; | 1161 | goto empty_map; |
| 1162 | } | 1162 | } |
| @@ -1174,14 +1174,17 @@ int main(int argc, char *argv[]) · 11 unmodified lines | |||
| 1174 | /* Make build fail */ | 1174 | /* Make build fail */ |
| 1175 | fclose(eventsfp); | 1175 | fclose(eventsfp); |
| 1176 | free_arch_std_events(); | 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 | empty_map: | 1183 | empty_map: |
| 1183 | fclose(eventsfp); | 1184 | fclose(eventsfp); |
| 1184 | create_empty_mapping(output_file); | 1185 | create_empty_mapping(output_file); |
| 1185 | free_arch_std_events(); | 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 | #include "../perf-sys.h" | 19 | #include "../perf-sys.h" |
| 20 | #include "cloexec.h" | 20 | #include "cloexec.h" |
| 21 | 21 | ||
| 22 | volatile long the_var; | 22 | static volatile long the_var; |
| 23 | 23 | ||
| 24 | static noinline int test_function(void) | 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 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, | 295 | end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, |
| 296 | he->ms.sym); | 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 | scnprintf(buf, sizeof(buf), "[%s -> %s]", | 300 | scnprintf(buf, sizeof(buf), "[%s -> %s]", |
| 300 | start_line, end_line); | 301 | start_line, end_line); |
| 301 | } else { | 302 | } else { |
| @@ -343,11 +343,11 @@ static const char *normalize_arch(char *arch) · 342 unmodified lines | |||
| 343 | 343 | ||
| 344 | const char *perf_env__arch(struct perf_env *env) | 344 | const char *perf_env__arch(struct perf_env *env) |
| 345 | { | 345 | { |
| 346 | struct utsname uts; | ||
| 347 | char *arch_name; | 346 | char *arch_name; |
| 348 | 347 | ||
| 349 | if (!env || !env->arch) { /* Assume local operation */ | 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 | return NULL; | 351 | return NULL; |
| 352 | arch_name = uts.machine; | 352 | arch_name = uts.machine; |
| 353 | } else | 353 | } else |
| @@ -431,7 +431,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, · 430 unmodified lines | |||
| 431 | 431 | ||
| 432 | if (map && map->dso) { | 432 | if (map && map->dso) { |
| 433 | char *srcline = map__srcline(map, addr, NULL); | 433 | char *srcline = map__srcline(map, addr, NULL); |
| 434 | if (srcline != SRCLINE_UNKNOWN) | 434 | if (strncmp(srcline, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) |
| 435 | ret = fprintf(fp, "%s%s", prefix, srcline); | 435 | ret = fprintf(fp, "%s%s", prefix, srcline); |
| 436 | free_srcline(srcline); | 436 | free_srcline(srcline); |
| 437 | } | 437 | } |
| @@ -257,21 +257,15 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config) · 256 unmodified lines | |||
| 257 | path = zalloc(sizeof(*path)); | 257 | path = zalloc(sizeof(*path)); |
| 258 | if (!path) | 258 | if (!path) |
| 259 | return NULL; | 259 | return NULL; |
| 260 | path->system = malloc(MAX_EVENT_LENGTH); | 260 | if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { |
| 261 | if (!path->system) { | ||
| 262 | free(path); | 261 | free(path); |
| 263 | return NULL; | 262 | return NULL; |
| 264 | } | 263 | } |
| 265 | path->name = malloc(MAX_EVENT_LENGTH); | 264 | if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { |
| 266 | if (!path->name) { | ||
| 267 | zfree(&path->system); | 265 | zfree(&path->system); |
| 268 | free(path); | 266 | free(path); |
| 269 | return NULL; | 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 | return path; | 269 | return path; |
| 276 | } | 270 | } |
| 277 | } | 271 | } |
| @@ -1622,7 +1622,12 @@ int dso__load(struct dso *dso, struct map *map) · 1621 unmodified lines | |||
| 1622 | goto out; | 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 | if (dso->kernel == DSO_TYPE_KERNEL) | 1631 | if (dso->kernel == DSO_TYPE_KERNEL) |
| 1627 | ret = dso__load_kernel_sym(dso, map); | 1632 | ret = dso__load_kernel_sym(dso, map); |
| 1628 | else if (dso->kernel == DSO_TYPE_GUEST_KERNEL) | 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 | if (!name) | 1655 | if (!name) |
| 1651 | goto out; | 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 | * Read the build id if possible. This is required for | 1659 | * Read the build id if possible. This is required for |
| 1661 | * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work | 1660 | * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work |
| @@ -82,7 +82,7 @@ static struct pci_access *pci_acc; · 81 unmodified lines | |||
| 82 | static struct pci_dev *amd_fam14h_pci_dev; | 82 | static struct pci_dev *amd_fam14h_pci_dev; |
| 83 | static int nbp1_entered; | 83 | static int nbp1_entered; |
| 84 | 84 | ||
| 85 | struct timespec start_time; | 85 | static struct timespec start_time; |
| 86 | static unsigned long long timediff; | 86 | static unsigned long long timediff; |
| 87 | 87 | ||
| 88 | #ifdef DEBUG | 88 | #ifdef DEBUG |
| @@ -19,7 +19,7 @@ struct cpuidle_monitor cpuidle_sysfs_monitor; · 18 unmodified lines | |||
| 19 | 19 | ||
| 20 | static unsigned long long **previous_count; | 20 | static unsigned long long **previous_count; |
| 21 | static unsigned long long **current_count; | 21 | static unsigned long long **current_count; |
| 22 | struct timespec start_time; | 22 | static struct timespec start_time; |
| 23 | static unsigned long long timediff; | 23 | static unsigned long long timediff; |
| 24 | 24 | ||
| 25 | static int cpuidle_get_count_percent(unsigned int id, double *percent, | 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 | 0 | 27 | 0 |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | int cpu_count; | ||
| 31 | |||
| 30 | static struct cpuidle_monitor *monitors[MONITORS_MAX]; | 32 | static struct cpuidle_monitor *monitors[MONITORS_MAX]; |
| 31 | static unsigned int avail_monitors; | 33 | static unsigned int avail_monitors; |
| 32 | 34 | ||
| @@ -25,7 +25,7 @@ · 24 unmodified lines | |||
| 25 | #endif | 25 | #endif |
| 26 | #define CSTATE_DESC_LEN 60 | 26 | #define CSTATE_DESC_LEN 60 |
| 27 | 27 | ||
| 28 | int cpu_count; | 28 | extern int cpu_count; |
| 29 | 29 | ||
| 30 | /* Hard to define the right names ...: */ | 30 | /* Hard to define the right names ...: */ |
| 31 | enum power_range_e { | 31 | enum power_range_e { |
| @@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2 · 15 unmodified lines | |||
| 16 | 16 | ||
| 17 | %: %.c | 17 | %: %.c |
| 18 | @mkdir -p $(BUILD_OUTPUT) | 18 | @mkdir -p $(BUILD_OUTPUT) |
| 19 | $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) | 19 | $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap |
| 20 | 20 | ||
| 21 | .PHONY : clean | 21 | .PHONY : clean |
| 22 | clean : | 22 | clean : |
| @@ -30,7 +30,7 @@ · 29 unmodified lines | |||
| 30 | #include <sched.h> | 30 | #include <sched.h> |
| 31 | #include <time.h> | 31 | #include <time.h> |
| 32 | #include <cpuid.h> | 32 | #include <cpuid.h> |
| 33 | #include <linux/capability.h> | 33 | #include <sys/capability.h> |
| 34 | #include <errno.h> | 34 | #include <errno.h> |
| 35 | #include <math.h> | 35 | #include <math.h> |
| 36 | 36 | ||
| @@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */ · 267 unmodified lines | |||
| 304 | 304 | ||
| 305 | void setup_all_buffers(void); | 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 | int cpu_is_not_present(int cpu) | 311 | int cpu_is_not_present(int cpu) |
| 308 | { | 312 | { |
| 309 | return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set); | 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 | * record snapshot of | 2921 | * record snapshot of |
| 2918 | * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us | 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 | int snapshot_cpu_lpi_us(void) | 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 | * snapshot_sys_lpi() | 2944 | * snapshot_sys_lpi() |
| 2943 | * | 2945 | * |
| 2944 | * record snapshot of | 2946 | * record snapshot of sys_lpi_file |
| 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 | ||
| 2948 | */ | 2947 | */ |
| 2949 | int snapshot_sys_lpi_us(void) | 2948 | int snapshot_sys_lpi_us(void) |
| 2950 | { | 2949 | { |
| 2951 | FILE *fp; | 2950 | FILE *fp; |
| 2952 | int retval; | 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 | retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); | 2955 | retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); |
| 2957 | if (retval != 1) { | 2956 | if (retval != 1) { |
| @@ -3151,28 +3150,42 @@ void check_dev_msr() · 193 unmodified lines | |||
| 3151 | err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); | 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; | 3160 | cap_t caps; |
| 3157 | cap_user_header_t cap_header = &cap_header_data; | 3161 | cap_flag_value_t cap_flag_value; |
| 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]; | ||
| 3163 | 3162 | ||
| 3164 | /* check for CAP_SYS_RAWIO */ | 3163 | caps = cap_get_proc(); |
| 3165 | cap_header->pid = getpid(); | 3164 | if (caps == NULL) |
| 3166 | cap_header->version = _LINUX_CAPABILITY_VERSION; | 3165 | err(-6, "cap_get_proc\n"); |
| 3167 | if (capget(cap_header, cap_data) < 0) | ||
| 3168 | err(-6, "capget(2) failed"); | ||
| 3169 | 3166 | ||
| 3170 | if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) { | 3167 | if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value)) |
| 3171 | do_exit++; | 3168 | err(-6, "cap_get\n"); |
| 3169 | |||
| 3170 | if (cap_flag_value != CAP_SET) { | ||
| 3172 | warnx("capget(CAP_SYS_RAWIO) failed," | 3171 | warnx("capget(CAP_SYS_RAWIO) failed," |
| 3173 | " try \"# setcap cap_sys_rawio=ep %s\"", progname); | 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 | /* test file permissions */ | 3189 | /* test file permissions */ |
| 3177 | sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); | 3190 | sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); |
| 3178 | if (euidaccess(pathname, R_OK)) { | 3191 | if (euidaccess(pathname, R_OK)) { |
| @@ -3265,6 +3278,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) · 86 unmodified lines | |||
| 3265 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ | 3278 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 3266 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: | 3279 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 3267 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ | 3280 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ |
| 3281 | case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | ||
| 3268 | pkg_cstate_limits = glm_pkg_cstate_limits; | 3282 | pkg_cstate_limits = glm_pkg_cstate_limits; |
| 3269 | break; | 3283 | break; |
| 3270 | default: | 3284 | default: |
| @@ -3336,6 +3350,17 @@ int is_skx(unsigned int family, unsigned int model) · 65 unmodified lines | |||
| 3336 | } | 3350 | } |
| 3337 | return 0; | 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 | int has_turbo_ratio_limit(unsigned int family, unsigned int model) | 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 | dump_nhm_cst_cfg(); | 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 | static void | 3523 | static void |
| 3482 | dump_sysfs_cstate_config(void) | 3524 | dump_sysfs_cstate_config(void) |
| 3483 | { | 3525 | { |
| @@ -3491,6 +3533,15 @@ dump_sysfs_cstate_config(void) · 7 unmodified lines | |||
| 3491 | if (!DO_BIC(BIC_sysfs)) | 3533 | if (!DO_BIC(BIC_sysfs)) |
| 3492 | return; | 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 | for (state = 0; state < 10; ++state) { | 3545 | for (state = 0; state < 10; ++state) { |
| 3495 | 3546 | ||
| 3496 | sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", | 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 | else | 3945 | else |
| 3895 | BIC_PRESENT(BIC_PkgWatt); | 3946 | BIC_PRESENT(BIC_PkgWatt); |
| 3896 | break; | 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 | case INTEL_FAM6_SKYLAKE_L: /* SKL */ | 3962 | case INTEL_FAM6_SKYLAKE_L: /* SKL */ |
| 3898 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ | 3963 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ |
| 3899 | 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; | 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 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ | 4360 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 4296 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: | 4361 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 4297 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ | 4362 | case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ |
| 4363 | case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | ||
| 4298 | return 1; | 4364 | return 1; |
| 4299 | } | 4365 | } |
| 4300 | return 0; | 4366 | return 0; |
| @@ -4324,6 +4390,7 @@ int has_c8910_msrs(unsigned int family, unsigned int model) · 23 unmodified lines | |||
| 4324 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ | 4390 | case INTEL_FAM6_CANNONLAKE_L: /* CNL */ |
| 4325 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ | 4391 | case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ |
| 4326 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: | 4392 | case INTEL_FAM6_ATOM_GOLDMONT_PLUS: |
| 4393 | case INTEL_FAM6_ATOM_TREMONT: /* EHL */ | ||
| 4327 | return 1; | 4394 | return 1; |
| 4328 | } | 4395 | } |
| 4329 | return 0; | 4396 | return 0; |
| @@ -4610,14 +4677,24 @@ unsigned int intel_model_duplicates(unsigned int model) · 280 unmodified lines | |||
| 4610 | case INTEL_FAM6_SKYLAKE: | 4677 | case INTEL_FAM6_SKYLAKE: |
| 4611 | case INTEL_FAM6_KABYLAKE_L: | 4678 | case INTEL_FAM6_KABYLAKE_L: |
| 4612 | case INTEL_FAM6_KABYLAKE: | 4679 | case INTEL_FAM6_KABYLAKE: |
| 4680 | case INTEL_FAM6_COMETLAKE_L: | ||
| 4681 | case INTEL_FAM6_COMETLAKE: | ||
| 4613 | return INTEL_FAM6_SKYLAKE_L; | 4682 | return INTEL_FAM6_SKYLAKE_L; |
| 4614 | 4683 | ||
| 4615 | case INTEL_FAM6_ICELAKE_L: | 4684 | case INTEL_FAM6_ICELAKE_L: |
| 4616 | case INTEL_FAM6_ICELAKE_NNPI: | 4685 | case INTEL_FAM6_ICELAKE_NNPI: |
| 4686 | case INTEL_FAM6_TIGERLAKE_L: | ||
| 4687 | case INTEL_FAM6_TIGERLAKE: | ||
| 4617 | return INTEL_FAM6_CANNONLAKE_L; | 4688 | return INTEL_FAM6_CANNONLAKE_L; |
| 4618 | 4689 | ||
| 4619 | case INTEL_FAM6_ATOM_TREMONT_D: | 4690 | case INTEL_FAM6_ATOM_TREMONT_D: |
| 4620 | return INTEL_FAM6_ATOM_GOLDMONT_D; | 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 | return model; | 4699 | return model; |
| 4623 | } | 4700 | } |
| @@ -4872,7 +4949,8 @@ void process_cpuid() · 248 unmodified lines | |||
| 4872 | do_slm_cstates = is_slm(family, model); | 4949 | do_slm_cstates = is_slm(family, model); |
| 4873 | do_knl_cstates = is_knl(family, model); | 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 | BIC_NOT_PRESENT(BIC_CPU_c3); | 4954 | BIC_NOT_PRESENT(BIC_CPU_c3); |
| 4877 | 4955 | ||
| 4878 | if (!quiet) | 4956 | if (!quiet) |
| @@ -4907,10 +4985,16 @@ void process_cpuid() · 28 unmodified lines | |||
| 4907 | else | 4985 | else |
| 4908 | BIC_NOT_PRESENT(BIC_CPU_LPI); | 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 | BIC_PRESENT(BIC_SYS_LPI); | 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 | BIC_NOT_PRESENT(BIC_SYS_LPI); | 4996 | BIC_NOT_PRESENT(BIC_SYS_LPI); |
| 4997 | } | ||
| 4914 | 4998 | ||
| 4915 | if (!quiet) | 4999 | if (!quiet) |
| 4916 | decode_misc_feature_control(); | 5000 | decode_misc_feature_control(); |
| @@ -5306,7 +5390,7 @@ int get_and_dump_counters(void) · 389 unmodified lines | |||
| 5306 | } | 5390 | } |
| 5307 | 5391 | ||
| 5308 | void print_version() { | 5392 | void print_version() { |
| 5309 | fprintf(outf, "turbostat version 19.08.31" | 5393 | fprintf(outf, "turbostat version 20.03.20" |
| 5310 | " - Len Brown <lenb@kernel.org>\n"); | 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 | msrp->msr_num = msr_num; | 5409 | msrp->msr_num = msr_num; |
| 5326 | strncpy(msrp->name, name, NAME_BYTES); | 5410 | strncpy(msrp->name, name, NAME_BYTES - 1); |
| 5327 | if (path) | 5411 | if (path) |
| 5328 | strncpy(msrp->path, path, PATH_BYTES); | 5412 | strncpy(msrp->path, path, PATH_BYTES - 1); |
| 5329 | msrp->width = width; | 5413 | msrp->width = width; |
| 5330 | msrp->type = type; | 5414 | msrp->type = type; |
| 5331 | msrp->format = format; | 5415 | msrp->format = format; |
| @@ -30,7 +30,7 @@ my %default = ( · 29 unmodified lines | |||
| 30 | "EMAIL_WHEN_STARTED" => 0, | 30 | "EMAIL_WHEN_STARTED" => 0, |
| 31 | "NUM_TESTS" => 1, | 31 | "NUM_TESTS" => 1, |
| 32 | "TEST_TYPE" => "build", | 32 | "TEST_TYPE" => "build", |
| 33 | "BUILD_TYPE" => "randconfig", | 33 | "BUILD_TYPE" => "oldconfig", |
| 34 | "MAKE_CMD" => "make", | 34 | "MAKE_CMD" => "make", |
| 35 | "CLOSE_CONSOLE_SIGNAL" => "INT", | 35 | "CLOSE_CONSOLE_SIGNAL" => "INT", |
| 36 | "TIMEOUT" => 120, | 36 | "TIMEOUT" => 120, |
| @@ -1030,7 +1030,7 @@ sub __read_config { · 993 unmodified lines | |||
| 1030 | } | 1030 | } |
| 1031 | 1031 | ||
| 1032 | if (!$skip && $rest !~ /^\s*$/) { | 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 | if ($skip && $type eq "TEST_START") { | 1036 | if ($skip && $type eq "TEST_START") { |
| @@ -1063,7 +1063,7 @@ sub __read_config { · 26 unmodified lines | |||
| 1063 | } | 1063 | } |
| 1064 | 1064 | ||
| 1065 | if ($rest !~ /^\s*$/) { | 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 | } elsif (/^\s*INCLUDE\s+(\S+)/) { | 1069 | } elsif (/^\s*INCLUDE\s+(\S+)/) { |
| @@ -1154,7 +1154,7 @@ sub __read_config { · 84 unmodified lines | |||
| 1154 | # on of these sections that have SKIP defined. | 1154 | # on of these sections that have SKIP defined. |
| 1155 | # The save variable can be | 1155 | # The save variable can be |
| 1156 | # defined multiple times and the new one simply overrides | 1156 | # defined multiple times and the new one simply overrides |
| 1157 | # the prevous one. | 1157 | # the previous one. |
| 1158 | set_variable($lvalue, $rvalue); | 1158 | set_variable($lvalue, $rvalue); |
| 1159 | 1159 | ||
| 1160 | } else { | 1160 | } else { |
| @@ -1234,7 +1234,7 @@ sub read_config { · 73 unmodified lines | |||
| 1234 | foreach my $option (keys %not_used) { | 1234 | foreach my $option (keys %not_used) { |
| 1235 | print "$option\n"; | 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 | if (!read_yn "Do you want to continue?") { | 1238 | if (!read_yn "Do you want to continue?") { |
| 1239 | exit -1; | 1239 | exit -1; |
| 1240 | } | 1240 | } |
| @@ -1345,7 +1345,7 @@ sub eval_option { · 104 unmodified lines | |||
| 1345 | # Check for recursive evaluations. | 1345 | # Check for recursive evaluations. |
| 1346 | # 100 deep should be more than enough. | 1346 | # 100 deep should be more than enough. |
| 1347 | if ($r++ > 100) { | 1347 | if ($r++ > 100) { |
| 1348 | die "Over 100 evaluations accurred with $option\n" . | 1348 | die "Over 100 evaluations occurred with $option\n" . |
| 1349 | "Check for recursive variables\n"; | 1349 | "Check for recursive variables\n"; |
| 1350 | } | 1350 | } |
| 1351 | $prev = $option; | 1351 | $prev = $option; |
| @@ -1383,7 +1383,7 @@ sub reboot { · 31 unmodified lines | |||
| 1383 | 1383 | ||
| 1384 | } else { | 1384 | } else { |
| 1385 | # Make sure everything has been written to disk | 1385 | # Make sure everything has been written to disk |
| 1386 | run_ssh("sync"); | 1386 | run_ssh("sync", 10); |
| 1387 | 1387 | ||
| 1388 | if (defined($time)) { | 1388 | if (defined($time)) { |
| 1389 | start_monitor; | 1389 | start_monitor; |
| @@ -1461,7 +1461,7 @@ sub get_test_name() { · 71 unmodified lines | |||
| 1461 | 1461 | ||
| 1462 | sub dodie { | 1462 | sub dodie { |
| 1463 | 1463 | ||
| 1464 | # avoid recusion | 1464 | # avoid recursion |
| 1465 | return if ($in_die); | 1465 | return if ($in_die); |
| 1466 | $in_die = 1; | 1466 | $in_die = 1; |
| 1467 | 1467 | ||
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | # | 10 | # |
| 11 | 11 | ||
| 12 | # Options set in the beginning of the file are considered to be | 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 | # options, with the following exceptions: | 14 | # options, with the following exceptions: |
| 15 | # | 15 | # |
| 16 | # LOG_FILE | 16 | # LOG_FILE |
| @@ -204,7 +204,7 @@ · 187 unmodified lines | |||
| 204 | # | 204 | # |
| 205 | # This config file can also contain "config variables". | 205 | # This config file can also contain "config variables". |
| 206 | # These are assigned with ":=" instead of the ktest option | 206 | # These are assigned with ":=" instead of the ktest option |
| 207 | # assigment "=". | 207 | # assignment "=". |
| 208 | # | 208 | # |
| 209 | # The difference between ktest options and config variables | 209 | # The difference between ktest options and config variables |
| 210 | # is that config variables can be used multiple times, | 210 | # is that config variables can be used multiple times, |
| @@ -263,7 +263,7 @@ · 52 unmodified lines | |||
| 263 | #### Using options in other options #### | 263 | #### Using options in other options #### |
| 264 | # | 264 | # |
| 265 | # Options that are defined in the config file may also be used | 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 | # use (except that config variables are evaluated at config | 267 | # use (except that config variables are evaluated at config |
| 268 | # processing time). | 268 | # processing time). |
| 269 | # | 269 | # |
| @@ -505,7 +505,7 @@ · 235 unmodified lines | |||
| 505 | #TEST = ssh user@machine /root/run_test | 505 | #TEST = ssh user@machine /root/run_test |
| 506 | 506 | ||
| 507 | # The build type is any make config type or special command | 507 | # The build type is any make config type or special command |
| 508 | # (default randconfig) | 508 | # (default oldconfig) |
| 509 | # nobuild - skip the clean and build step | 509 | # nobuild - skip the clean and build step |
| 510 | # useconfig:/path/to/config - use the given config and run | 510 | # useconfig:/path/to/config - use the given config and run |
| 511 | # oldconfig on it. | 511 | # oldconfig on it. |
| @@ -707,7 +707,7 @@ · 195 unmodified lines | |||
| 707 | 707 | ||
| 708 | # Line to define a successful boot up in console output. | 708 | # Line to define a successful boot up in console output. |
| 709 | # This is what the line contains, not the entire line. If you need | 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 | # (do not add any quotes around it) | 711 | # (do not add any quotes around it) |
| 712 | # | 712 | # |
| 713 | # SUCCESS_LINE = ^MyBox Login:$ | 713 | # SUCCESS_LINE = ^MyBox Login:$ |
| @@ -839,7 +839,7 @@ · 125 unmodified lines | |||
| 839 | # (ignored if POWEROFF_ON_SUCCESS is set) | 839 | # (ignored if POWEROFF_ON_SUCCESS is set) |
| 840 | #REBOOT_ON_SUCCESS = 1 | 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 | # to always powercycle after this amount of time after calling | 843 | # to always powercycle after this amount of time after calling |
| 844 | # reboot. | 844 | # reboot. |
| 845 | # Note, POWERCYCLE_AFTER_REBOOT = 0 does NOT disable it. It just | 845 | # Note, POWERCYCLE_AFTER_REBOOT = 0 does NOT disable it. It just |
| @@ -848,7 +848,7 @@ · 2 unmodified lines | |||
| 848 | # (default undefined) | 848 | # (default undefined) |
| 849 | #POWERCYCLE_AFTER_REBOOT = 5 | 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 | # to always poweroff after this amount of time after calling | 852 | # to always poweroff after this amount of time after calling |
| 853 | # halt. | 853 | # halt. |
| 854 | # Note, POWEROFF_AFTER_HALT = 0 does NOT disable it. It just | 854 | # Note, POWEROFF_AFTER_HALT = 0 does NOT disable it. It just |
| @@ -972,7 +972,7 @@ · 117 unmodified lines | |||
| 972 | # | 972 | # |
| 973 | # PATCHCHECK_START is required and is the first patch to | 973 | # PATCHCHECK_START is required and is the first patch to |
| 974 | # test (the SHA1 of the commit). You may also specify anything | 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 | # PATCHCHECK_END is the last patch to check (default HEAD) | 977 | # PATCHCHECK_END is the last patch to check (default HEAD) |
| 978 | # | 978 | # |
| @@ -994,7 +994,7 @@ · 15 unmodified lines | |||
| 994 | # IGNORE_WARNINGS is set for the given commit's sha1 | 994 | # IGNORE_WARNINGS is set for the given commit's sha1 |
| 995 | # | 995 | # |
| 996 | # IGNORE_WARNINGS can be used to disable the failure of patchcheck | 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 | # by adding a list of SHA1s that are space delimited. | 998 | # by adding a list of SHA1s that are space delimited. |
| 999 | # | 999 | # |
| 1000 | # If BUILD_NOCLEAN is set, then make mrproper will not be run on | 1000 | # If BUILD_NOCLEAN is set, then make mrproper will not be run on |
| @@ -1093,7 +1093,7 @@ · 92 unmodified lines | |||
| 1093 | # whatever reason. (Can't reboot, want to inspect each iteration) | 1093 | # whatever reason. (Can't reboot, want to inspect each iteration) |
| 1094 | # Doing a BISECT_MANUAL will have the test wait for you to | 1094 | # Doing a BISECT_MANUAL will have the test wait for you to |
| 1095 | # tell it if the test passed or failed after each iteration. | 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 | # but ktest will rebuild and install the kernel for you. | 1097 | # but ktest will rebuild and install the kernel for you. |
| 1098 | # | 1098 | # |
| 1099 | # BISECT_CHECK = 1 (optional, default 0) | 1099 | # BISECT_CHECK = 1 (optional, default 0) |
| @@ -1239,7 +1239,7 @@ · 139 unmodified lines | |||
| 1239 | # | 1239 | # |
| 1240 | # CONFIG_BISECT_EXEC (optional) | 1240 | # CONFIG_BISECT_EXEC (optional) |
| 1241 | # The config bisect is a separate program that comes with ktest.pl. | 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 | # `pwd`/config-bisect.pl # the location ktest.pl was executed from. | 1243 | # `pwd`/config-bisect.pl # the location ktest.pl was executed from. |
| 1244 | # If it does not find it there, it will look for: | 1244 | # If it does not find it there, it will look for: |
| 1245 | # `dirname <ktest.pl>`/config-bisect.pl # The directory that holds ktest.pl | 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 | fi | 1041 | fi |
| 1042 | log_test $rc 0 "Prefix route with metric on link up" | 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 | $IP li del dummy1 | 1065 | $IP li del dummy1 |
| 1045 | $IP li del dummy2 | 1066 | $IP li del dummy2 |
| 1046 | cleanup | 1067 | cleanup |
| @@ -1457,13 +1478,20 @@ ipv4_addr_metric_test() · 410 unmodified lines | |||
| 1457 | 1478 | ||
| 1458 | run_cmd "$IP addr flush dev dummy2" | 1479 | run_cmd "$IP addr flush dev dummy2" |
| 1459 | run_cmd "$IP addr add dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 260" | 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 | rc=$? | 1481 | rc=$? |
| 1462 | if [ $rc -eq 0 ]; then | 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 | rc=$? | 1492 | rc=$? |
| 1465 | fi | 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 | $IP li del dummy1 | 1496 | $IP li del dummy1 |
| 1469 | $IP li del dummy2 | 1497 | $IP li del dummy2 |
| @@ -57,3 +57,4 @@ CONFIG_NET_IFE_SKBMARK=m · 56 unmodified lines | |||
| 57 | CONFIG_NET_IFE_SKBPRIO=m | 57 | CONFIG_NET_IFE_SKBPRIO=m |
| 58 | CONFIG_NET_IFE_SKBTCINDEX=m | 58 | CONFIG_NET_IFE_SKBTCINDEX=m |
| 59 | CONFIG_NET_SCH_FIFO=y | 59 | CONFIG_NET_SCH_FIFO=y |
| 60 | CONFIG_NET_SCH_ETS=m | ||
| @@ -124,17 +124,6 @@ choice · 123 unmodified lines | |||
| 124 | 124 | ||
| 125 | If in doubt, select 'None' | 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 | config INITRAMFS_COMPRESSION_GZIP | 127 | config INITRAMFS_COMPRESSION_GZIP |
| 139 | bool "Gzip" | 128 | bool "Gzip" |
| 140 | depends on RD_GZIP | 129 | depends on RD_GZIP |
| @@ -207,4 +196,15 @@ config INITRAMFS_COMPRESSION_LZ4 · 66 unmodified lines | |||
| 207 | If you choose this, keep in mind that most distros don't provide lz4 | 196 | If you choose this, keep in mind that most distros don't provide lz4 |
| 208 | by default which could cause a build failure. | 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 | endchoice | 210 | endchoice |