mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-22 09:58:09 +00:00
zdtm: test MEMBARRIER_CMD_GLOBAL_EXPEDITED migration
Check membarrier registration both ways: 1. By issuing membarrier commands and checking if they succeed. 2. By issuing MEMBARRIER_CMD_GET_REGISTRATIONS. The first way is needed for older kernels. The second way is needed to test MEMBARRIER_CMD_GLOBAL_EXPEDITED. Signed-off-by: Michal Clapinski <mclapinski@google.com>
This commit is contained in:
parent
2ba8727822
commit
8caf460b9c
@ -8,14 +8,16 @@ const char *test_author = "Michał Mirosław <emmir@google.com>";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Define membarrier() CMDs to avoid depending on exact kernel header version.
|
* Define membarrier() CMDs to avoid depending on exact kernel header version.
|
||||||
* FIXME: use MEMBARRIER_CMD_GET_REGISTRATIONS if supported by kernel.
|
|
||||||
*/
|
*/
|
||||||
|
#define MEMBARRIER_CMD_GLOBAL_EXPEDITED (1 << 1)
|
||||||
|
#define MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED (1 << 2)
|
||||||
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED (1 << 3)
|
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED (1 << 3)
|
||||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED (1 << 4)
|
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED (1 << 4)
|
||||||
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE (1 << 5)
|
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE (1 << 5)
|
||||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE (1 << 6)
|
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE (1 << 6)
|
||||||
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ (1 << 7)
|
#define MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ (1 << 7)
|
||||||
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ (1 << 8)
|
#define MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ (1 << 8)
|
||||||
|
#define MEMBARRIER_CMD_GET_REGISTRATIONS (1 << 9)
|
||||||
|
|
||||||
static int membarrier(int cmd, unsigned int flags, int cpu_id)
|
static int membarrier(int cmd, unsigned int flags, int cpu_id)
|
||||||
{
|
{
|
||||||
@ -27,9 +29,14 @@ static const struct {
|
|||||||
int register_cmd;
|
int register_cmd;
|
||||||
int execute_cmd;
|
int execute_cmd;
|
||||||
} membarrier_cmds[] = {
|
} membarrier_cmds[] = {
|
||||||
{ "", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, MEMBARRIER_CMD_PRIVATE_EXPEDITED },
|
{ "GLOBAL_EXPEDITED", MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED,
|
||||||
{ "_SYNC_CORE", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE, MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE },
|
MEMBARRIER_CMD_GLOBAL_EXPEDITED },
|
||||||
{ "_RSEQ", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ, MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ },
|
{ "PRIVATE_EXPEDITED", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED,
|
||||||
|
MEMBARRIER_CMD_PRIVATE_EXPEDITED },
|
||||||
|
{ "PRIVATE_EXPEDITED_SYNC_CORE", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE,
|
||||||
|
MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE },
|
||||||
|
{ "PRIVATE_EXPEDITED_RSEQ", MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ,
|
||||||
|
MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ },
|
||||||
};
|
};
|
||||||
static const int n_membarrier_cmds = sizeof(membarrier_cmds) / sizeof(*membarrier_cmds);
|
static const int n_membarrier_cmds = sizeof(membarrier_cmds) / sizeof(*membarrier_cmds);
|
||||||
|
|
||||||
@ -49,10 +56,10 @@ static int register_membarriers(void)
|
|||||||
if (~barriers_supported & membarrier_cmds[i].register_cmd)
|
if (~barriers_supported & membarrier_cmds[i].register_cmd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
barriers_registered |= membarrier_cmds[i].execute_cmd;
|
barriers_registered |= membarrier_cmds[i].register_cmd;
|
||||||
|
|
||||||
if (membarrier(membarrier_cmds[i].register_cmd, 0, 0) < 0) {
|
if (membarrier(membarrier_cmds[i].register_cmd, 0, 0) < 0) {
|
||||||
pr_perror("membarrier(REGISTER_PRIVATE_EXPEDITED%s)", membarrier_cmds[i].name_suffix);
|
pr_perror("membarrier(REGISTER_%s)", membarrier_cmds[i].name_suffix);
|
||||||
all_ok = false;
|
all_ok = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -71,15 +78,15 @@ static int register_membarriers(void)
|
|||||||
return barriers_registered;
|
return barriers_registered;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool check_membarriers(int barriers_registered)
|
static bool check_membarriers_compat(int barriers_registered)
|
||||||
{
|
{
|
||||||
bool all_ok = true;
|
bool all_ok = true;
|
||||||
|
|
||||||
for (int i = 0; i < n_membarrier_cmds; ++i) {
|
for (int i = 0; i < n_membarrier_cmds; ++i) {
|
||||||
if (~barriers_registered & membarrier_cmds[i].execute_cmd)
|
if (~barriers_registered & membarrier_cmds[i].register_cmd)
|
||||||
continue;
|
continue;
|
||||||
if (membarrier(membarrier_cmds[i].execute_cmd, 0, 0) < 0) {
|
if (membarrier(membarrier_cmds[i].execute_cmd, 0, 0) < 0) {
|
||||||
pr_perror("membarrier(PRIVATE_EXPEDITED%s)", membarrier_cmds[i].name_suffix);
|
pr_perror("membarrier(%s)", membarrier_cmds[i].name_suffix);
|
||||||
all_ok = false;
|
all_ok = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,6 +97,32 @@ static bool check_membarriers(int barriers_registered)
|
|||||||
return all_ok;
|
return all_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool check_membarriers_get_registrations(int barriers_registered)
|
||||||
|
{
|
||||||
|
int ret = membarrier(MEMBARRIER_CMD_GET_REGISTRATIONS, 0, 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (errno == EINVAL) {
|
||||||
|
test_msg("membarrier(MEMBARRIER_CMD_GET_REGISTRATIONS) not supported by running kernel");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
fail("membarrier(MEMBARRIER_CMD_GET_REGISTRATIONS)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (ret != barriers_registered) {
|
||||||
|
fail("MEMBARRIER_CMD_GET_REGISTRATIONS check failed, expected: %d, got: %d",
|
||||||
|
barriers_registered, ret);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool check_membarriers(int barriers_registered)
|
||||||
|
{
|
||||||
|
return check_membarriers_compat(barriers_registered) &&
|
||||||
|
check_membarriers_get_registrations(barriers_registered);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int barriers_registered;
|
int barriers_registered;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user