mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/domain: introduce DOMID_ANY
Add a new symbol DOMID_ANY to improve the readability of the code.
Update all relevant domid_alloc() call sites and harden the domid_alloc()
input value check.
Also, fix problem with passing invalid domain IDs in
XEN_DOMCTL_createdomain: turns out libxl__domain_make() (toolstack)
uses 0xffff as domain ID.
Fix failing tools tests too.
Amends: 2d50650607 ("xen/domain: unify domain ID allocation")
Signed-off-by: Denis Mukhin <dmukhin@ford.com>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
a472f640dd
commit
23e2479ff9
11 files changed
+29
-17
No files matched your search
@@ -681,8 +681,10 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config,
|
||||
continue;
|
||||
|
||||
local_domid = v;
|
||||
} else if (libxl_domid_valid_guest(info->domid)) {
|
||||
local_domid = info->domid;
|
||||
} else {
|
||||
local_domid = info->domid; /* May not be valid */
|
||||
local_domid = DOMID_ANY;
|
||||
}
|
||||
|
||||
ret = xc_domain_create(ctx->xch, &local_domid, &create);
|
||||
|
||||
@@ -41,6 +41,7 @@ extern unsigned long find_next_zero_bit(const unsigned long *addr,
|
||||
|
||||
#define DOMID_FIRST_RESERVED (100)
|
||||
#define DOMID_INVALID (101)
|
||||
#define DOMID_ANY (102)
|
||||
|
||||
#endif /* _TEST_HARNESS_ */
|
||||
|
||||
|
||||
@@ -41,20 +41,20 @@ int main(int argc, char **argv)
|
||||
domid_free(expected);
|
||||
|
||||
/*
|
||||
* Test that that two consecutive calls of domid_alloc(DOMID_INVALID)
|
||||
* Test that that two consecutive calls of domid_alloc(DOMID_ANY)
|
||||
* will never return the same ID.
|
||||
* NB: ID#0 is reserved and shall not be allocated by
|
||||
* domid_alloc(DOMID_INVALID).
|
||||
* domid_alloc(DOMID_ANY).
|
||||
*/
|
||||
for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
|
||||
{
|
||||
allocated = domid_alloc(DOMID_INVALID);
|
||||
allocated = domid_alloc(DOMID_ANY);
|
||||
verify(allocated == expected,
|
||||
"TEST 3: expected %u allocated %u\n", expected, allocated);
|
||||
}
|
||||
for ( expected = 1; expected < DOMID_FIRST_RESERVED; expected++ )
|
||||
{
|
||||
allocated = domid_alloc(DOMID_INVALID);
|
||||
allocated = domid_alloc(DOMID_ANY);
|
||||
verify(allocated == DOMID_INVALID,
|
||||
"TEST 4: expected %u allocated %u\n", DOMID_INVALID, allocated);
|
||||
}
|
||||
@@ -64,7 +64,7 @@ int main(int argc, char **argv)
|
||||
domid_free(expected);
|
||||
for ( expected = 1; expected < DOMID_FIRST_RESERVED / 2; expected++ )
|
||||
{
|
||||
allocated = domid_alloc(DOMID_INVALID);
|
||||
allocated = domid_alloc(DOMID_ANY);
|
||||
verify(allocated == expected,
|
||||
"TEST 5: expected %u allocated %u\n", expected, allocated);
|
||||
}
|
||||
@@ -72,7 +72,7 @@ int main(int argc, char **argv)
|
||||
/* Re-allocate last ID from [1..DOMID_FIRST_RESERVED - 1]. */
|
||||
expected = DOMID_FIRST_RESERVED - 1;
|
||||
domid_free(DOMID_FIRST_RESERVED - 1);
|
||||
allocated = domid_alloc(DOMID_INVALID);
|
||||
allocated = domid_alloc(DOMID_ANY);
|
||||
verify(allocated == expected,
|
||||
"TEST 6: expected %u allocated %u\n", expected, allocated);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ static unsigned int nr_failures;
|
||||
#define MB_PAGES(x) (MB(x) / XC_PAGE_SIZE)
|
||||
|
||||
static xc_interface *xch;
|
||||
static uint32_t domid = DOMID_INVALID;
|
||||
static uint32_t domid = DOMID_ANY;
|
||||
|
||||
static xc_physinfo_t physinfo;
|
||||
|
||||
@@ -142,7 +142,7 @@ static void run_tests(void)
|
||||
rc = xc_domain_destroy(xch, domid);
|
||||
|
||||
/* Cancel the cleanup path, even in the case of an error. */
|
||||
domid = DOMID_INVALID;
|
||||
domid = DOMID_ANY;
|
||||
|
||||
if ( rc )
|
||||
return fail(" Failed to destroy domain: %d - %s\n",
|
||||
@@ -171,7 +171,7 @@ int main(int argc, char **argv)
|
||||
|
||||
run_tests();
|
||||
|
||||
if ( domid != DOMID_INVALID )
|
||||
if ( domid != DOMID_ANY )
|
||||
{
|
||||
rc = xc_domain_destroy(xch, domid);
|
||||
if ( rc )
|
||||
|
||||
@@ -22,7 +22,7 @@ static unsigned int nr_failures;
|
||||
static xc_interface *xch;
|
||||
static xendevicemodel_handle *dh;
|
||||
static xenforeignmemory_handle *fh;
|
||||
static uint32_t domid;
|
||||
static uint32_t domid = DOMID_ANY;
|
||||
|
||||
static struct xen_domctl_createdomain create = {
|
||||
.flags = (XEN_DOMCTL_CDF_hvm |
|
||||
|
||||
@@ -178,7 +178,7 @@ static void test_domain_configurations(void)
|
||||
for ( unsigned int i = 0; i < ARRAY_SIZE(tests); ++i )
|
||||
{
|
||||
struct test *t = &tests[i];
|
||||
uint32_t domid = 0;
|
||||
uint32_t domid = DOMID_ANY;
|
||||
int rc;
|
||||
xen_pfn_t ram[1] = { 0 };
|
||||
|
||||
|
||||
@@ -362,7 +362,7 @@ static void test_def_max_policies(void)
|
||||
|
||||
static void test_guest(struct xen_domctl_createdomain *c)
|
||||
{
|
||||
uint32_t domid = 0;
|
||||
uint32_t domid = DOMID_ANY;
|
||||
int rc;
|
||||
|
||||
rc = xc_domain_create(xch, &domid, c);
|
||||
|
||||
@@ -871,7 +871,7 @@ void __init create_domUs(void)
|
||||
if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED )
|
||||
panic("No more domain IDs available\n");
|
||||
|
||||
domid = domid_alloc(DOMID_INVALID);
|
||||
domid = domid_alloc(DOMID_ANY);
|
||||
if ( domid == DOMID_INVALID )
|
||||
panic("Error allocating ID for domain %s\n", dt_node_name(node));
|
||||
|
||||
|
||||
+1
-2
@@ -409,8 +409,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
|
||||
|
||||
case XEN_DOMCTL_createdomain:
|
||||
{
|
||||
/* NB: ID#0 is reserved, find the first suitable ID instead. */
|
||||
domid_t domid = domid_alloc(op->domain ?: DOMID_INVALID);
|
||||
domid_t domid = domid_alloc(op->domain);
|
||||
|
||||
if ( domid == DOMID_INVALID )
|
||||
{
|
||||
|
||||
+4
-1
@@ -19,7 +19,7 @@ static DECLARE_BITMAP(domid_bitmap, DOMID_FIRST_RESERVED);
|
||||
* @param domid Domain ID hint:
|
||||
* - If an explicit domain ID is provided, verify its availability and use it
|
||||
* if ID is not used;
|
||||
* - If DOMID_INVALID is provided, search [1..DOMID_FIRST_RESERVED-1] range,
|
||||
* - If DOMID_ANY is provided, search [1..DOMID_FIRST_RESERVED-1] range,
|
||||
* starting from the last used ID. Implementation guarantees that two
|
||||
* consecutive calls will never return the same ID. ID#0 is reserved for
|
||||
* the first boot domain (currently, dom0) and excluded from the allocation
|
||||
@@ -31,6 +31,9 @@ domid_t domid_alloc(domid_t domid)
|
||||
{
|
||||
static domid_t domid_last;
|
||||
|
||||
if ( domid >= DOMID_FIRST_RESERVED && domid != DOMID_ANY )
|
||||
return DOMID_INVALID;
|
||||
|
||||
spin_lock(&domid_lock);
|
||||
|
||||
/* Exact match. */
|
||||
|
||||
@@ -608,6 +608,13 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
|
||||
/* DOMID_INVALID is used to identify pages with unknown owner. */
|
||||
#define DOMID_INVALID xen_mk_uint(0x7FF4)
|
||||
|
||||
/*
|
||||
* DOMID_ANY is used to signal no specific domain ID requested.
|
||||
* Handler should pick a valid ID, or handle it as a wildcard value
|
||||
* depending on the context.
|
||||
*/
|
||||
#define DOMID_ANY xen_mk_uint(0x7FF5)
|
||||
|
||||
/* Idle domain. */
|
||||
#define DOMID_IDLE xen_mk_uint(0x7FFF)
|
||||
|
||||
|
||||