Date: Wed, 30 Dec 2009 19:44:31 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r201276 - head/sys/kern Message-ID: <200912301944.nBUJiVBZ068965@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Wed Dec 30 19:44:31 2009 New Revision: 201276 URL: http://svn.freebsd.org/changeset/base/201276 Log: - Assert that a reserved resource returned via resource_list_alloc() is not active. - Fix bus_generic_rl_(alloc|release)_resource() to not attempt to fetch a resource list for grandchild devices, but just pass those requests up to the parent directly. This worked by accident previously, but it is better to not let bus drivers try to operate on devices they do not manage. Modified: head/sys/kern/subr_bus.c Modified: head/sys/kern/subr_bus.c ============================================================================== --- head/sys/kern/subr_bus.c Wed Dec 30 19:42:27 2009 (r201275) +++ head/sys/kern/subr_bus.c Wed Dec 30 19:44:31 2009 (r201276) @@ -2898,8 +2898,11 @@ resource_list_busy(struct resource_list rle = resource_list_find(rl, type, rid); if (rle == NULL || rle->res == NULL) return (0); - if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED) + if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED) { + KASSERT(!(rman_get_flags(rle->res) & RF_ACTIVE), + ("reserved resource is active")); return (0); + } return (1); } @@ -3801,6 +3804,10 @@ bus_generic_rl_release_resource(device_t { struct resource_list * rl = NULL; + if (device_get_parent(child) != dev) + return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, + type, rid, r)); + rl = BUS_GET_RESOURCE_LIST(dev, child); if (!rl) return (EINVAL); @@ -3821,6 +3828,10 @@ bus_generic_rl_alloc_resource(device_t d { struct resource_list * rl = NULL; + if (device_get_parent(child) != dev) + return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, + type, rid, start, end, count, flags)); + rl = BUS_GET_RESOURCE_LIST(dev, child); if (!rl) return (NULL);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912301944.nBUJiVBZ068965>