PERFORCE change 190437 for review
John Baldwin
jhb at FreeBSD.org
Wed Mar 23 20:49:55 UTC 2011
http://p4web.freebsd.org/@@190437?ac=10
Change 190437 by jhb at jhb_jhbbsd on 2011/03/23 20:49:39
Additional tests to cover growing to the end of a region and
then shrinking back as well as ensuring we fail with EBUSY if
we try to grow into an already-allocated resource.
Affected files ...
.. //depot/projects/pci/sys/modules/rman/rman.c#4 edit
Differences ...
==== //depot/projects/pci/sys/modules/rman/rman.c#4 (text+ko) ====
@@ -9,8 +9,11 @@
#include <sys/sysctl.h>
#include <sys/systm.h>
+#define REGION_START 0x100
+#define REGION_END 0x200
+
struct rman test;
-struct resource *r;
+struct resource *r, *s;
/* XXX: Gross hack so we can do assertions. Copied from subr_rman.c. */
struct resource_i {
@@ -109,45 +112,41 @@
assert_rman_ok(void)
{
struct resource_i *i;
+ enum { UNKNOWN, FREE, BUSY } prev, state;
+ int seen_r, seen_s;
+ seen_r = 0;
+ seen_s = 0;
i = TAILQ_FIRST(&test.rm_list);
KASSERT(i != NULL, ("empty rman"));
- KASSERT(i->r_start == 0, ("first entry does not start at 0"));
- if (r == NULL) {
- /* There should be one free entry for the entire region. */
- KASSERT(i->r_flags == 0 && i->r_end == 100, ("bad entry"));
- return;
- }
+ KASSERT(i->r_start == REGION_START, ("first entry has bad start"));
+ prev = UNKNOWN;
- /*
- * If r does not start at 0, then there should be one free entry
- * before r.
- */
- if (rman_get_start(r) != 0) {
- KASSERT(i->r_flags == 0 && i->r_end + 1 == rman_get_start(r),
- ("bogus first free entry"));
- i = TAILQ_NEXT(i, r_link);
- }
+ while (i != NULL) {
+ state = i->r_flags == 0 ? FREE : BUSY;
+ KASSERT(i->r_start >= REGION_START && i->r_end <= REGION_END,
+ ("bad range"));
+ KASSERT(state != FREE || prev != FREE,
+ ("adjacent free regions"));
+ if (TAILQ_NEXT(i, r_link) != NULL)
+ KASSERT(i->r_end + 1 == TAILQ_NEXT(i->r_link)->r_start,
+ ("entries not adjacent"));
+ else
+ KASSERT(i->r_end == REGION_END, ("bad last entry"));
- /*
- * 'i' should now be the entry holding allocated resource 'r'
- */
- KASSERT(r == &i->r_r, ("resource mismatch"));
- KASSERT(i->r_flags & RF_ALLOCATED, ("r not allocated"));
-
- /*
- * If r does not end at 100, then there should be one free entry
- * after r.
- */
- if (i->r_end != 100) {
+ if (state == BUSY) {
+ if (r == &i->r_r)
+ seen_r++;
+ else if (s == &i->r_r)
+ seen_s++;
+ KASSERT(i->r_flags & RF_ALLOCATED,
+ ("busy entry not allocated"));
+ }
i = TAILQ_NEXT(i, r_link);
- KASSERT(i->r_flags == 0 && rman_get_end(r) + 1 == i->r_start,
- ("bogus last free entry"));
}
- /* 'i' should now reference the last entry ending at 100. */
- KASSERT(i->r_end == 100 && TAILQ_NEXT(i, r_link) == NULL,
- ("bad last entry"));
+ KASSERT(r == NULL || seen_r == 1, ("r mismatch"));
+ KASSERT(s == NULL || seen_s == 1, ("s mismatch"));
}
static void
@@ -158,14 +157,14 @@
#define ADJUST_SHOULD_FAIL(start, end, err) do { \
error = rman_adjust_resource(r, (start), (end)); \
if (error == (err)) \
- printf("Correctly failed to adjust to (%u, %u)\n", \
+ printf("Correctly failed to adjust to (%x, %x)\n", \
(start), (end)); \
else { \
if (error) \
- printf("Failed to adjust to (%u, %u) with %d\n", \
+ printf("Failed to adjust to (%x, %x) with %d\n", \
(start), (end), error); \
else \
- printf("Incorrectly adjusted to (%lu, %lu)\n", \
+ printf("Incorrectly adjusted to (%lx, %lx)\n", \
rman_get_start(r), rman_get_end(r)); \
return; \
} \
@@ -175,61 +174,122 @@
#define ADJUST_SHOULD_WORK(start, end) do { \
error = rman_adjust_resource(r, (start), (end)); \
if (error) { \
- printf("Failed to adjust to (%u, %u) with %d\n", \
+ printf("Failed to adjust to (%x, %x) with %d\n", \
(start), (end), error); \
return; \
} \
if (rman_get_start(r) != (start) || rman_get_end(r) != (end)) { \
- printf("Adjusted incorrectly, tried (%u, %u)," \
- " got (%lu, %lu)\n", (start), (end), \
+ printf("Adjusted incorrectly, tried (%x, %x)," \
+ " got (%lx, %lx)\n", (start), (end), \
rman_get_start(r), rman_get_end(r)); \
return; \
} \
- printf("Adjusted to (%lu, %lu)\n", rman_get_start(r), \
+ printf("Adjusted to (%lx, %lx)\n", rman_get_start(r), \
rman_get_end(r)); \
assert_rman_ok(); \
} while (0)
- /* Allocate a range in the middle: 30-60. */
+ /* Allocate a range in the middle: 0x130-0x160. */
if (r != NULL)
rman_release_resource(r);
- r = rman_reserve_resource(&test, 30, 60, 30, 0, NULL);
+ if (s != NULL) {
+ rman_release_resource(s);
+ s = NULL;
+ }
+ r = rman_reserve_resource(&test, 0x130, 0x160, 0x30, 0, NULL);
if (r == NULL) {
printf("Failed to allocate resource\n");
return;
}
- printf("Allocated (%lu, %lu)\n", rman_get_start(r), rman_get_end(r));
+ printf("Allocated (%lx, %lx)\n", rman_get_start(r), rman_get_end(r));
assert_rman_ok();
/* Non-overlapping adjust regions should fail. */
- ADJUST_SHOULD_FAIL(5, 10, EINVAL);
- ADJUST_SHOULD_FAIL(5, 29, EINVAL);
- ADJUST_SHOULD_FAIL(65, 70, EINVAL);
- ADJUST_SHOULD_FAIL(61, 70, EINVAL);
+ ADJUST_SHOULD_FAIL(0x105, 0x110, EINVAL);
+ ADJUST_SHOULD_FAIL(0x105, 0x12f, EINVAL);
+ ADJUST_SHOULD_FAIL(0x165, 0x170, EINVAL);
+ ADJUST_SHOULD_FAIL(0x161, 0x170, EINVAL);
/* Shrinking just one end should work. */
- ADJUST_SHOULD_WORK(35, 60);
- ADJUST_SHOULD_WORK(35, 55);
+ ADJUST_SHOULD_WORK(0x135, 0x160);
+ ADJUST_SHOULD_WORK(0x135, 0x155);
/* Expanding either end should work. */
- ADJUST_SHOULD_WORK(30, 55);
- ADJUST_SHOULD_WORK(30, 60);
+ ADJUST_SHOULD_WORK(0x130, 0x155);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
/* Shrinking both ends. */
- ADJUST_SHOULD_WORK(35, 55);
+ ADJUST_SHOULD_WORK(0x135, 0x155);
/* Expanding both ends. */
- ADJUST_SHOULD_WORK(30, 60);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
/* Shrinking one end, expanding the other. */
- ADJUST_SHOULD_WORK(35, 65);
- ADJUST_SHOULD_WORK(30, 60);
+ ADJUST_SHOULD_WORK(0x135, 0x165);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
/* Only overlapping with old region at one end. */
- ADJUST_SHOULD_WORK(60, 75);
- ADJUST_SHOULD_WORK(30, 60);
+ ADJUST_SHOULD_WORK(0x160, 0x175);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
+
+ /* Expanding to the edges and then shrinking. */
+ ADJUST_SHOULD_WORK(REGION_START, REGION_END);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
+
+ /* Attempting to adjust to a region outside of the rman should fail. */
+ ADJUST_SHOULD_FAIL(REGION_START / 2, 0x160, EBUSY);
+ ADJUST_SHOULD_FAIL(0x130, REGION_END + 0x100, EBUSY);
+
+ /* Allocate a second resource at 0x161 - 0x180. */
+ s = rman_reserve_resource(&test, 0x161, 0x180, 0x20, 0, NULL);
+ if (s == NULL) {
+ printf("Failed to allocate second resource\n");
+ return;
+ }
+ printf("Allocated (%lx, %lx)\n", rman_get_start(s), rman_get_end(s));
+ assert_rman_ok();
+
+ /* Trying to expand into 's' should fail. */
+ ADJUST_SHOULD_FAIL(0x130, 0x161, EBUSY);
+ ADJUST_SHOULD_FAIL(0x130, 0x170, EBUSY);
+
+ /* Shrink down to leave some room. */
+ ADJUST_SHOULD_WORK(0x130, 0x150);
+
+ /* Trying to expand into 's' should fail. */
+ ADJUST_SHOULD_FAIL(0x130, 0x170, EBUSY);
+
+ /* Should be able to expand back up to 's'. */
+ ADJUST_SHOULD_WORK(0x130, 0x158);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
+
+ /* Move 's' down below 'r'. */
+ rman_release_resource(s);
+ s = rman_reserve_resource(&test, 0x120, 0x12f, 0x10, 0, NULL);
+ if (s == NULL) {
+ printf("Failed to allocate third resource\n");
+ return;
+ }
+ printf("Allocated (%lx, %lx)\n", rman_get_start(s), rman_get_end(s));
+ assert_rman_ok();
+
+ /* Trying to expand into 's' should fail. */
+ ADJUST_SHOULD_FAIL(0x12f, 0x160, EBUSY);
+ ADJUST_SHOULD_FAIL(0x128, 0x160, EBUSY);
+
+ /* Shrink up to leave some room. */
+ ADJUST_SHOULD_WORK(0x140, 0x160);
+
+ /* Trying to expand into 's' should fail. */
+ ADJUST_SHOULD_FAIL(0x128, 0x160, EBUSY);
+
+ /* Should be able to expand back down to 's'. */
+ ADJUST_SHOULD_WORK(0x138, 0x160);
+ ADJUST_SHOULD_WORK(0x130, 0x160);
/* Cleaning up. */
+ rman_release_resource(s);
+ s = NULL;
rman_release_resource(r);
r = NULL;
assert_rman_ok();
@@ -255,16 +315,16 @@
{
int error;
- test.rm_start = 0;
+ test.rm_start = REGION_START;
test.rm_type = RMAN_ARRAY;
test.rm_descr = "Test manager";
- test.rm_end = 100;
+ test.rm_end = REGION_END;
error = rman_init(&test);
if (error) {
printf("Failed to initialize rman: %d\n", error);
return (error);
}
- error = rman_manage_region(&test, 0, 100);
+ error = rman_manage_region(&test, REGION_START, REGION_END);
if (error) {
printf("Failed to manage region: %d\n", error);
unload();
@@ -282,6 +342,10 @@
assert_rman_ok();
rman_release_resource(r);
}
+ if (s != NULL) {
+ assert_rman_ok();
+ rman_release_resource(s);
+ }
assert_rman_ok();
error = rman_fini(&test);
if (error)
More information about the p4-projects
mailing list