PERFORCE change 169022 for review
John Baldwin
jhb at FreeBSD.org
Tue Sep 29 18:17:41 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=169022
Change 169022 by jhb at jhb_jhbbsd on 2009/09/29 18:17:38
- Simplify resource_list_unreserve() to just read the resource out
of the resource list entry.
- Add a resource_list_busy() that returns true if a given resource
entry is "busy". A resource entry is not busy if it has no
associated resource, or if the resource is a "reserved" resource
that is not allocated by the child device. Otherwise the resource
entry is busy.
Affected files ...
.. //depot/projects/multipass/sys/dev/pci/pci.c#8 edit
.. //depot/projects/multipass/sys/kern/subr_bus.c#9 edit
.. //depot/projects/multipass/sys/sys/bus.h#6 edit
Differences ...
==== //depot/projects/multipass/sys/dev/pci/pci.c#8 (text+ko) ====
@@ -3641,12 +3641,11 @@
if (rle->res) {
if (rman_get_flags(rle->res) & RF_ACTIVE ||
- rle->flags & RLE_ALLOCATED) {
+ resource_list_busy(rl, type, rid)) {
device_printf(dev, "delete_resource: "
"Resource still owned by child, oops. "
"(type=%d, rid=%d, addr=%lx)\n",
- rle->type, rle->rid,
- rman_get_start(rle->res));
+ type, rid, rman_get_start(rle->res));
return;
}
@@ -3662,7 +3661,7 @@
break;
}
#endif
- resource_list_unreserve(rl, dev, child, type, rid, rle->res);
+ resource_list_unreserve(rl, dev, child, type, rid);
}
resource_list_delete(rl, type, rid);
}
==== //depot/projects/multipass/sys/kern/subr_bus.c#9 (text+ko) ====
@@ -2820,6 +2820,31 @@
}
/**
+ * @brief Determine if a resource entry is busy.
+ *
+ * Returns true if a resource entry is busy meaning that it has an
+ * associated resource that is not an unallocated "reserved" resource.
+ *
+ * @param rl the resource list to search
+ * @param type the resource entry type (e.g. SYS_RES_MEMORY)
+ * @param rid the resource identifier
+ *
+ * @returns Non-zero if the entry is busy, zero otherwise.
+ */
+int
+resource_list_busy(struct resource_list *rl, int type, int rid)
+{
+ struct resource_list_entry *rle;
+
+ rle = resource_list_find(rl, type, rid);
+ if (rle == NULL || rle->res == NULL)
+ return (0);
+ if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED)
+ return (0);
+ return (1);
+}
+
+/**
* @brief Find a resource entry by type and rid.
*
* @param rl the resource list to search
@@ -3077,7 +3102,7 @@
*/
int
resource_list_unreserve(struct resource_list *rl, device_t bus, device_t child,
- int type, int rid, struct resource *res)
+ int type, int rid)
{
struct resource_list_entry *rle = NULL;
int passthrough = (device_get_parent(child) != bus);
@@ -3095,7 +3120,7 @@
if (rle->flags & RLE_ALLOCATED)
return (EBUSY);
rle->flags &= ~RLE_RESERVED;
- return (resource_list_release(rl, bus, child, type, rid, res));
+ return (resource_list_release(rl, bus, child, type, rid, rle->res));
}
/**
==== //depot/projects/multipass/sys/sys/bus.h#6 (text+ko) ====
@@ -251,6 +251,8 @@
int resource_list_add_next(struct resource_list *rl,
int type,
u_long start, u_long end, u_long count);
+int resource_list_busy(struct resource_list *rl,
+ int type, int rid);
struct resource_list_entry*
resource_list_find(struct resource_list *rl,
int type, int rid);
@@ -273,7 +275,7 @@
u_long count, u_int flags);
int resource_list_unreserve(struct resource_list *rl,
device_t bus, device_t child,
- int type, int rid, struct resource *res);
+ int type, int rid);
void resource_list_purge(struct resource_list *rl);
int resource_list_print_type(struct resource_list *rl,
const char *name, int type,
More information about the p4-projects
mailing list