igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj

This patch adds support to verify pread/pwrite for non-shmem backed
objects. It also shows the pread/pwrite speed.
It also tests speeds for pread with and without user side page faults

v2: Fixed Rebase conflicts (Ankit)

v3: Precalculating values to avoid redundant function calls (Dave)
Replaced igt_subtest by igt_subtest_f, added asserts for mmap, corrected
indentation (Tvrtko)

v4: Updated data types to avoid redundant type conversions (Tvrtko)
Corrected pagefault-pread time calculation (Ankit)

Signed-off-by: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Thomas Wood <thomas.wood@intel.com>
This commit is contained in:
Ankitprasad Sharma 2015-12-02 14:54:51 +05:30 committed by Thomas Wood
parent 70c3be83a0
commit 48c945322b
2 changed files with 150 additions and 13 deletions

View File

@ -40,6 +40,10 @@
#include "drm.h"
#define OBJECT_SIZE 16384
#define LARGE_OBJECT_SIZE 1024 * 1024
#define KGRN "\x1B[32m"
#define KRED "\x1B[31m"
#define KNRM "\x1B[0m"
static void do_gem_read(int fd, uint32_t handle, void *buf, int len, int loops)
{
@ -75,12 +79,16 @@ static const char *bytes_per_sec(char *buf, double v)
uint32_t *src, dst;
uint32_t *dst_user, src_stolen, large_stolen;
uint32_t *stolen_pf_user, *stolen_nopf_user;
int fd, count;
int main(int argc, char **argv)
{
int object_size = 0;
uint32_t buf[20];
double usecs;
char buf[100];
char* bps;
const struct {
int level;
const char *name;
@ -105,6 +113,8 @@ int main(int argc, char **argv)
dst = gem_create(fd, object_size);
src = malloc(object_size);
src_stolen = gem_create_stolen(fd, object_size);
dst_user = malloc(object_size);
}
igt_subtest("basic") {
@ -114,10 +124,10 @@ int main(int argc, char **argv)
gettimeofday(&start, NULL);
do_gem_read(fd, dst, src, object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to pread %d bytes x %6d: %7.3fµs, %s\n",
object_size, count,
elapsed(&start, &end, count),
bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
object_size, count, usecs, bps);
fflush(stdout);
}
}
@ -132,18 +142,102 @@ int main(int argc, char **argv)
gettimeofday(&start, NULL);
do_gem_read(fd, dst, src, object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to %s pread %d bytes x %6d: %7.3fµs, %s\n",
c->name, object_size, count,
elapsed(&start, &end, count),
bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
c->name, object_size, count, usecs, bps);
fflush(stdout);
}
}
}
igt_subtest("stolen-normal") {
for (count = 1; count <= 1<<17; count <<= 1) {
struct timeval start, end;
gettimeofday(&start, NULL);
do_gem_read(fd, src_stolen, dst_user, object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to pread %d bytes x %6d: %7.3fµs, %s\n",
object_size, count, usecs, bps);
fflush(stdout);
}
}
for (c = cache; c->level != -1; c++) {
igt_subtest_f("stolen-%s", c->name) {
gem_set_caching(fd, src_stolen, c->level);
for (count = 1; count <= 1<<17; count <<= 1) {
struct timeval start, end;
gettimeofday(&start, NULL);
do_gem_read(fd, src_stolen, dst_user,
object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to stolen-%s pread %d bytes x %6d: %7.3fµs, %s\n",
c->name, object_size, count, usecs, bps);
fflush(stdout);
}
}
}
/* List the time taken in pread operation for stolen objects, with
* and without the overhead of page fault handling on accessing the
* user space buffer
*/
igt_subtest("pagefault-pread") {
large_stolen = gem_create_stolen(fd, LARGE_OBJECT_SIZE);
stolen_nopf_user = (uint32_t *) mmap(NULL, LARGE_OBJECT_SIZE,
PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE,
-1, 0);
igt_assert(stolen_nopf_user);
for (count = 1; count <= 10; count ++) {
struct timeval start, end;
double t_elapsed = 0;
gettimeofday(&start, NULL);
do_gem_read(fd, large_stolen, stolen_nopf_user,
LARGE_OBJECT_SIZE, 1);
gettimeofday(&end, NULL);
t_elapsed = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/t_elapsed*1e6);
igt_info("Pagefault-N - Time to pread %d bytes: %7.3fµs, %s\n",
LARGE_OBJECT_SIZE, t_elapsed, bps);
stolen_pf_user = (uint32_t *) mmap(NULL, LARGE_OBJECT_SIZE,
PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE,
-1, 0);
igt_assert(stolen_pf_user);
gettimeofday(&start, NULL);
do_gem_read(fd, large_stolen, stolen_pf_user,
LARGE_OBJECT_SIZE, 1);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Pagefault-Y - Time to pread %d bytes: %7.3fµs, %s%s%s\n",
LARGE_OBJECT_SIZE, usecs,
t_elapsed < usecs ? KGRN : KRED, bps, KNRM);
fflush(stdout);
munmap(stolen_pf_user, LARGE_OBJECT_SIZE);
}
munmap(stolen_nopf_user, LARGE_OBJECT_SIZE);
gem_close(fd, large_stolen);
}
igt_fixture {
free(src);
gem_close(fd, dst);
free(dst_user);
gem_close(fd, src_stolen);
close(fd);
}

