Add sort-flush test
This commit is contained in:
parent
cd0d0eb7c7
commit
929af74d3f
@ -4,6 +4,7 @@
|
|||||||
test_emu(flush-overhead.c DISABLED)
|
test_emu(flush-overhead.c DISABLED)
|
||||||
test_emu(flush.c)
|
test_emu(flush.c)
|
||||||
test_emu(sort.c SORT)
|
test_emu(sort.c SORT)
|
||||||
|
test_emu(sort-flush.c SORT)
|
||||||
test_emu(empty-sort.c SORT)
|
test_emu(empty-sort.c SORT)
|
||||||
test_emu(sort-first-and-full-ring.c SORT
|
test_emu(sort-first-and-full-ring.c SORT
|
||||||
SHOULD_FAIL REGEX "cannot find a event previous to clock")
|
SHOULD_FAIL REGEX "cannot find a event previous to clock")
|
||||||
|
162
test/emu/ovni/sort-flush.c
Normal file
162
test/emu/ovni/sort-flush.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/* Copyright (c) 2023 Barcelona Supercomputing Center (BSC)
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "compat.h"
|
||||||
|
#include "instr.h"
|
||||||
|
#include "ovni.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_jumbo(uint8_t *buf, size_t size, int64_t clock)
|
||||||
|
{
|
||||||
|
struct ovni_ev ev = {0};
|
||||||
|
ovni_ev_set_mcv(&ev, "OUj");
|
||||||
|
ovni_ev_set_clock(&ev, clock);
|
||||||
|
ovni_ev_jumbo_emit(&ev, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit(char *mcv, int64_t clock)
|
||||||
|
{
|
||||||
|
struct ovni_ev ev = {0};
|
||||||
|
ovni_ev_set_mcv(&ev, mcv);
|
||||||
|
ovni_ev_set_clock(&ev, clock);
|
||||||
|
ovni_ev_emit(&ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill(long room)
|
||||||
|
{
|
||||||
|
/* Flush the buffer so we begin with a known size: the two flush
|
||||||
|
* events */
|
||||||
|
ovni_flush();
|
||||||
|
|
||||||
|
size_t ev_size = sizeof(struct ovni_ev_header);
|
||||||
|
|
||||||
|
/* Skip the jumbo event header and payload size */
|
||||||
|
size_t header = ev_size + 4;
|
||||||
|
|
||||||
|
size_t payload_size = OVNI_MAX_EV_BUF - room - header;
|
||||||
|
uint8_t *payload_buf = calloc(1, payload_size);
|
||||||
|
|
||||||
|
/* Fill the stream buffer */
|
||||||
|
int64_t t = ovni_clock_now();
|
||||||
|
emit_jumbo(payload_buf, payload_size, t);
|
||||||
|
|
||||||
|
/* Leave some room to prevent clashes */
|
||||||
|
sleep_us(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_flush_after_sort(void)
|
||||||
|
{
|
||||||
|
/* In this test we check with the flush events OF[ and OF]
|
||||||
|
* immediately after the sort region opening event OU[.
|
||||||
|
*
|
||||||
|
* $ ovnidump thread.150439.obs | cut -c -72
|
||||||
|
* ovnidump: INFO: loaded 1 streams
|
||||||
|
* 1778730985500133 +1778730985500133 OHx :00:00:00:00:ff:ff:ff:ff:00:0
|
||||||
|
* 1778730985503455 +3322 OF[
|
||||||
|
* 1778730985508228 +4773 OF]
|
||||||
|
* 1778730985666648 +158420 OUj :cc:ff:1f:00:00:00:00:00:00:00:00:00
|
||||||
|
* 1778730985666649 +1 OU[
|
||||||
|
* 1778730987234771 +1568122 OF[ <-- here we inject the
|
||||||
|
* 1778730988411065 +1176294 OF] flush events
|
||||||
|
* 1778730985666550 -2744515 KCI
|
||||||
|
* 1778730985666551 +1 KCO
|
||||||
|
* 1778730985666652 +101 OU]
|
||||||
|
* 1778730988411997 +2745345 OHe
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Skip the two flush events and leave room for OU[ */
|
||||||
|
fill(3 * sizeof(struct ovni_ev_header));
|
||||||
|
|
||||||
|
int64_t t = ovni_clock_now();
|
||||||
|
|
||||||
|
/* Emit the opening of the sort region */
|
||||||
|
emit("OU[", t++);
|
||||||
|
|
||||||
|
/* This should cause the stream to be flush and inject the two
|
||||||
|
* extra events OF[ and OF] */
|
||||||
|
emit("KCO", t++ - 100);
|
||||||
|
|
||||||
|
/* Finish the kernel event */
|
||||||
|
emit("KCI", t++ - 100);
|
||||||
|
|
||||||
|
/* Finish the sort region */
|
||||||
|
emit("OU]", ovni_clock_now());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_unsorted(void)
|
||||||
|
{
|
||||||
|
/* Test unsorted events in the sorting region */
|
||||||
|
|
||||||
|
sleep_us(100); /* Make room */
|
||||||
|
int64_t t = ovni_clock_now();
|
||||||
|
emit("OU[", t);
|
||||||
|
emit("KCI", t + 2 - 100); /* out of order */
|
||||||
|
emit("KCO", t + 1 - 100);
|
||||||
|
emit("OU]", t + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_overlap(void)
|
||||||
|
{
|
||||||
|
/* Test overlapping events among regions */
|
||||||
|
|
||||||
|
int64_t t = ovni_clock_now();
|
||||||
|
/* Round time next 1 microsecond to be easier to read */
|
||||||
|
t += 1000 - (t % 1000);
|
||||||
|
|
||||||
|
emit("OU[", t + 20);
|
||||||
|
emit("KCO", t + 10);
|
||||||
|
emit("KCI", t + 11);
|
||||||
|
emit("OU]", t + 21);
|
||||||
|
emit("OU[", t + 22);
|
||||||
|
emit("KCO", t + 12); /* These two shold appear in the first region */
|
||||||
|
emit("KCI", t + 13);
|
||||||
|
emit("OU]", t + 23);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_overlap_flush(void)
|
||||||
|
{
|
||||||
|
/* Test overlapping events with flush events too */
|
||||||
|
|
||||||
|
/* Skip the two flush events and leave room for OU[ */
|
||||||
|
sleep_us(100);
|
||||||
|
fill(5 * sizeof(struct ovni_ev_header));
|
||||||
|
int64_t t = ovni_clock_now();
|
||||||
|
|
||||||
|
/* Round time next 1 microsecond to be easier to read */
|
||||||
|
t += 1000 - (t % 1000);
|
||||||
|
|
||||||
|
emit("OU[", t + 20);
|
||||||
|
emit("KCO", t + 10);
|
||||||
|
emit("KCI", t + 11);
|
||||||
|
emit("OU]", t + 21);
|
||||||
|
/* We need realistic clock due to incoming flush */
|
||||||
|
emit("OU[", ovni_clock_now());
|
||||||
|
/* Flush here */
|
||||||
|
emit("KCO", t + 12);
|
||||||
|
emit("KCI", t + 13);
|
||||||
|
emit("OU]", ovni_clock_now());
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
/* This program tests various cases in which flush events are placed in
|
||||||
|
* the sorting region, disrupting the order. */
|
||||||
|
|
||||||
|
instr_start(0, 1);
|
||||||
|
test_flush_after_sort();
|
||||||
|
test_unsorted();
|
||||||
|
test_overlap();
|
||||||
|
test_overlap_flush();
|
||||||
|
instr_end();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user