[PATCH]gpu:drm: Add missing dependency on DRM KMS/FB CMA helper

2013-04-01 Thread Wang YanQing
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

2013-04-09 Thread Wang YanQing

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

2013-04-02 Thread Wang YanQing
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

2013-04-09 Thread Wang YanQing

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

2013-10-31 Thread Wang YanQing
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

2013-10-31 Thread Wang YanQing
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

2013-10-31 Thread Wang YanQing
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

2013-10-31 Thread Wang YanQing
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

2013-10-31 Thread Wang YanQing
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

2013-10-31 Thread Wang YanQing
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