linux/drivers/gpu/drm/radeon
Michal Hocko 93065ac753 mm, oom: distinguish blockable mode for mmu notifiers
There are several blockable mmu notifiers which might sleep in
mmu_notifier_invalidate_range_start and that is a problem for the
oom_reaper because it needs to guarantee a forward progress so it cannot
depend on any sleepable locks.

Currently we simply back off and mark an oom victim with blockable mmu
notifiers as done after a short sleep.  That can result in selecting a new
oom victim prematurely because the previous one still hasn't torn its
memory down yet.

We can do much better though.  Even if mmu notifiers use sleepable locks
there is no reason to automatically assume those locks are held.  Moreover
majority of notifiers only care about a portion of the address space and
there is absolutely zero reason to fail when we are unmapping an unrelated
range.  Many notifiers do really block and wait for HW which is harder to
handle and we have to bail out though.

This patch handles the low hanging fruit.
__mmu_notifier_invalidate_range_start gets a blockable flag and callbacks
are not allowed to sleep if the flag is set to false.  This is achieved by
using trylock instead of the sleepable lock for most callbacks and
continue as long as we do not block down the call chain.

I think we can improve that even further because there is a common pattern
to do a range lookup first and then do something about that.  The first
part can be done without a sleeping lock in most cases AFAICS.

The oom_reaper end then simply retries if there is at least one notifier
which couldn't make any progress in !blockable mode.  A retry loop is
already implemented to wait for the mmap_sem and this is basically the
same thing.

The simplest way for driver developers to test this code path is to wrap
userspace code which uses these notifiers into a memcg and set the hard
limit to hit the oom.  This can be done e.g.  after the test faults in all
the mmu notifier managed memory and set the hard limit to something really
small.  Then we are looking for a proper process tear down.

