From 10781bf34cff4c395adb35bb689e9097fd95e4bd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 17 Sep 2014 14:29:19 -0700 Subject: [PATCH] 3.16-stable patches added patches: drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch drm-radeon-re-enable-dpm-by-default-on-btc.patch drm-radeon-re-enable-dpm-by-default-on-cayman.patch drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch drm-radeon-tweak-accel_working2-query-for-hawaii.patch drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch --- ...ew-voltage-fetch-function-for-hawaii.patch | 76 +++++++++ ...ndle-voltage-info-fetching-on-hawaii.patch | 44 +++++ ...lm63-driver-for-an-lm64-thermal-chip.patch | 38 +++++ ...deon-re-enable-dpm-by-default-on-btc.patch | 46 ++++++ ...n-re-enable-dpm-by-default-on-cayman.patch | 41 +++++ ...on-set-vm-base-addr-using-the-pfp-v2.patch | 62 +++++++ ...weak-accel_working2-query-for-hawaii.patch | 42 +++++ ...orrectly-in-ttm_dma_pool_shrink_scan.patch | 45 +++++ ...ion-by-0-in-ttm_dma_pool_shrink_scan.patch | 40 +++++ ...overflow-by-recursive-shrinker-calls.patch | 64 ++++++++ ...gfp-flags-in-order-to-avoid-deadlock.patch | 154 ++++++++++++++++++ ...d-deadlock-inside-shrinker-functions.patch | 52 ++++++ queue-3.16/series | 12 ++ 13 files changed, 716 insertions(+) create mode 100644 queue-3.16/drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch create mode 100644 queue-3.16/drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch create mode 100644 queue-3.16/drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch create mode 100644 queue-3.16/drm-radeon-re-enable-dpm-by-default-on-btc.patch create mode 100644 queue-3.16/drm-radeon-re-enable-dpm-by-default-on-cayman.patch create mode 100644 queue-3.16/drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch create mode 100644 queue-3.16/drm-radeon-tweak-accel_working2-query-for-hawaii.patch create mode 100644 queue-3.16/drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch create mode 100644 queue-3.16/drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch create mode 100644 queue-3.16/drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch create mode 100644 queue-3.16/drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch create mode 100644 queue-3.16/drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch diff --git a/queue-3.16/drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch b/queue-3.16/drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch new file mode 100644 index 00000000000..d99508680d8 --- /dev/null +++ b/queue-3.16/drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch @@ -0,0 +1,76 @@ +From e9f274b2a1bd4ecc569b823b1e7942e9bf92593e Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 31 Jul 2014 17:57:42 -0400 +Subject: drm/radeon/atom: add new voltage fetch function for hawaii + +From: Alex Deucher + +commit e9f274b2a1bd4ecc569b823b1e7942e9bf92593e upstream. + +Some hawaii boards use a different method for fetching the +voltage information from the vbios. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon.h | 3 ++ + drivers/gpu/drm/radeon/radeon_atombios.c | 35 +++++++++++++++++++++++++++++++ + 2 files changed, 38 insertions(+) + +--- a/drivers/gpu/drm/radeon/radeon.h ++++ b/drivers/gpu/drm/radeon/radeon.h +@@ -304,6 +304,9 @@ int radeon_atom_get_leakage_vddc_based_o + u16 *vddc, u16 *vddci, + u16 virtual_voltage_id, + u16 vbios_voltage_id); ++int radeon_atom_get_voltage_evv(struct radeon_device *rdev, ++ u16 virtual_voltage_id, ++ u16 *voltage); + int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, + u8 voltage_type, + u16 nominal_voltage, +--- a/drivers/gpu/drm/radeon/radeon_atombios.c ++++ b/drivers/gpu/drm/radeon/radeon_atombios.c +@@ -3236,6 +3236,41 @@ int radeon_atom_get_leakage_vddc_based_o + return 0; + } + ++union get_voltage_info { ++ struct _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_2 in; ++ struct _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2 evv_out; ++}; ++ ++int radeon_atom_get_voltage_evv(struct radeon_device *rdev, ++ u16 virtual_voltage_id, ++ u16 *voltage) ++{ ++ int index = GetIndexIntoMasterTable(COMMAND, GetVoltageInfo); ++ u32 entry_id; ++ u32 count = rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; ++ union get_voltage_info args; ++ ++ for (entry_id = 0; entry_id < count; entry_id++) { ++ if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].v == ++ virtual_voltage_id) ++ break; ++ } ++ ++ if (entry_id >= count) ++ return -EINVAL; ++ ++ args.in.ucVoltageType = VOLTAGE_TYPE_VDDC; ++ args.in.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE; ++ args.in.ulSCLKFreq = ++ cpu_to_le32(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].clk); ++ ++ atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); ++ ++ *voltage = le16_to_cpu(args.evv_out.usVoltageLevel); ++ ++ return 0; ++} ++ + int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, + u16 voltage_level, u8 voltage_type, + u32 *gpio_value, u32 *gpio_mask) diff --git a/queue-3.16/drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch b/queue-3.16/drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch new file mode 100644 index 00000000000..334b0342428 --- /dev/null +++ b/queue-3.16/drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch @@ -0,0 +1,44 @@ +From 6b57f20cb5b708415fbab63847f8f8429b051af8 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Thu, 31 Jul 2014 18:07:17 -0400 +Subject: drm/radeon/dpm: handle voltage info fetching on hawaii + +From: Alex Deucher + +commit 6b57f20cb5b708415fbab63847f8f8429b051af8 upstream. + +Some hawaii cards use a different method to fetch the +voltage info from the vbios. + +bug: +https://bugs.freedesktop.org/show_bug.cgi?id=74250 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/ci_dpm.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/ci_dpm.c ++++ b/drivers/gpu/drm/radeon/ci_dpm.c +@@ -940,7 +940,18 @@ static void ci_get_leakage_voltages(stru + pi->vddc_leakage.count = 0; + pi->vddci_leakage.count = 0; + +- if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) { ++ if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) { ++ for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) { ++ virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i; ++ if (radeon_atom_get_voltage_evv(rdev, virtual_voltage_id, &vddc) != 0) ++ continue; ++ if (vddc != 0 && vddc != virtual_voltage_id) { ++ pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc; ++ pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id; ++ pi->vddc_leakage.count++; ++ } ++ } ++ } else if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) { + for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) { + virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i; + if (radeon_atom_get_leakage_vddc_based_on_leakage_params(rdev, &vddc, &vddci, diff --git a/queue-3.16/drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch b/queue-3.16/drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch new file mode 100644 index 00000000000..bb00a8c7d6a --- /dev/null +++ b/queue-3.16/drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch @@ -0,0 +1,38 @@ +From 5dc355325b648dc9b4cf3bea4d968de46fd59215 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Sun, 27 Jul 2014 23:21:50 -0400 +Subject: drm/radeon: load the lm63 driver for an lm64 thermal chip. + +From: Alex Deucher + +commit 5dc355325b648dc9b4cf3bea4d968de46fd59215 upstream. + +Looks like the lm63 driver supports the lm64 as well. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_atombios.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/radeon/radeon_atombios.c ++++ b/drivers/gpu/drm/radeon/radeon_atombios.c +@@ -1963,7 +1963,7 @@ static const char *thermal_controller_na + "adm1032", + "adm1030", + "max6649", +- "lm64", ++ "lm63", /* lm64 */ + "f75375", + "asc7xxx", + }; +@@ -1974,7 +1974,7 @@ static const char *pp_lib_thermal_contro + "adm1032", + "adm1030", + "max6649", +- "lm64", ++ "lm63", /* lm64 */ + "f75375", + "RV6xx", + "RV770", diff --git a/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-btc.patch b/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-btc.patch new file mode 100644 index 00000000000..374855f4fc6 --- /dev/null +++ b/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-btc.patch @@ -0,0 +1,46 @@ +From c08abf11900e19b14dd3a0cc3d105bd74519cd18 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 14 Jul 2014 12:01:40 -0400 +Subject: drm/radeon: re-enable dpm by default on BTC + +From: Alex Deucher + +commit c08abf11900e19b14dd3a0cc3d105bd74519cd18 upstream. + +This patch depends on: +e07929810f0a19ddd756558290c7d72827cbfcd9 +(drm/radeon/dpm: fix typo in vddci setup for eg/btc) + +bugs: +https://bugs.freedesktop.org/show_bug.cgi?id=73053 +https://bugzilla.kernel.org/show_bug.cgi?id=68571 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_pm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/radeon/radeon_pm.c ++++ b/drivers/gpu/drm/radeon/radeon_pm.c +@@ -1303,9 +1303,6 @@ int radeon_pm_init(struct radeon_device + case CHIP_RS780: + case CHIP_RS880: + case CHIP_RV770: +- case CHIP_BARTS: +- case CHIP_TURKS: +- case CHIP_CAICOS: + /* DPM requires the RLC, RV770+ dGPU requires SMC */ + if (!rdev->rlc_fw) + rdev->pm.pm_method = PM_METHOD_PROFILE; +@@ -1329,6 +1326,9 @@ int radeon_pm_init(struct radeon_device + case CHIP_PALM: + case CHIP_SUMO: + case CHIP_SUMO2: ++ case CHIP_BARTS: ++ case CHIP_TURKS: ++ case CHIP_CAICOS: + case CHIP_CAYMAN: + case CHIP_ARUBA: + case CHIP_TAHITI: diff --git a/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-cayman.patch b/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-cayman.patch new file mode 100644 index 00000000000..ef60265a50c --- /dev/null +++ b/queue-3.16/drm-radeon-re-enable-dpm-by-default-on-cayman.patch @@ -0,0 +1,41 @@ +From 8f500af4efe347d1a8ac674d115220e8caa84559 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 7 Jul 2014 17:13:37 -0400 +Subject: drm/radeon: re-enable dpm by default on cayman + +From: Alex Deucher + +commit 8f500af4efe347d1a8ac674d115220e8caa84559 upstream. + +This patch depends on: +b0880e87c1fd038b84498944f52e52c3e86ebe59 +(drm/radeon/dpm: fix vddci setup typo on cayman) + +bug: +https://bugs.freedesktop.org/show_bug.cgi?id=69723 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_pm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/radeon_pm.c ++++ b/drivers/gpu/drm/radeon/radeon_pm.c +@@ -1306,7 +1306,6 @@ int radeon_pm_init(struct radeon_device + case CHIP_BARTS: + case CHIP_TURKS: + case CHIP_CAICOS: +- case CHIP_CAYMAN: + /* DPM requires the RLC, RV770+ dGPU requires SMC */ + if (!rdev->rlc_fw) + rdev->pm.pm_method = PM_METHOD_PROFILE; +@@ -1330,6 +1329,7 @@ int radeon_pm_init(struct radeon_device + case CHIP_PALM: + case CHIP_SUMO: + case CHIP_SUMO2: ++ case CHIP_CAYMAN: + case CHIP_ARUBA: + case CHIP_TAHITI: + case CHIP_PITCAIRN: diff --git a/queue-3.16/drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch b/queue-3.16/drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch new file mode 100644 index 00000000000..1d867e4fa6f --- /dev/null +++ b/queue-3.16/drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch @@ -0,0 +1,62 @@ +From f1d2a26b506e9dc7bbe94fae40da0a0d8dcfacd0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= +Date: Wed, 30 Jul 2014 17:18:12 +0200 +Subject: drm/radeon: set VM base addr using the PFP v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: =?UTF-8?q?Christian=20K=C3=B6nig?= + +commit f1d2a26b506e9dc7bbe94fae40da0a0d8dcfacd0 upstream. + +Seems to make VM flushes more stable on SI and CIK. + +v2: only use the PFP on the GFX ring on CIK + +Signed-off-by: Christian König +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/cik.c | 5 +++-- + drivers/gpu/drm/radeon/si.c | 2 +- + 2 files changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -5643,12 +5643,13 @@ static void cik_vm_decode_fault(struct r + void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) + { + struct radeon_ring *ring = &rdev->ring[ridx]; ++ int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX); + + if (vm == NULL) + return; + + radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +- radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | ++ radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | + WRITE_DATA_DST_SEL(0))); + if (vm->id < 8) { + radeon_ring_write(ring, +@@ -5698,7 +5699,7 @@ void cik_vm_flush(struct radeon_device * + radeon_ring_write(ring, 1 << vm->id); + + /* compute doesn't have PFP */ +- if (ridx == RADEON_RING_TYPE_GFX_INDEX) { ++ if (usepfp) { + /* sync PFP to ME, otherwise we might get invalid PFP reads */ + radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); + radeon_ring_write(ring, 0x0); +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -4815,7 +4815,7 @@ void si_vm_flush(struct radeon_device *r + + /* write new base address */ + radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +- radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | ++ radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) | + WRITE_DATA_DST_SEL(0))); + + if (vm->id < 8) { diff --git a/queue-3.16/drm-radeon-tweak-accel_working2-query-for-hawaii.patch b/queue-3.16/drm-radeon-tweak-accel_working2-query-for-hawaii.patch new file mode 100644 index 00000000000..1e81cb0f02a --- /dev/null +++ b/queue-3.16/drm-radeon-tweak-accel_working2-query-for-hawaii.patch @@ -0,0 +1,42 @@ +From 3c64bd26f7e9bd589ebe0d1ebec69ef2f784c12d Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Fri, 1 Aug 2014 20:05:30 +0200 +Subject: drm/radeon: tweak ACCEL_WORKING2 query for hawaii + +From: Alex Deucher + +commit 3c64bd26f7e9bd589ebe0d1ebec69ef2f784c12d upstream. + +Return 2 so we can be sure the kernel has the necessary +changes for acceleration to work. + +Note: This patch depends on these two commits: + - drm/radeon: fix cut and paste issue for hawaii. + - drm/radeon: use packet2 for nop on hawaii with old firmware + +Signed-off-by: Alex Deucher +Signed-off-by: Andreas Boll +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/radeon_kms.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/radeon/radeon_kms.c ++++ b/drivers/gpu/drm/radeon/radeon_kms.c +@@ -254,7 +254,14 @@ static int radeon_info_ioctl(struct drm_ + } + break; + case RADEON_INFO_ACCEL_WORKING2: +- *value = rdev->accel_working; ++ if (rdev->family == CHIP_HAWAII) { ++ if (rdev->accel_working) ++ *value = 2; ++ else ++ *value = 0; ++ } else { ++ *value = rdev->accel_working; ++ } + break; + case RADEON_INFO_TILING_CONFIG: + if (rdev->family >= CHIP_BONAIRE) diff --git a/queue-3.16/drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch b/queue-3.16/drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch new file mode 100644 index 00000000000..ff77b34a93f --- /dev/null +++ b/queue-3.16/drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch @@ -0,0 +1,45 @@ +From 46c2df68f03a236b30808bba361f10900c88d95e Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Sun, 3 Aug 2014 20:00:40 +0900 +Subject: drm/ttm: Choose a pool to shrink correctly in ttm_dma_pool_shrink_scan(). + +From: Tetsuo Handa + +commit 46c2df68f03a236b30808bba361f10900c88d95e upstream. + +We can use "unsigned int" instead of "atomic_t" by updating start_pool +variable under _manager->lock. This patch will make it possible to avoid +skipping when choosing a pool to shrink in round-robin style, after next +patch changes mutex_lock(_manager->lock) to !mutex_trylock(_manager->lork). + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -1004,9 +1004,9 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); + static unsigned long + ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + { +- static atomic_t start_pool = ATOMIC_INIT(0); ++ static unsigned start_pool; + unsigned idx = 0; +- unsigned pool_offset = atomic_add_return(1, &start_pool); ++ unsigned pool_offset; + unsigned shrink_pages = sc->nr_to_scan; + struct device_pools *p; + unsigned long freed = 0; +@@ -1017,7 +1017,7 @@ ttm_dma_pool_shrink_scan(struct shrinker + mutex_lock(&_manager->lock); + if (!_manager->npools) + goto out; +- pool_offset = pool_offset % _manager->npools; ++ pool_offset = ++start_pool % _manager->npools; + list_for_each_entry(p, &_manager->pools, pools) { + unsigned nr_free; + diff --git a/queue-3.16/drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch b/queue-3.16/drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch new file mode 100644 index 00000000000..10a2b363d95 --- /dev/null +++ b/queue-3.16/drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch @@ -0,0 +1,40 @@ +From 11e504cc705e8ccb06ac93a276e11b5e8fee4d40 Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Sun, 3 Aug 2014 19:59:35 +0900 +Subject: drm/ttm: Fix possible division by 0 in ttm_dma_pool_shrink_scan(). + +From: Tetsuo Handa + +commit 11e504cc705e8ccb06ac93a276e11b5e8fee4d40 upstream. + +list_empty(&_manager->pools) being false before taking _manager->lock +does not guarantee that _manager->npools != 0 after taking _manager->lock +because _manager->npools is updated under _manager->lock. + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -1015,6 +1015,8 @@ ttm_dma_pool_shrink_scan(struct shrinker + return SHRINK_STOP; + + mutex_lock(&_manager->lock); ++ if (!_manager->npools) ++ goto out; + pool_offset = pool_offset % _manager->npools; + list_for_each_entry(p, &_manager->pools, pools) { + unsigned nr_free; +@@ -1034,6 +1036,7 @@ ttm_dma_pool_shrink_scan(struct shrinker + p->pool->dev_name, p->pool->name, current->pid, + nr_free, shrink_pages); + } ++out: + mutex_unlock(&_manager->lock); + return freed; + } diff --git a/queue-3.16/drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch b/queue-3.16/drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch new file mode 100644 index 00000000000..3b9d8f0298f --- /dev/null +++ b/queue-3.16/drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch @@ -0,0 +1,64 @@ +From 71336e011d1d2312bcbcaa8fcec7365024f3a95d Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Sun, 3 Aug 2014 20:02:03 +0900 +Subject: drm/ttm: Fix possible stack overflow by recursive shrinker calls. + +From: Tetsuo Handa + +commit 71336e011d1d2312bcbcaa8fcec7365024f3a95d upstream. + +While ttm_dma_pool_shrink_scan() tries to take mutex before doing GFP_KERNEL +allocation, ttm_pool_shrink_scan() does not do it. This can result in stack +overflow if kmalloc() in ttm_page_pool_free() triggered recursion due to +memory pressure. + + shrink_slab() + => ttm_pool_shrink_scan() + => ttm_page_pool_free() + => kmalloc(GFP_KERNEL) + => shrink_slab() + => ttm_pool_shrink_scan() + => ttm_page_pool_free() + => kmalloc(GFP_KERNEL) + +Change ttm_pool_shrink_scan() to do like ttm_dma_pool_shrink_scan() does. + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c +@@ -391,14 +391,17 @@ out: + static unsigned long + ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + { +- static atomic_t start_pool = ATOMIC_INIT(0); ++ static DEFINE_MUTEX(lock); ++ static unsigned start_pool; + unsigned i; +- unsigned pool_offset = atomic_add_return(1, &start_pool); ++ unsigned pool_offset; + struct ttm_page_pool *pool; + int shrink_pages = sc->nr_to_scan; + unsigned long freed = 0; + +- pool_offset = pool_offset % NUM_POOLS; ++ if (!mutex_trylock(&lock)) ++ return SHRINK_STOP; ++ pool_offset = ++start_pool % NUM_POOLS; + /* select start pool in round robin fashion */ + for (i = 0; i < NUM_POOLS; ++i) { + unsigned nr_free = shrink_pages; +@@ -408,6 +411,7 @@ ttm_pool_shrink_scan(struct shrinker *sh + shrink_pages = ttm_page_pool_free(pool, nr_free); + freed += nr_free - shrink_pages; + } ++ mutex_unlock(&lock); + return freed; + } + diff --git a/queue-3.16/drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch b/queue-3.16/drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch new file mode 100644 index 00000000000..4e7f41215c2 --- /dev/null +++ b/queue-3.16/drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch @@ -0,0 +1,154 @@ +From a91576d7916f6cce76d30303e60e1ac47cf4a76d Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Sun, 3 Aug 2014 20:02:31 +0900 +Subject: drm/ttm: Pass GFP flags in order to avoid deadlock. + +From: Tetsuo Handa + +commit a91576d7916f6cce76d30303e60e1ac47cf4a76d upstream. + +Commit 7dc19d5a "drivers: convert shrinkers to new count/scan API" added +deadlock warnings that ttm_page_pool_free() and ttm_dma_page_pool_free() +are currently doing GFP_KERNEL allocation. + +But these functions did not get updated to receive gfp_t argument. +This patch explicitly passes sc->gfp_mask or GFP_KERNEL to these functions, +and removes the deadlock warning. + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc.c | 19 ++++++++++--------- + drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 19 +++++++++---------- + 2 files changed, 19 insertions(+), 19 deletions(-) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c +@@ -297,8 +297,10 @@ static void ttm_pool_update_free_locked( + * + * @pool: to free the pages from + * @free_all: If set to true will free all pages in pool ++ * @gfp: GFP flags. + **/ +-static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free) ++static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, ++ gfp_t gfp) + { + unsigned long irq_flags; + struct page *p; +@@ -309,8 +311,7 @@ static int ttm_page_pool_free(struct ttm + if (NUM_PAGES_TO_ALLOC < nr_free) + npages_to_free = NUM_PAGES_TO_ALLOC; + +- pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), +- GFP_KERNEL); ++ pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); + if (!pages_to_free) { + pr_err("Failed to allocate memory for pool free operation\n"); + return 0; +@@ -382,9 +383,7 @@ out: + * + * XXX: (dchinner) Deadlock warning! + * +- * ttm_page_pool_free() does memory allocation using GFP_KERNEL. that means +- * this can deadlock when called a sc->gfp_mask that is not equal to +- * GFP_KERNEL. ++ * We need to pass sc->gfp_mask to ttm_page_pool_free(). + * + * This code is crying out for a shrinker per pool.... + */ +@@ -408,7 +407,8 @@ ttm_pool_shrink_scan(struct shrinker *sh + if (shrink_pages == 0) + break; + pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; +- shrink_pages = ttm_page_pool_free(pool, nr_free); ++ shrink_pages = ttm_page_pool_free(pool, nr_free, ++ sc->gfp_mask); + freed += nr_free - shrink_pages; + } + mutex_unlock(&lock); +@@ -710,7 +710,7 @@ static void ttm_put_pages(struct page ** + } + spin_unlock_irqrestore(&pool->lock, irq_flags); + if (npages) +- ttm_page_pool_free(pool, npages); ++ ttm_page_pool_free(pool, npages, GFP_KERNEL); + } + + /* +@@ -850,7 +850,8 @@ void ttm_page_alloc_fini(void) + ttm_pool_mm_shrink_fini(_manager); + + for (i = 0; i < NUM_POOLS; ++i) +- ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES); ++ ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES, ++ GFP_KERNEL); + + kobject_put(&_manager->kobj); + _manager = NULL; +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -411,8 +411,10 @@ static void ttm_dma_page_put(struct dma_ + * + * @pool: to free the pages from + * @nr_free: If set to true will free all pages in pool ++ * @gfp: GFP flags. + **/ +-static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free) ++static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, ++ gfp_t gfp) + { + unsigned long irq_flags; + struct dma_page *dma_p, *tmp; +@@ -430,8 +432,7 @@ static unsigned ttm_dma_page_pool_free(s + npages_to_free, nr_free); + } + #endif +- pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), +- GFP_KERNEL); ++ pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); + + if (!pages_to_free) { + pr_err("%s: Failed to allocate memory for pool free operation\n", +@@ -530,7 +531,7 @@ static void ttm_dma_free_pool(struct dev + if (pool->type != type) + continue; + /* Takes a spinlock.. */ +- ttm_dma_page_pool_free(pool, FREE_ALL_PAGES); ++ ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, GFP_KERNEL); + WARN_ON(((pool->npages_in_use + pool->npages_free) != 0)); + /* This code path is called after _all_ references to the + * struct device has been dropped - so nobody should be +@@ -983,7 +984,7 @@ void ttm_dma_unpopulate(struct ttm_dma_t + + /* shrink pool if necessary (only on !is_cached pools)*/ + if (npages) +- ttm_dma_page_pool_free(pool, npages); ++ ttm_dma_page_pool_free(pool, npages, GFP_KERNEL); + ttm->state = tt_unpopulated; + } + EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); +@@ -993,10 +994,7 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); + * + * XXX: (dchinner) Deadlock warning! + * +- * ttm_dma_page_pool_free() does GFP_KERNEL memory allocation, and so attention +- * needs to be paid to sc->gfp_mask to determine if this can be done or not. +- * GFP_KERNEL memory allocation in a GFP_ATOMIC reclaim context woul dbe really +- * bad. ++ * We need to pass sc->gfp_mask to ttm_dma_page_pool_free(). + * + * I'm getting sadder as I hear more pathetical whimpers about needing per-pool + * shrinkers +@@ -1030,7 +1028,8 @@ ttm_dma_pool_shrink_scan(struct shrinker + if (++idx < pool_offset) + continue; + nr_free = shrink_pages; +- shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free); ++ shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, ++ sc->gfp_mask); + freed += nr_free - shrink_pages; + + pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n", diff --git a/queue-3.16/drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch b/queue-3.16/drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch new file mode 100644 index 00000000000..9862fd274e8 --- /dev/null +++ b/queue-3.16/drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch @@ -0,0 +1,52 @@ +From 22e71691fd54c637800d10816bbeba9cf132d218 Mon Sep 17 00:00:00 2001 +From: Tetsuo Handa +Date: Sun, 3 Aug 2014 20:01:10 +0900 +Subject: drm/ttm: Use mutex_trylock() to avoid deadlock inside shrinker functions. + +From: Tetsuo Handa + +commit 22e71691fd54c637800d10816bbeba9cf132d218 upstream. + +I can observe that RHEL7 environment stalls with 100% CPU usage when a +certain type of memory pressure is given. While the shrinker functions +are called by shrink_slab() before the OOM killer is triggered, the stall +lasts for many minutes. + +One of reasons of this stall is that +ttm_dma_pool_shrink_count()/ttm_dma_pool_shrink_scan() are called and +are blocked at mutex_lock(&_manager->lock). GFP_KERNEL allocation with +_manager->lock held causes someone (including kswapd) to deadlock when +these functions are called due to memory pressure. This patch changes +"mutex_lock();" to "if (!mutex_trylock()) return ...;" in order to +avoid deadlock. + +Signed-off-by: Tetsuo Handa +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -1014,7 +1014,8 @@ ttm_dma_pool_shrink_scan(struct shrinker + if (list_empty(&_manager->pools)) + return SHRINK_STOP; + +- mutex_lock(&_manager->lock); ++ if (!mutex_trylock(&_manager->lock)) ++ return SHRINK_STOP; + if (!_manager->npools) + goto out; + pool_offset = ++start_pool % _manager->npools; +@@ -1047,7 +1048,8 @@ ttm_dma_pool_shrink_count(struct shrinke + struct device_pools *p; + unsigned long count = 0; + +- mutex_lock(&_manager->lock); ++ if (!mutex_trylock(&_manager->lock)) ++ return 0; + list_for_each_entry(p, &_manager->pools, pools) + count += p->pool->npages_free; + mutex_unlock(&_manager->lock); diff --git a/queue-3.16/series b/queue-3.16/series index f25102d69c2..1f3696efffb 100644 --- a/queue-3.16/series +++ b/queue-3.16/series @@ -9,3 +9,15 @@ drm-tilcdc-panel-fix-leak-when-unloading-the-module.patch drm-tilcdc-fix-release-order-on-exit.patch drm-tilcdc-fix-double-kfree.patch drm-ttm-fix-handling-of-ttm_pl_flag_topdown-v2.patch +drm-ttm-fix-possible-division-by-0-in-ttm_dma_pool_shrink_scan.patch +drm-ttm-choose-a-pool-to-shrink-correctly-in-ttm_dma_pool_shrink_scan.patch +drm-ttm-use-mutex_trylock-to-avoid-deadlock-inside-shrinker-functions.patch +drm-ttm-fix-possible-stack-overflow-by-recursive-shrinker-calls.patch +drm-ttm-pass-gfp-flags-in-order-to-avoid-deadlock.patch +drm-radeon-dpm-handle-voltage-info-fetching-on-hawaii.patch +drm-radeon-re-enable-dpm-by-default-on-cayman.patch +drm-radeon-re-enable-dpm-by-default-on-btc.patch +drm-radeon-load-the-lm63-driver-for-an-lm64-thermal-chip.patch +drm-radeon-set-vm-base-addr-using-the-pfp-v2.patch +drm-radeon-atom-add-new-voltage-fetch-function-for-hawaii.patch +drm-radeon-tweak-accel_working2-query-for-hawaii.patch -- 2.47.3