View File

@ -132,12 +132,15 @@ static void test_big_gtt(int fd, int scale)
}
uint32_t *src, dst;
uint32_t *src_user, dst_stolen;
int fd;
int main(int argc, char **argv)
{
int object_size = 0;
uint32_t buf[20];
double usecs;
char* bps;
char buf[100];
int count;
const struct {
int level;
@ -164,6 +167,8 @@ int main(int argc, char **argv)
dst = gem_create(fd, object_size);
src = malloc(object_size);
dst_stolen = gem_create_stolen(fd, object_size);
src_user = malloc(object_size);
}
igt_subtest("basic") {
@ -173,10 +178,10 @@ int main(int argc, char **argv)
gettimeofday(&start, NULL);
do_gem_write(fd, dst, src, object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to pwrite %d bytes x %6d: %7.3fµs, %s\n",
object_size, count,
elapsed(&start, &end, count),
bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
object_size, count, usecs, bps);
fflush(stdout);
}
}
@ -191,10 +196,46 @@ int main(int argc, char **argv)
gettimeofday(&start, NULL);
do_gem_write(fd, dst, src, object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to %s pwrite %d bytes x %6d: %7.3fµs, %s\n",
c->name, object_size, count, usecs, bps);
fflush(stdout);
}
}
}
igt_subtest("stolen-normal") {
for (count = 1; count <= 1<<17; count <<= 1) {
struct timeval start, end;
gettimeofday(&start, NULL);
do_gem_write(fd, dst_stolen, src_user,
object_size, count);
gettimeofday(&end, NULL);
usecs = elapsed(&start, &end, count);
bps = bytes_per_sec(buf, object_size/usecs*1e6);
igt_info("Time to pwrite %d bytes x %6d: %7.3fµs, %s\n",
object_size, count, usecs, bps);
fflush(stdout);
}
}
for (c = cache; c->level != -1; c++) {
igt_subtest_f("stolen-%s", c->name) {
gem_set_caching(fd, dst, c->level);
for (count = 1; count <= 1<<17; count <<= 1) {
struct timeval start, end;
gettimeofday(&start, NULL);
do_gem_write(fd, dst_stolen, src_user,
object_size, count);
gettimeofday(&end, NULL);
bps = bytes_per_sec(buf,
object_size/usecs*1e6);
igt_info("Time to stolen-%s pwrite %d bytes x %6d: %7.3fµs, %s\n",
c->name, object_size, count,
elapsed(&start, &end, count),
bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
usecs, bps);
fflush(stdout);
}
}
@ -203,6 +244,8 @@ int main(int argc, char **argv)
igt_fixture {
free(src);
gem_close(fd, dst);
free(src_user);
gem_close(fd, dst_stolen);
}
igt_subtest("big-cpu")