[akpm@linux-foundation.org: coding style fixes]
[akpm@linux-foundation.org: minor code simplification]
Link: http://lkml.kernel.org/r/20180716115058.5559-1-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Christian König <christian.koenig@amd.com> # AMD notifiers
Acked-by: Leon Romanovsky <leonro@mellanox.com> # mlx and umem_odp
Reported-by: David Rientjes <rientjes@google.com>
Cc: "David (ChunMing) Zhou" <David1.Zhou@amd.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Doug Ledford <dledford@redhat.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Mike Marciniszyn <mike.marciniszyn@intel.com>
Cc: Dennis Dalessandro <dennis.dalessandro@intel.com>
Cc: Sudeep Dutt <sudeep.dutt@intel.com>
Cc: Ashutosh Dixit <ashutosh.dixit@intel.com>
Cc: Dimitri Sivanich <sivanich@sgi.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2018-08-22 10:52:44 -07:00
..
reg_srcs
.gitignore
Kconfig
Makefile
ObjectID.h
atom-bits.h
atom-names.h
atom-types.h
atom.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
atom.h
atombios.h
atombios_crtc.c drm/radeon: radeon_framebuffer -> drm_framebuffer 2018-04-11 13:07:56 -05:00
atombios_dp.c
atombios_encoders.c
atombios_i2c.c
avivod.h
btc_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
btc_dpm.h
btcd.h
cayman_blit_shaders.c
cayman_blit_shaders.h
ci_dpm.c drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
ci_dpm.h
ci_smc.c
cik.c drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
cik_blit_shaders.c
cik_blit_shaders.h
cik_reg.h drm/radeon: Remove KFD_CIK_SDMA_QUEUE_OFFSET 2017-12-20 12:00:22 -05:00
cik_sdma.c
cikd.h
clearstate_cayman.h
clearstate_ci.h
clearstate_defs.h
clearstate_evergreen.h
clearstate_si.h
cypress_dpm.c
cypress_dpm.h
dce3_1_afmt.c
dce6_afmt.c
evergreen.c drm/radeon: fill in rb backend map on evergreen/ni. 2018-01-16 15:35:28 -05:00
evergreen_blit_shaders.c
evergreen_blit_shaders.h
evergreen_cs.c
evergreen_dma.c
evergreen_hdmi.c
evergreen_reg.h
evergreen_smc.h
evergreend.h
kv_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
kv_dpm.h
kv_smc.c
mkregtable.c drm/radeon/mkregtable: Delete unused list functions and macros 2018-03-05 13:31:11 -05:00
ni.c drm/radeon: fill in rb backend map on evergreen/ni. 2018-01-16 15:35:28 -05:00
ni_dma.c
ni_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
ni_dpm.h
ni_reg.h
nid.h
nislands_smc.h
ppsmc.h
pptable.h
r100.c
r100_track.h
r100d.h
r200.c
r300.c
r300_reg.h
r300d.h
r420.c
r420d.h
r500_reg.h
r520.c
r520d.h
r600.c
r600_blit_shaders.c
r600_blit_shaders.h
r600_cs.c
r600_dma.c
r600_dpm.c drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
r600_dpm.h
r600_hdmi.c
r600_reg.h
r600d.h
radeon.h drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
radeon_acpi.c
radeon_acpi.h
radeon_agp.c
radeon_asic.c
radeon_asic.h
radeon_atombios.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
radeon_atpx_handler.c drm/radeon: fix radeon_atpx_get_client_id()'s return type 2018-05-15 13:43:51 -05:00
radeon_audio.c
radeon_audio.h
radeon_benchmark.c
radeon_bios.c
radeon_clocks.c
radeon_combios.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
radeon_connectors.c drm: drop _mode_ from update_edit_property() 2018-07-13 18:40:27 +02:00
radeon_cs.c
radeon_cursor.c
radeon_device.c drm/radeon: add PX quirk for Asus K73TK 2018-05-15 13:43:02 -05:00
radeon_display.c drm/radeon: radeon_framebuffer -> drm_framebuffer 2018-04-11 13:07:56 -05:00
radeon_dp_auxch.c
radeon_dp_mst.c drm: drop _mode_ from remaining connector functions 2018-07-13 18:40:27 +02:00
radeon_drv.c drm/radeon: Change the default to PCI on PowerPC 2018-05-15 13:43:52 -05:00
radeon_drv.h
radeon_encoders.c drm: drop _mode_ from drm_mode_connector_attach_encoder 2018-07-13 18:40:27 +02:00
radeon_family.h
radeon_fb.c drm/radeon: radeon_framebuffer -> drm_framebuffer 2018-04-11 13:07:56 -05:00
radeon_fence.c
radeon_gart.c treewide: Use array_size() in vzalloc() 2018-06-12 16:19:22 -07:00
radeon_gem.c drm/radeon: fix prime teardown order 2018-03-14 15:39:42 -05:00
radeon_i2c.c
radeon_ib.c
radeon_irq_kms.c
radeon_kms.c drm/radeon: Use drm_fb_helper_lastclose() and _poll_changed() 2017-12-06 12:48:34 -05:00
radeon_legacy_crtc.c drm/radeon: radeon_framebuffer -> drm_framebuffer 2018-04-11 13:07:56 -05:00
radeon_legacy_encoders.c
radeon_legacy_tv.c
radeon_mn.c mm, oom: distinguish blockable mode for mmu notifiers 2018-08-22 10:52:44 -07:00
radeon_mode.h drm/radeon: radeon_framebuffer -> drm_framebuffer 2018-04-11 13:07:56 -05:00
radeon_object.c drm/radeon: Replace ttm_bo_unref with ttm_bo_put 2018-07-31 16:58:22 -05:00
radeon_object.h
radeon_pm.c Revert "drm/radeon/pm: autoswitch power state when in balanced mode" 2018-02-20 16:27:16 -05:00
radeon_prime.c
radeon_reg.h
radeon_ring.c
radeon_sa.c
radeon_semaphore.c
radeon_sync.c
radeon_test.c drm/radeon: add SPDX identifier and clarify license 2018-07-05 16:39:54 -05:00
radeon_trace.h
radeon_trace_points.c
radeon_ttm.c gpu: drm: radeon: Adding new typedef vm_fault_t 2018-06-19 13:17:38 -05:00
radeon_ucode.c
radeon_ucode.h
radeon_uvd.c drm/radeon: adjust tested variable 2018-01-29 23:18:17 -05:00
radeon_vce.c
radeon_vm.c drm/ttm: add operation ctx to ttm_bo_validate v2 2017-12-06 12:48:01 -05:00
rs100d.h
rs400.c
rs400d.h
rs600.c
rs600d.h
rs690.c
rs690d.h
rs780_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
rs780_dpm.h
rs780d.h
rv6xx_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
rv6xx_dpm.h
rv6xxd.h
rv200d.h
rv250d.h
rv350d.h
rv515.c
rv515d.h
rv730_dpm.c
rv730d.h
rv740_dpm.c
rv740d.h
rv770.c
rv770_dma.c
rv770_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
rv770_dpm.h
rv770_smc.c
rv770_smc.h
rv770d.h
si.c drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
si_blit_shaders.c
si_blit_shaders.h
si_dma.c
si_dpm.c drm/radeon: use pcie functions for link width 2018-07-05 16:40:00 -05:00
si_dpm.h
si_reg.h
si_smc.c
sid.h
sislands_smc.h
smu7.h
smu7_discrete.h
smu7_fusion.h
sumo_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
sumo_dpm.h
sumo_smc.c
sumod.h
trinity_dpm.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
trinity_dpm.h
trinity_smc.c
trinityd.h
uvd_v1_0.c
uvd_v2_2.c
uvd_v3_1.c
uvd_v4_2.c
vce_v1_0.c
vce_v2_0.c