@@ -5,7 +5,7 @@ NAME
----
tracefs_instance_file_open,
-tracefs_instance_file_write, tracefs_instance_file_append, tracefs_instance_file_clear,
+tracefs_instance_file_write, tracefs_instance_file_write_number, tracefs_instance_file_append, tracefs_instance_file_clear,
tracefs_instance_file_read, tracefs_instance_file_read_number - Work with files in tracing instances.
SYNOPSIS
@@ -16,6 +16,7 @@ SYNOPSIS
int *tracefs_instance_file_open*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int _mode_);
int *tracefs_instance_file_write*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
+int *tracefs_instance_file_write_number*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, size_t _val_);
int *tracefs_instance_file_append*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
int *tracefs_instance_file_clear*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_);
char pass:[*]*tracefs_instance_file_read*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int pass:[*]_psize_);
@@ -38,6 +39,10 @@ The *tracefs_instance_file_write()* function writes a string _str_ in a _file_ f
the given _instance_, without the terminating NULL character. When opening the file, this function
tries to truncates the size of the file to zero, which clears all previously existing settings.
+The *tracefs_instance_file_write_number()* function converts _val_ into a string
+and then writes it to the given file. This is a helper function that does the number
+conversion to string and then calls *tracefs_instance_file_write()*.
+
The *tracefs_instance_file_append()* function writes a string _str_ in a _file_ from
the given _instance_, without the terminating NULL character. This function is similar to
*tracefs_instance_file_write()*, but the existing content of the is not cleared. Thus the
@@ -61,6 +66,8 @@ closed with *close*(3). In case of an error, -1 is returned.
The *tracefs_instance_file_write()* function returns the number of written bytes,
or -1 in case of an error.
+The *tracefs_instance_file_write_number()* function returns 0 on success and -1 on error.
+
The *tracefs_instance_file_append()* function returns the number of written bytes,
or -1 in case of an error.
@@ -33,6 +33,7 @@ Trace instances:
char pass:[*]*tracefs_instance_get_dir*(struct tracefs_instance pass:[*]_instance_);
int *tracefs_instance_file_open*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int _mode_);
int *tracefs_instance_file_write*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
+ int *tracefs_instance_file_write_number*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, size_t _val_);
int *tracefs_instance_file_append*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
int *tracefs_instance_file_clear*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_);
char pass:[*]*tracefs_instance_file_read*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int pass:[*]_psize_);
@@ -36,6 +36,8 @@ tracefs_instance_get_file(struct tracefs_instance *instance, const char *file);
char *tracefs_instance_get_dir(struct tracefs_instance *instance);
int tracefs_instance_file_write(struct tracefs_instance *instance,
const char *file, const char *str);
+int tracefs_instance_file_write_number(struct tracefs_instance *instance,
+ const char *file, size_t val);
int tracefs_instance_file_append(struct tracefs_instance *instance,
const char *file, const char *str);
int tracefs_instance_file_clear(struct tracefs_instance *instance,
@@ -493,6 +493,27 @@ int tracefs_instance_file_write(struct tracefs_instance *instance,
return instance_file_write(instance, file, str, O_WRONLY | O_TRUNC);
}
+/**
+ * tracefs_instance_file_write_number - Write integer from a trace file.
+ * @instance: ftrace instance, can be NULL for the top instance
+ * @file: name of the file
+ * @res: The integer to write to @file
+ *
+ * Returns 0 if the write succeeds, -1 on error.
+ */
+int tracefs_instance_file_write_number(struct tracefs_instance *instance,
+ const char *file, size_t val)
+{
+ char buf[64];
+ int ret;
+
+ snprintf(buf, 64, "%zd\n", val);
+
+ ret = tracefs_instance_file_write(instance, file, buf);
+
+ return ret > 1 ? 0 : -1;
+}
+
/**
* tracefs_instance_file_append - Append to a trace file of specific instance.
* @instance: ftrace instance, can be NULL for the top instance.
@@ -488,7 +488,7 @@ static int setup_trace_cpu(struct tracefs_instance *instance, struct test_cpu_da
if (!data->buf)
goto fail;
- data->kbuf = kbuffer_alloc(sizeof(long) == 8, !tep_is_bigendian());
+ data->kbuf = tep_kbuffer(data->tep);
CU_TEST(data->kbuf != NULL);
if (!data->kbuf)
goto fail;
@@ -2127,6 +2127,7 @@ static void test_instance_file_fd(struct tracefs_instance *instance)
const char *name = get_rand_str();
const char *tdir = tracefs_instance_get_trace_dir(instance);
long long res = -1;
+ long long res2;
char rd[2];
int fd;
@@ -2146,7 +2147,34 @@ static void test_instance_file_fd(struct tracefs_instance *instance)
CU_TEST(read(fd, &rd, 1) == 1);
rd[1] = 0;
CU_TEST(res == atoi(rd));
+ close(fd);
+
+ /* Inverse tracing_on and test changing it with write_number */
+ res ^= 1;
+ CU_TEST(tracefs_instance_file_write_number(instance, TRACE_ON, (size_t)res) == 0);
+
+ CU_TEST(tracefs_instance_file_read_number(instance, TRACE_ON, &res2) == 0);
+ CU_TEST(res2 == res);
+ fd = tracefs_instance_file_open(instance, TRACE_ON, O_RDONLY);
+ CU_TEST(fd >= 0);
+ CU_TEST(read(fd, &rd, 1) == 1);
+ rd[1] = 0;
+ CU_TEST(res2 == atoi(rd));
+ close(fd);
+
+ /* Put back the result of tracing_on */
+ res ^= 1;
+
+ CU_TEST(tracefs_instance_file_write_number(instance, TRACE_ON, (size_t)res) == 0);
+
+ CU_TEST(tracefs_instance_file_read_number(instance, TRACE_ON, &res2) == 0);
+ CU_TEST(res2 == res);
+ fd = tracefs_instance_file_open(instance, TRACE_ON, O_RDONLY);
+ CU_TEST(fd >= 0);
+ CU_TEST(read(fd, &rd, 1) == 1);
+ rd[1] = 0;
+ CU_TEST(res2 == atoi(rd));
close(fd);
}