2015-07-21 14:43 GMT-03:00 Daniel Vetter <daniel@xxxxxxxx>: > On Tue, Jul 21, 2015 at 02:08:23PM -0300, Paulo Zanoni wrote: >> From: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx> >> >> A helpful function for when you want to read a whole debugfs file to a >> string and don't want to worry about opening and closing file >> descriptors and asserting buffer sizes. >> >> We've been using this already for kms_frontbuffer_tracking and >> kms_fbcon_fbt, so the only test with new code here is kms_fbc_crc. >> >> Also notice that for kms_fbc_crc we had to increase the buffer size >> since the file can sometimes be bigger than 64 bytes - depending on >> the reason why FBC is disabled. >> >> Of course, there are probably many other programs we can patch, but >> I'm not doing this now. >> >> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx> >> --- >> lib/igt_debugfs.c | 27 +++++++++++++++++++++++++++ >> lib/igt_debugfs.h | 1 + >> tests/kms_fbc_crc.c | 18 ++++-------------- >> tests/kms_fbcon_fbt.c | 25 ++++--------------------- >> tests/kms_frontbuffer_tracking.c | 33 ++++++++------------------------- >> 5 files changed, 44 insertions(+), 60 deletions(-) >> >> diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c >> index a2c6fe2..bc1bb05 100644 >> --- a/lib/igt_debugfs.c >> +++ b/lib/igt_debugfs.c >> @@ -185,6 +185,33 @@ FILE *igt_debugfs_fopen(const char *filename, >> return fopen(buf, mode); >> } >> >> +/** >> + * igt_debugfs_read: >> + * @filename: file name >> + * @buf: buffer where the contents will be stored, allocated by the caller >> + * @buf_size: size of the buffer >> + * >> + * This function opens the debugfs file, reads it, stores the content in the >> + * provided buffer, then closes the file. Users should make sure that the buffer >> + * provided is big enough to fit the whole file, plus one byte. > > Hm if we want a helper function to slurp in an entire file I'd go with one > that mallocs a suitably big buffer. That means more free calls, but imo > that's less onerous than getting buffer sizes right (well at least for a > library function). Since the files are usually very small, I'm not a big fan of the malloc/free version. But maybe we could have both the malloc and the non-malloc version in case we start having to deal with big debugfs files. > > If you don't like that I'd rename this with a __ prefix and do a > > #define igt_debugfs_read(file, buf) \ > __igt_debugfs_read((file), (buf), sizeof(buf)) > > That way it's fairly impossible to get the static sizing wrong at least. Good idea! I'll do this. > -Daniel > >> + */ >> +void igt_debugfs_read(const char *filename, char *buf, int buf_size) >> +{ >> + FILE *file; >> + size_t n_read; >> + >> + file = igt_debugfs_fopen(filename, "r"); >> + igt_assert(file); >> + >> + n_read = fread(buf, 1, buf_size - 1, file); >> + igt_assert(n_read > 0); >> + igt_assert(feof(file)); >> + >> + buf[n_read] = '\0'; >> + >> + igt_assert(fclose(file) == 0); >> +} >> + >> /* >> * Pipe CRC >> */ >> diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h >> index ece7148..a0bb75e 100644 >> --- a/lib/igt_debugfs.h >> +++ b/lib/igt_debugfs.h >> @@ -34,6 +34,7 @@ enum pipe; >> int igt_debugfs_open(const char *filename, int mode); >> FILE *igt_debugfs_fopen(const char *filename, >> const char *mode); >> +void igt_debugfs_read(const char *filename, char *buf, int buf_size); >> >> /* >> * Pipe CRC >> diff --git a/tests/kms_fbc_crc.c b/tests/kms_fbc_crc.c >> index f2a86a6..28cc165 100644 >> --- a/tests/kms_fbc_crc.c >> +++ b/tests/kms_fbc_crc.c >> @@ -215,14 +215,9 @@ static void fill_mmap_gtt(data_t *data, uint32_t handle, unsigned char color) >> >> static bool fbc_enabled(data_t *data) >> { >> - FILE *status; >> - char str[64] = {}; >> + char str[128] = {}; >> >> - status = igt_debugfs_fopen("i915_fbc_status", "r"); >> - igt_assert(status); >> - >> - igt_assert(fread(str, 1, sizeof(str) - 1, status) > 0); >> - fclose(status); >> + igt_debugfs_read("i915_fbc_status", str, sizeof(str)); >> return strstr(str, "FBC enabled") != NULL; >> } >> >> @@ -544,8 +539,7 @@ igt_main >> igt_skip_on_simulation(); >> >> igt_fixture { >> - char buf[64]; >> - FILE *status; >> + char buf[128]; >> >> data.drm_fd = drm_open_any_master(); >> kmstest_set_vt_graphics_mode(); >> @@ -554,11 +548,7 @@ igt_main >> >> igt_require_pipe_crc(); >> >> - status = igt_debugfs_fopen("i915_fbc_status", "r"); >> - igt_require_f(status, "No i915_fbc_status found\n"); >> - igt_assert_lt(0, fread(buf, 1, sizeof(buf), status)); >> - fclose(status); >> - buf[sizeof(buf) - 1] = '\0'; >> + igt_debugfs_read("i915_fbc_status", buf, sizeof(buf)); >> igt_require_f(!strstr(buf, "unsupported on this chipset"), >> "FBC not supported\n"); >> >> diff --git a/tests/kms_fbcon_fbt.c b/tests/kms_fbcon_fbt.c >> index f075014..c201fde 100644 >> --- a/tests/kms_fbcon_fbt.c >> +++ b/tests/kms_fbcon_fbt.c >> @@ -86,28 +86,11 @@ static void teardown_drm(struct drm_info *drm) >> igt_assert(close(drm->fd) == 0); >> } >> >> -static void debugfs_read(const char *filename, char *buf, int buf_size) >> -{ >> - FILE *file; >> - size_t n_read; >> - >> - file = igt_debugfs_fopen(filename, "r"); >> - igt_assert(file); >> - >> - n_read = fread(buf, 1, buf_size - 1, file); >> - igt_assert(n_read > 0); >> - igt_assert(feof(file)); >> - >> - buf[n_read] = '\0'; >> - >> - igt_assert(fclose(file) == 0); >> -} >> - >> static bool fbc_supported_on_chipset(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> return !strstr(buf, "FBC unsupported on this chipset\n"); >> } >> >> @@ -120,7 +103,7 @@ static bool fbc_is_enabled(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "FBC enabled\n"); >> } >> >> @@ -172,7 +155,7 @@ static bool psr_supported_on_chipset(void) >> { >> char buf[256]; >> >> - debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "Sink_Support: yes\n"); >> } >> >> @@ -185,7 +168,7 @@ static bool psr_is_enabled(void) >> { >> char buf[256]; >> >> - debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "\nActive: yes\n"); >> } >> >> diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c >> index e9be045..e162e91 100644 >> --- a/tests/kms_frontbuffer_tracking.c >> +++ b/tests/kms_frontbuffer_tracking.c >> @@ -556,28 +556,11 @@ static bool set_mode_for_params(struct modeset_params *params) >> return (rc == 0); >> } >> >> -static void debugfs_read(const char *filename, char *buf, int buf_size) >> -{ >> - FILE *file; >> - size_t n_read; >> - >> - file = igt_debugfs_fopen(filename, "r"); >> - igt_assert(file); >> - >> - n_read = fread(buf, 1, buf_size - 1, file); >> - igt_assert(n_read > 0); >> - igt_assert(feof(file)); >> - >> - buf[n_read] = '\0'; >> - >> - igt_assert(fclose(file) == 0); >> -} >> - >> static bool fbc_is_enabled(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "FBC enabled\n"); >> } >> >> @@ -585,7 +568,7 @@ static bool psr_is_enabled(void) >> { >> char buf[256]; >> >> - debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> return (strstr(buf, "\nActive: yes\n")); >> } >> >> @@ -596,7 +579,7 @@ static struct timespec fbc_get_last_action(void) >> char *action; >> ssize_t n_read; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> >> action = strstr(buf, "\nLast action:"); >> igt_assert(action); >> @@ -645,7 +628,7 @@ static void fbc_setup_last_action(void) >> char buf[128]; >> char *action; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> >> action = strstr(buf, "\nLast action:"); >> if (!action) { >> @@ -664,7 +647,7 @@ static bool fbc_is_compressing(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "\nCompressing: yes\n") != NULL; >> } >> >> @@ -677,7 +660,7 @@ static void fbc_setup_compressing(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> >> if (strstr(buf, "\nCompressing:")) >> fbc.supports_compressing = true; >> @@ -1187,7 +1170,7 @@ static bool fbc_supported_on_chipset(void) >> { >> char buf[128]; >> >> - debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_fbc_status", buf, ARRAY_SIZE(buf)); >> return !strstr(buf, "FBC unsupported on this chipset\n"); >> } >> >> @@ -1211,7 +1194,7 @@ static bool psr_sink_has_support(void) >> { >> char buf[256]; >> >> - debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> + igt_debugfs_read("i915_edp_psr_status", buf, ARRAY_SIZE(buf)); >> return strstr(buf, "Sink_Support: yes\n"); >> } >> >> -- >> 2.1.4 >> >> _______________________________________________ >> Intel-gfx mailing list >> Intel-gfx@xxxxxxxxxxxxxxxxxxxxx >> http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Paulo Zanoni _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx