[PATCH]gpu:drm: Add missing dependency on DRM KMS/FB CMA helper
Commit 2e3b3c42f06ff6801b3d7839757bbdb231619083 (Add DRM KMS/FB CMA helper) add a kbuild entry, config DRM_KMS_CMA_HELPER, in DRM's Kconfig without dependence on DRM, it cause DRM's kconfig can't be show in a submenu. This patch fix it. Signed-off-by: Wang YanQing --- drivers/gpu/drm/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 1e82882..28e3cb4 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -63,6 +63,7 @@ config DRM_GEM_CMA_HELPER config DRM_KMS_CMA_HELPER bool + depends on DRM select DRM_GEM_CMA_HELPER select FB_SYS_FILLRECT select FB_SYS_COPYAREA -- 1.7.12.4.dirty ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH]drm: Re-add DMT modes for monitors back
Commit 196e077dc165a307efbd9e7569f81bbdbcf18f65 "drm: don't add inferred modes for monitors that don't support them" It remove the call add_inferred_modes when DRM_EDID_FEATURE_DEFAULT_GTF in feature support field is zero, this remove all inferred modes come from GTF or CVT range information, and also remove DMT modes, this make me lost some avaiable modes for my TV. Without this patch I get: Screen 0: minimum 320 x 200, current 2720 x 1024, maximum 32767 x 32767 VGA1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 414mm x 257mm 1440x900 75.0*+ 59.9 1400x1050 60.3 1280x1024 75.0 1280x800 59.8 1152x864 75.0 1280x720 60.0 1024x768 75.1 70.1 60.0 832x62474.6 800x60072.2 75.0 60.3 640x48072.8 75.0 66.7 60.0 720x40070.1 HDMI1 connected 1280x1024+1440+0 (normal left inverted right x axis y axis) 1600mm x 900mm 1920x1080 60.0 + 50.0 1920x1080i 30.0 25.0 1280x1024 60.0* 1280x720 60.0 50.0 1440x576i 25.0 1024x768 60.0 1440x480i 30.0 800x60060.3 720x57650.0 720x48059.9 640x48060.0 59.9 DP1 disconnected (normal left inverted right x axis y axis) With this patch I get below: Screen 0: minimum 320 x 200, current 2880 x 900, maximum 32767 x 32767 VGA1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 414mm x 257mm 1440x900 75.0*+ 59.9 1400x1050 60.3 1280x1024 75.0 1280x800 59.8 1152x864 75.0 1280x720 60.0 1024x768 75.1 70.1 60.0 832x62474.6 800x60072.2 75.0 60.3 640x48072.8 75.0 66.7 60.0 720x40070.1 HDMI1 connected 1440x900+1440+0 (normal left inverted right x axis y axis) 1600mm x 900mm 1440x900 59.9*+ 1920x1080 60.0 + 50.0 1920x1080i 30.0 25.0 1680x1050 59.9 1400x1050 59.9 1280x1024 60.0 1280x960 60.0 1360x768 60.0 1280x800 59.9 1280x768 60.0 1280x720 60.0 50.0 1440x576i 25.0 1024x768 60.0 1440x480i 30.0 800x60060.3 56.2 720x57650.0 848x48060.0 720x48059.9 640x48060.0 59.9 DP1 disconnected (normal left inverted right x axis y axis) Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_edid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index dfd9ed3..10c2147 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1182,7 +1182,8 @@ do_inferred_modes(struct detailed_timing *timing, void *c) closure->edid, timing); - if (!version_greater(closure->edid, 1, 1)) + if (!version_greater(closure->edid, 1, 1) || + !(closure->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) return; /* GTF not defined yet */ switch (range->flags) { @@ -2022,8 +2023,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) num_modes += add_cvt_modes(connector, edid); num_modes += add_standard_modes(connector, edid); num_modes += add_established_modes(connector, edid); - if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) - num_modes += add_inferred_modes(connector, edid); + num_modes += add_inferred_modes(connector, edid); num_modes += add_cea_modes(connector, edid); if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) -- 1.7.12.4.dirty ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH]gpu:drm: Add missing dependency on DRM KMS/FB CMA helper
Commit 2e3b3c42f06ff6801b3d7839757bbdb231619083 (Add DRM KMS/FB CMA helper) add a kbuild entry, config DRM_KMS_CMA_HELPER, in DRM's Kconfig without dependence on DRM, it cause DRM's kconfig can't be show in a submenu. This patch fix it. Signed-off-by: Wang YanQing --- drivers/gpu/drm/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 1e82882..28e3cb4 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -63,6 +63,7 @@ config DRM_GEM_CMA_HELPER config DRM_KMS_CMA_HELPER bool + depends on DRM select DRM_GEM_CMA_HELPER select FB_SYS_FILLRECT select FB_SYS_COPYAREA -- 1.7.12.4.dirty
[PATCH]drm: Re-add DMT modes for monitors back
Commit 196e077dc165a307efbd9e7569f81bbdbcf18f65 "drm: don't add inferred modes for monitors that don't support them" It remove the call add_inferred_modes when DRM_EDID_FEATURE_DEFAULT_GTF in feature support field is zero, this remove all inferred modes come from GTF or CVT range information, and also remove DMT modes, this make me lost some avaiable modes for my TV. Without this patch I get: Screen 0: minimum 320 x 200, current 2720 x 1024, maximum 32767 x 32767 VGA1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 414mm x 257mm 1440x900 75.0*+ 59.9 1400x1050 60.3 1280x1024 75.0 1280x800 59.8 1152x864 75.0 1280x720 60.0 1024x768 75.1 70.1 60.0 832x62474.6 800x60072.2 75.0 60.3 640x48072.8 75.0 66.7 60.0 720x40070.1 HDMI1 connected 1280x1024+1440+0 (normal left inverted right x axis y axis) 1600mm x 900mm 1920x1080 60.0 + 50.0 1920x1080i 30.0 25.0 1280x1024 60.0* 1280x720 60.0 50.0 1440x576i 25.0 1024x768 60.0 1440x480i 30.0 800x60060.3 720x57650.0 720x48059.9 640x48060.0 59.9 DP1 disconnected (normal left inverted right x axis y axis) With this patch I get below: Screen 0: minimum 320 x 200, current 2880 x 900, maximum 32767 x 32767 VGA1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 414mm x 257mm 1440x900 75.0*+ 59.9 1400x1050 60.3 1280x1024 75.0 1280x800 59.8 1152x864 75.0 1280x720 60.0 1024x768 75.1 70.1 60.0 832x62474.6 800x60072.2 75.0 60.3 640x48072.8 75.0 66.7 60.0 720x40070.1 HDMI1 connected 1440x900+1440+0 (normal left inverted right x axis y axis) 1600mm x 900mm 1440x900 59.9*+ 1920x1080 60.0 + 50.0 1920x1080i 30.0 25.0 1680x1050 59.9 1400x1050 59.9 1280x1024 60.0 1280x960 60.0 1360x768 60.0 1280x800 59.9 1280x768 60.0 1280x720 60.0 50.0 1440x576i 25.0 1024x768 60.0 1440x480i 30.0 800x60060.3 56.2 720x57650.0 848x48060.0 720x48059.9 640x48060.0 59.9 DP1 disconnected (normal left inverted right x axis y axis) Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_edid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index dfd9ed3..10c2147 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1182,7 +1182,8 @@ do_inferred_modes(struct detailed_timing *timing, void *c) closure->edid, timing); - if (!version_greater(closure->edid, 1, 1)) + if (!version_greater(closure->edid, 1, 1) || + !(closure->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) return; /* GTF not defined yet */ switch (range->flags) { @@ -2022,8 +2023,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) num_modes += add_cvt_modes(connector, edid); num_modes += add_standard_modes(connector, edid); num_modes += add_established_modes(connector, edid); - if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) - num_modes += add_inferred_modes(connector, edid); + num_modes += add_inferred_modes(connector, edid); num_modes += add_cea_modes(connector, edid); if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) -- 1.7.12.4.dirty
[PATCH 0/5] drm: fix resources leak in error handle code path
This series patches fix resource leak issue in error handle code path I meet with drm, vmalloc leak, etc. I meet below issue caused by drm haven't release resource(include 40K vmalloc per module insert failed) in error code path and buggy nvidia driver try to insert nvidia module cycled when it failed to probe device which had been controlled by nouveau built-in kernel, then drm leak all the vmalloc space finally: [ 2075.508077] vmap allocation for size 9637888 failed: use vmalloc= to increase size. [ 2075.508083] vmalloc: allocation failure: 9633737 bytes [ 2075.508085] modprobe: page allocation failure: order:0, mode:0xd2 [ 2075.508089] CPU: 0 PID: 3 Comm: modprobe Tainted: P O 3.10.16+ #13 [ 2075.508091] Hardware name: AcerAspire 4741 /Aspire 4741, BIOS V1.04 03/02/2010 [ 2075.508093] c17295c4 f5283eac c15df443 f5283edc c10b3311 c1727ec4 f2c15ac0 [ 2075.508097] 00d2 c17295c4 f5283ecc f5283ef0 00d2 0092ffc9 f5283f0c [ 2075.508101] c10d86e7 00d2 c17295c4 0092ffc9 c1077408 f56979c0 f5283f28 [ 2075.508106] Call Trace: [ 2075.508113] [] dump_stack+0x16/0x1b [ 2075.508118] [] warn_alloc_failed+0xa1/0x100 [ 2075.508123] [] __vmalloc_node_range+0x177/0x1e0 [ 2075.508128] [] ? SyS_init_module+0x78/0xc0 [ 2075.508131] [] __vmalloc_node+0x60/0x70 [ 2075.508134] [] ? SyS_init_module+0x78/0xc0 [ 2075.508137] [] vmalloc+0x38/0x40 [ 2075.508140] [] ? SyS_init_module+0x78/0xc0 [ 2075.508142] [] SyS_init_module+0x78/0xc0 [ 2075.508147] [] sysenter_do_call+0x12/0x26 [ 2075.508149] Mem-Info: [ 2075.508151] DMA per-cpu: [ 2075.508153] CPU0: hi:0, btch: 1 usd: 0 [ 2075.508154] CPU1: hi:0, btch: 1 usd: 0 [ 2075.508156] CPU2: hi:0, btch: 1 usd: 0 [ 2075.508157] CPU3: hi:0, btch: 1 usd: 0 [ 2075.508158] Normal per-cpu: [ 2075.508160] CPU0: hi: 186, btch: 31 usd: 125 [ 2075.508162] CPU1: hi: 186, btch: 31 usd: 138 [ 2075.508163] CPU2: hi: 186, btch: 31 usd: 155 [ 2075.508165] CPU3: hi: 186, btch: 31 usd: 144 [ 2075.508166] HighMem per-cpu: [ 2075.508167] CPU0: hi: 186, btch: 31 usd: 132 [ 2075.508169] CPU1: hi: 186, btch: 31 usd: 170 [ 2075.508171] CPU2: hi: 186, btch: 31 usd: 155 [ 2075.508172] CPU3: hi: 186, btch: 31 usd: 153 [ 2075.508177] active_anon:2889 inactive_anon:27 isolated_anon:0 [ 2075.508177] active_file:66897 inactive_file:117009 isolated_file:0 [ 2075.508177] unevictable:0 dirty:47 writeback:0 unstable:0 [ 2075.508177] free:292466 slab_reclaimable:4051 slab_unreclaimable:2244 [ 2075.508177] mapped:2241 shmem:206 pagetables:189 bounce:0 [ 2075.508177] free_cma:0 [ 2075.508185] DMA free:15896kB min:64kB low:80kB high:96kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15980kB managed:15904kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:8kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 2075.508186] lowmem_reserve[]: 0 842 1923 1923 [ 2075.508193] Normal free:803896kB min:3680kB low:4600kB high:5520kB active_anon:0kB inactive_anon:0kB active_file:14052kB inactive_file:18684kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:897016kB managed:863160kB mlocked:0kB dirty:72kB writeback:0kB mapped:4kB shmem:0kB slab_reclaimable:16204kB slab_unreclaimable:8968kB kernel_stack:1272kB pagetables:756kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 2075.508195] lowmem_reserve[]: 0 0 8647 8647 [ 2075.508202] HighMem free:350072kB min:512kB low:1688kB high:2868kB active_anon:11556kB inactive_anon:108kB active_file:253536kB inactive_file:449352kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1106844kB managed:1106844kB mlocked:0kB dirty:116kB writeback:0kB mapped:8960kB shmem:824kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 2075.508203] lowmem_reserve[]: 0 0 0 0 [ 2075.508206] DMA: 0*4kB 1*8kB (U) 1*16kB (U) 0*32kB 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (R) 3*4096kB (M) = 15896kB [ 2075.508216] Normal: 50*4kB (UM) 180*8kB (UM) 159*16kB (UEM) 65*32kB (UEM) 29*64kB (UEM) 1*128kB (M) 0*256kB 0*512kB 1*1024kB (M) 2*2048kB (UR) 193*4096kB (MR) = 803896kB [ 2075.508228] HighMem: 1270*4kB (U) 942*8kB (UM) 467*16kB (UM) 1012*32kB (UM) 632*64kB (UM) 199*128kB (UM) 61*256kB (UM) 24*512kB (M) 5*1024kB (M) 3*2048kB (UM) 47*4096kB (MR) = 350072kB [ 2075.508240] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 2075.508242] 184112 total pagecache pages [ 2075.508243] 0 pages in swap cache [ 2075.508245] Swap cache
[PATCH 1/5] drm:drm_stub: add new function drm_cleanup_in_dev
Introduce a new function, drm_cleanup_in_dev, we could use it to release resources allocated by drm_fill_in_dev in the error handle code path after drm_fill_in_dev have been called. Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_stub.c | 62 -- include/drm/drmP.h | 1 + 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 16f3ec5..3f3b167 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -250,6 +250,37 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data, return 0; } +void drm_cleanup_in_dev(struct drm_device *dev) +{ + struct drm_driver *driver; + struct drm_map_list *r_list, *list_temp; + + driver = dev->driver; + if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && + dev->agp && dev->agp->agp_mtrr >= 0) { + int retval; + retval = mtrr_del(dev->agp->agp_mtrr, + dev->agp->agp_info.aper_base, + dev->agp->agp_info.aper_size * 1024 * 1024); + DRM_DEBUG("mtrr_del=%d\n", retval); + } + + if (drm_core_has_AGP(dev) && dev->agp) { + kfree(dev->agp); + dev->agp = NULL; + } + + list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) + drm_rmmap(dev, r_list->map); + drm_ht_remove(&dev->map_hash); + + drm_ctxbitmap_cleanup(dev); + + if (dev->driver->driver_features & DRIVER_GEM) + drm_gem_destroy(dev); +} +EXPORT_SYMBOL(drm_cleanup_in_dev); + int drm_fill_in_dev(struct drm_device *dev, const struct pci_device_id *ent, struct drm_driver *driver) @@ -438,52 +469,23 @@ static void drm_unplug_minor(struct drm_minor *minor) */ void drm_put_dev(struct drm_device *dev) { - struct drm_driver *driver; - struct drm_map_list *r_list, *list_temp; - DRM_DEBUG("\n"); - if (!dev) { DRM_ERROR("cleanup called no dev\n"); return; } - driver = dev->driver; drm_lastclose(dev); - if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && - dev->agp && dev->agp->agp_mtrr >= 0) { - int retval; - retval = mtrr_del(dev->agp->agp_mtrr, - dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size * 1024 * 1024); - DRM_DEBUG("mtrr_del=%d\n", retval); - } - if (dev->driver->unload) dev->driver->unload(dev); - if (drm_core_has_AGP(dev) && dev->agp) { - kfree(dev->agp); - dev->agp = NULL; - } - drm_vblank_cleanup(dev); - - list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) - drm_rmmap(dev, r_list->map); - drm_ht_remove(&dev->map_hash); - - drm_ctxbitmap_cleanup(dev); + drm_cleanup_in_dev(dev); if (drm_core_check_feature(dev, DRIVER_MODESET)) drm_put_minor(&dev->control); - - if (driver->driver_features & DRIVER_GEM) - drm_gem_destroy(dev); - drm_put_minor(&dev->primary); - list_del(&dev->driver_item); kfree(dev->devname); kfree(dev); diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 63d17ee..2dcf83a 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1761,6 +1761,7 @@ static __inline__ void drm_core_dropmap(struct drm_local_map *map) #include +extern void drm_cleanup_in_dev(struct drm_device *dev); extern int drm_fill_in_dev(struct drm_device *dev, const struct pci_device_id *ent, struct drm_driver *driver); -- 1.7.12.4.dirty
[PATCH 2/5] drm:drm_pci: fix resource leak in drm_get_pci_dev
We should call drm_cleanup_in_dev in error handle code path after drm_fill_in_dev had been called, or it will cause resource leak heavily, vmalloc leak etc. This patch also add call to dev->unload in error handle code path. Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_pci.c | 18 +++--- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index 14194b6..5f15805 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c @@ -345,16 +345,16 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, pci_set_drvdata(pdev, dev); ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL); if (ret) - goto err_g2; + goto err_g3; } if ((ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY))) - goto err_g3; + goto err_g4; if (dev->driver->load) { ret = dev->driver->load(dev, ent->driver_data); if (ret) - goto err_g4; + goto err_g5; } /* setup the grouping for the legacy output */ @@ -362,7 +362,7 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); if (ret) - goto err_g4; + goto err_g6; } list_add_tail(&dev->driver_item, &driver->device_list); @@ -373,12 +373,16 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, mutex_unlock(&drm_global_mutex); return 0; - -err_g4: +err_g6: + if (dev->driver->unload) + dev->driver->unload(dev); +err_g5: drm_put_minor(&dev->primary); -err_g3: +err_g4: if (drm_core_check_feature(dev, DRIVER_MODESET)) drm_put_minor(&dev->control); +err_g3: + drm_cleanup_in_dev(dev); err_g2: pci_disable_device(pdev); err_g1: -- 1.7.12.4.dirty
[PATCH 3/5] drm:drm_platform: fix resource leak in drm_get_platform_dev
We should call drm_cleanup_in_dev in error handle code path after drm_fill_in_dev had been called, or it will cause resource leak heavily, vmalloc leak etc. This patch also add call to dev->unload in error handle code path. Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_platform.c | 18 +++--- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c index b8a282e..1198fa4 100644 --- a/drivers/gpu/drm/drm_platform.c +++ b/drivers/gpu/drm/drm_platform.c @@ -66,17 +66,17 @@ int drm_get_platform_dev(struct platform_device *platdev, if (drm_core_check_feature(dev, DRIVER_MODESET)) { ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL); if (ret) - goto err_g1; + goto err_g2; } ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY); if (ret) - goto err_g2; + goto err_g3; if (dev->driver->load) { ret = dev->driver->load(dev, 0); if (ret) - goto err_g3; + goto err_g4; } /* setup the grouping for the legacy output */ @@ -84,7 +84,7 @@ int drm_get_platform_dev(struct platform_device *platdev, ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); if (ret) - goto err_g3; + goto err_g5; } list_add_tail(&dev->driver_item, &driver->device_list); @@ -96,12 +96,16 @@ int drm_get_platform_dev(struct platform_device *platdev, driver->date, dev->primary->index); return 0; - -err_g3: +err_g5: + if (dev->driver->unload) + dev->driver->unload(dev); +err_g4: drm_put_minor(&dev->primary); -err_g2: +err_g3: if (drm_core_check_feature(dev, DRIVER_MODESET)) drm_put_minor(&dev->control); +err_g2: + drm_cleanup_in_dev(dev); err_g1: kfree(dev); mutex_unlock(&drm_global_mutex); -- 1.7.12.4.dirty
[PATCH 4/5] drm:drm_usb: fix resource leak in drm_get_usb_dev
We should call drm_cleanup_in_dev in error handle code path after drm_fill_in_dev had been called, or it will cause resource leak heavily, vmalloc leak etc. This patch also add call to dev->unload in error handle code path. Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_usb.c | 18 +++--- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c index 34a156f..7e4de60 100644 --- a/drivers/gpu/drm/drm_usb.c +++ b/drivers/gpu/drm/drm_usb.c @@ -31,23 +31,23 @@ int drm_get_usb_dev(struct usb_interface *interface, usb_set_intfdata(interface, dev); ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL); if (ret) - goto err_g1; + goto err_g2; ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY); if (ret) - goto err_g2; + goto err_g3; if (dev->driver->load) { ret = dev->driver->load(dev, 0); if (ret) - goto err_g3; + goto err_g4; } /* setup the grouping for the legacy output */ ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); if (ret) - goto err_g3; + goto err_g5; list_add_tail(&dev->driver_item, &driver->device_list); @@ -58,11 +58,15 @@ int drm_get_usb_dev(struct usb_interface *interface, driver->date, dev->primary->index); return 0; - -err_g3: +err_g5: + if (dev->driver->unload) + dev->driver->unload(dev); +err_g4: drm_put_minor(&dev->primary); -err_g2: +err_g3: drm_put_minor(&dev->control); +err_g2: + drm_cleanup_in_dev(dev); err_g1: kfree(dev); mutex_unlock(&drm_global_mutex); -- 1.7.12.4.dirty
[PATCH 5/5] drm:drm_stub: rewrite error handle code for drm_fill_in_dev
Rewrite error handle code in a more rational and normal way, it bring us benefit that we could drop call to drm_lastclose which do "too much" cleanup work for drm_fill_in_dev. Signed-off-by: Wang YanQing --- drivers/gpu/drm/drm_stub.c | 26 +- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 3f3b167..6c5f65f 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -316,7 +316,7 @@ int drm_fill_in_dev(struct drm_device *dev, if (dev->driver->bus->agp_init) { retcode = dev->driver->bus->agp_init(dev); if (retcode) - goto error_out_unreg; + goto err_g1; } @@ -324,7 +324,7 @@ int drm_fill_in_dev(struct drm_device *dev, retcode = drm_ctxbitmap_init(dev); if (retcode) { DRM_ERROR("Cannot allocate memory for context bitmap.\n"); - goto error_out_unreg; + goto err_g2; } if (driver->driver_features & DRIVER_GEM) { @@ -332,14 +332,30 @@ int drm_fill_in_dev(struct drm_device *dev, if (retcode) { DRM_ERROR("Cannot initialize graphics execution " "manager (GEM)\n"); - goto error_out_unreg; + goto err_g3; } } return 0; - error_out_unreg: - drm_lastclose(dev); +err_g3: + drm_ctxbitmap_cleanup(dev); +err_g2: + if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && + dev->agp && dev->agp->agp_mtrr >= 0) { + int retval; + retval = mtrr_del(dev->agp->agp_mtrr, + dev->agp->agp_info.aper_base, + dev->agp->agp_info.aper_size * 1024 * 1024); + DRM_DEBUG("mtrr_del=%d\n", retval); + } + + if (drm_core_has_AGP(dev) && dev->agp) { + kfree(dev->agp); + dev->agp = NULL; + } +err_g1: + drm_ht_remove(&dev->map_hash); return retcode; } EXPORT_SYMBOL(drm_fill_in_dev); -- 1.7.12.4.dirty