Module Name:    src
Committed By:   mrg
Date:           Sun Dec 15 01:00:59 UTC 2019

Modified Files:
        src/sys/arch/arm/rockchip: rk_drm.c
        src/sys/arch/arm/sunxi: sunxi_drm.c
        src/sys/arch/arm/ti: ti_lcdc.c

Log Message:
ensure to call drm_mode_config_cleanup() when erroring.
tripped up 'active lock in free' checks, and perhaps
lead to other lock corruption.  (crash with un-init lock
in arpresolve that does not make sense now seems to not
occur either.)


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rk_drm.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/sunxi/sunxi_drm.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/ti/ti_lcdc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/rockchip/rk_drm.c
diff -u src/sys/arch/arm/rockchip/rk_drm.c:1.2 src/sys/arch/arm/rockchip/rk_drm.c:1.3
--- src/sys/arch/arm/rockchip/rk_drm.c:1.2	Thu Nov 14 20:39:46 2019
+++ src/sys/arch/arm/rockchip/rk_drm.c	Sun Dec 15 01:00:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rk_drm.c,v 1.2 2019/11/14 20:39:46 jmcneill Exp $ */
+/* $NetBSD: rk_drm.c,v 1.3 2019/12/15 01:00:58 mrg Exp $ */
 
 /*-
  * Copyright (c) 2019 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rk_drm.c,v 1.2 2019/11/14 20:39:46 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rk_drm.c,v 1.3 2019/12/15 01:00:58 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -401,7 +401,8 @@ rk_drm_load(struct drm_device *ddev, uns
 
 	if (num_crtc == 0) {
 		aprint_error_dev(sc->sc_dev, "no display interface ports configured\n");
-		return ENXIO;
+		error = ENXIO;
+		goto drmerr;
 	}
 
 	fbdev = kmem_zalloc(sizeof(*fbdev), KM_SLEEP);
@@ -410,7 +411,7 @@ rk_drm_load(struct drm_device *ddev, uns
 
 	error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc, num_crtc);
 	if (error)
-		goto drmerr;
+		goto allocerr;
 
 	fbdev->helper.fb = kmem_zalloc(sizeof(struct rk_drm_framebuffer), KM_SLEEP);
 
@@ -426,9 +427,10 @@ rk_drm_load(struct drm_device *ddev, uns
 
 	return 0;
 
+allocerr:
+	kmem_free(fbdev, sizeof(*fbdev));
 drmerr:
 	drm_mode_config_cleanup(ddev);
-	kmem_free(fbdev, sizeof(*fbdev));
 
 	return error;
 }

Index: src/sys/arch/arm/sunxi/sunxi_drm.c
diff -u src/sys/arch/arm/sunxi/sunxi_drm.c:1.9 src/sys/arch/arm/sunxi/sunxi_drm.c:1.10
--- src/sys/arch/arm/sunxi/sunxi_drm.c:1.9	Sun Nov 24 12:21:14 2019
+++ src/sys/arch/arm/sunxi/sunxi_drm.c	Sun Dec 15 01:00:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_drm.c,v 1.9 2019/11/24 12:21:14 jmcneill Exp $ */
+/* $NetBSD: sunxi_drm.c,v 1.10 2019/12/15 01:00:58 mrg Exp $ */
 
 /*-
  * Copyright (c) 2019 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_drm.c,v 1.9 2019/11/24 12:21:14 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_drm.c,v 1.10 2019/12/15 01:00:58 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -440,7 +440,8 @@ sunxi_drm_load(struct drm_device *ddev, 
 
 	if (num_crtc == 0) {
 		aprint_error_dev(sc->sc_dev, "no pipelines configured\n");
-		return ENXIO;
+		error = ENXIO;
+		goto drmerr;
 	}
 
 	fbdev = kmem_zalloc(sizeof(*fbdev), KM_SLEEP);
@@ -449,7 +450,7 @@ sunxi_drm_load(struct drm_device *ddev, 
 
 	error = drm_fb_helper_init(ddev, &fbdev->helper, num_crtc, num_crtc);
 	if (error)
-		goto drmerr;
+		goto allocerr;
 
 	fbdev->helper.fb = kmem_zalloc(sizeof(struct sunxi_drm_framebuffer), KM_SLEEP);
 
@@ -465,9 +466,10 @@ sunxi_drm_load(struct drm_device *ddev, 
 
 	return 0;
 
+allocerr:
+	kmem_free(fbdev, sizeof(*fbdev));
 drmerr:
 	drm_mode_config_cleanup(ddev);
-	kmem_free(fbdev, sizeof(*fbdev));
 
 	return error;
 }

Index: src/sys/arch/arm/ti/ti_lcdc.c
diff -u src/sys/arch/arm/ti/ti_lcdc.c:1.3 src/sys/arch/arm/ti/ti_lcdc.c:1.4
--- src/sys/arch/arm/ti/ti_lcdc.c:1.3	Mon Nov  4 09:38:38 2019
+++ src/sys/arch/arm/ti/ti_lcdc.c	Sun Dec 15 01:00:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ti_lcdc.c,v 1.3 2019/11/04 09:38:38 jmcneill Exp $ */
+/* $NetBSD: ti_lcdc.c,v 1.4 2019/12/15 01:00:58 mrg Exp $ */
 
 /*-
  * Copyright (c) 2019 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_lcdc.c,v 1.3 2019/11/04 09:38:38 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_lcdc.c,v 1.4 2019/12/15 01:00:58 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -622,12 +622,14 @@ tilcdc_load(struct drm_device *ddev, uns
 	ep = fdt_endpoint_get_from_index(&sc->sc_ports, TILCDC_PORT_OUTPUT, 0);
 	if (ep == NULL) {
 		aprint_error_dev(sc->sc_dev, "couldn't find endpoint\n");
-		return ENXIO;
+		error = ENXIO;
+		goto drmerr;
 	}
 	error = fdt_endpoint_activate_direct(ep, true);
 	if (error != 0) {
 		aprint_error_dev(sc->sc_dev, "couldn't activate endpoint: %d\n", error);
-		return error;
+		error = ENXIO;
+		goto drmerr;
 	}
 
 	fbdev = kmem_zalloc(sizeof(*fbdev), KM_SLEEP);
@@ -636,7 +638,7 @@ tilcdc_load(struct drm_device *ddev, uns
 
 	error = drm_fb_helper_init(ddev, &fbdev->helper, 1, 1);
 	if (error)
-		goto drmerr;
+		goto allocerr;
 
 	fbdev->helper.fb = kmem_zalloc(sizeof(struct tilcdc_framebuffer), KM_SLEEP);
 
@@ -648,9 +650,10 @@ tilcdc_load(struct drm_device *ddev, uns
 
 	return 0;
 
+allocerr:
+	kmem_free(fbdev, sizeof(*fbdev));
 drmerr:
 	drm_mode_config_cleanup(ddev);
-	kmem_free(fbdev, sizeof(*fbdev));
 
 	return error;
 }

Reply via email to