From: Eric Auger <eric.auger@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: eric.auger@st.com, "QEMU Developers" <qemu-devel@nongnu.org>,
qemu-arm <qemu-arm@nongnu.org>,
"David Gibson" <david@gibson.dropbear.id.au>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Thomas Huth" <thuth@redhat.com>,
"Peter Crosthwaite" <crosthwaitepeter@gmail.com>,
"Patch Tracking" <patches@linaro.org>,
"Christoffer Dall" <christoffer.dall@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Baptiste Reynal" <b.reynal@virtualopensystems.com>,
"Suravee Suthikulpanit" <suravee.suthikulpanit@amd.com>,
thomas.lendacky@amd.com
Subject: Re: [PATCH v5 2/8] device_tree: introduce load_device_tree_from_sysfs
Date: Mon, 1 Feb 2016 14:11:45 +0100 [thread overview]
Message-ID: <56AF5991.9030301@linaro.org> (raw)
In-Reply-To: <CAFEAcA-9+muP4TjQnLk2XPAZsf=wRzsLSQbGuQhqrTxZpsz2xQ@mail.gmail.com>
Hi Peter,
On 01/25/2016 03:13 PM, Peter Maydell wrote:
> On 18 January 2016 at 15:16, Eric Auger <eric.auger@linaro.org> wrote:
>> This function returns the host device tree blob from sysfs
>> (/proc/device-tree). It uses a recursive function inspired
>> from dtc read_fstree.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>>
>> ---
>> v1 -> v2:
>> - do not implement/expose read_fstree and load_device_tree_from_sysfs
>> if CONFIG_LINUX is not defined (lstat is not implemeted in mingw)
>> - correct indentation in read_fstree
>> - use /proc/device-tree symlink instead of /sys/firmware/devicetree/base
>> path (kernel.org/doc/Documentation/ABI/testing/sysfs-firmware-ofw)
>> - use g_file_get_contents in read_fstree
>> - introduce SYSFS_DT_BASEDIR macro and use strlen
>> - exit on error in load_device_tree_from_sysfs
>> - user error_setg
>>
>> RFC -> v1:
>> - remove runtime dependency on dtc binary and introduce read_fstree
>> ---
>> device_tree.c | 100 +++++++++++++++++++++++++++++++++++++++++++
>> include/sysemu/device_tree.h | 3 ++
>> 2 files changed, 103 insertions(+)
>>
>> diff --git a/device_tree.c b/device_tree.c
>> index a9f5f8e..b262c2d 100644
>> --- a/device_tree.c
>> +++ b/device_tree.c
>> @@ -17,6 +17,9 @@
>> #include <fcntl.h>
>> #include <unistd.h>
>> #include <stdlib.h>
>> +#ifdef CONFIG_LINUX
>> +#include <dirent.h>
>> +#endif
>>
>> #include "qemu-common.h"
>> #include "qemu/error-report.h"
>> @@ -117,6 +120,103 @@ fail:
>> return NULL;
>> }
>>
>> +#ifdef CONFIG_LINUX
>> +
>> +#define SYSFS_DT_BASEDIR "/proc/device-tree"
>> +
>> +/**
>> + * read_fstree: this function is inspired from dtc read_fstree
>> + * @fdt: preallocated fdt blob buffer, to be populated
>> + * @dirname: directory to scan under SYSFS_DT_BASEDIR
>> + * the search is recursive and the tree is searched down to the
>> + * leafs (property files).
>
> "leaves"
OK
>
>> + *
>> + * the function self-asserts in case of error
>
> "asserts"
OK
>
>> + */
>> +static void read_fstree(void *fdt, const char *dirname)
>> +{
>> + DIR *d;
>> + struct dirent *de;
>> + struct stat st;
>> + const char *root_dir = SYSFS_DT_BASEDIR;
>> + char *parent_node;
>> +
>> + if (strstr(dirname, root_dir) != dirname) {
>> + error_report("%s: %s must be searched within %s",
>> + __func__, dirname, root_dir);
>> + exit(1);
>
> Why does this one error_report and exit but other errors below use
> error_setg?
replaced with error_setg(&error_fatal, ...)
>
>> + }
>> + parent_node = (char *)&dirname[strlen(SYSFS_DT_BASEDIR)];
>
> What causes us to need this cast to char* ?
I changed parent_node to a const char * instead of char*
>
>> +
>> + d = opendir(dirname);
>> + if (!d) {
>> + error_setg(&error_fatal, "%s cannot open %s", __func__, dirname);
>
> You need to return here (and similarly to bail out properly
> in the other error paths below).
>
>> + }
>> +
>> + while ((de = readdir(d)) != NULL) {
>> + char *tmpnam;
>> +
>> + if (!g_strcmp0(de->d_name, ".")
>> + || !g_strcmp0(de->d_name, "..")) {
>> + continue;
>> + }
>> +
>> + tmpnam = g_strjoin("/", dirname, de->d_name, NULL);
>> +
>> + if (lstat(tmpnam, &st) < 0) {
>> + error_setg(&error_fatal, "%s cannot lstat %s", __func__, tmpnam);
>> + }
>> +
>> + if (S_ISREG(st.st_mode)) {
>> + gchar *val;
>> + gsize len;
>> +
>> + if (!g_file_get_contents(tmpnam, &val, &len, NULL)) {
>> + error_setg(&error_fatal, "%s not able to extract info from %s",
>> + __func__, tmpnam);
>> + }
>> +
>> + if (strlen(parent_node) > 0) {
>> + qemu_fdt_setprop(fdt, parent_node,
>> + de->d_name, val, len);
>> + } else {
>> + qemu_fdt_setprop(fdt, "/", de->d_name, val, len);
>> + }
>> + g_free(val);
>> + } else if (S_ISDIR(st.st_mode)) {
>> + char *node_name;
>> +
>> + node_name = g_strdup_printf("%s/%s",
>> + parent_node, de->d_name);
>
> I don't mind whether we use g_strjoin("/",...) or g_strdup_printf("%s/%s", ...)
> to glue together strings with a '/' between them, but can we not use
> both methods in the same function, please?
ok
>
>> + qemu_fdt_add_subnode(fdt, node_name);
>> + g_free(node_name);
>> + read_fstree(fdt, tmpnam);
>> + }
>> +
>> + g_free(tmpnam);
>> + }
>> +
>> + closedir(d);
>> +}
>> +
>> +/* load_device_tree_from_sysfs: extract the dt blob from host sysfs */
>> +void *load_device_tree_from_sysfs(void)
>> +{
>> + void *host_fdt;
>> + int host_fdt_size;
>> +
>> + host_fdt = create_device_tree(&host_fdt_size);
>> + read_fstree(host_fdt, SYSFS_DT_BASEDIR);
>> + if (fdt_check_header(host_fdt)) {
>> + error_setg(&error_fatal,
>> + "%s host device tree extracted into memory is invalid",
>> + __func__);
>
> Should we free the created device tree and return NULL here?
>
>> + }
>> + return host_fdt;
>> +}
>> +
>> +#endif /* CONFIG_LINUX */
>> +
>> static int findnode_nofail(void *fdt, const char *node_path)
>> {
>> int offset;
>> diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h
>> index 359e143..fdf25a4 100644
>> --- a/include/sysemu/device_tree.h
>> +++ b/include/sysemu/device_tree.h
>> @@ -16,6 +16,9 @@
>>
>> void *create_device_tree(int *sizep);
>> void *load_device_tree(const char *filename_path, int *sizep);
>> +#ifdef CONFIG_LINUX
>> +void *load_device_tree_from_sysfs(void);
>
> Can we have a doc comment for a new global function, please?
sure
Thanks
Eric
>
>> +#endif
>>
>> int qemu_fdt_setprop(void *fdt, const char *node_path,
>> const char *property, const void *val, int size);
>> --
>> 1.9.1
>
> thanks
> -- PMM
>
WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "Baptiste Reynal" <b.reynal@virtualopensystems.com>,
"Thomas Huth" <thuth@redhat.com>,
eric.auger@st.com, "Patch Tracking" <patches@linaro.org>,
"Peter Crosthwaite" <crosthwaitepeter@gmail.com>,
"QEMU Developers" <qemu-devel@nongnu.org>,
"Alex Williamson" <alex.williamson@redhat.com>,
qemu-arm <qemu-arm@nongnu.org>,
"Suravee Suthikulpanit" <suravee.suthikulpanit@amd.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
thomas.lendacky@amd.com, "Alex Bennée" <alex.bennee@linaro.org>,
"Christoffer Dall" <christoffer.dall@linaro.org>,
"David Gibson" <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH v5 2/8] device_tree: introduce load_device_tree_from_sysfs
Date: Mon, 1 Feb 2016 14:11:45 +0100 [thread overview]
Message-ID: <56AF5991.9030301@linaro.org> (raw)
In-Reply-To: <CAFEAcA-9+muP4TjQnLk2XPAZsf=wRzsLSQbGuQhqrTxZpsz2xQ@mail.gmail.com>
Hi Peter,
On 01/25/2016 03:13 PM, Peter Maydell wrote:
> On 18 January 2016 at 15:16, Eric Auger <eric.auger@linaro.org> wrote:
>> This function returns the host device tree blob from sysfs
>> (/proc/device-tree). It uses a recursive function inspired
>> from dtc read_fstree.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>>
>> ---
>> v1 -> v2:
>> - do not implement/expose read_fstree and load_device_tree_from_sysfs
>> if CONFIG_LINUX is not defined (lstat is not implemeted in mingw)
>> - correct indentation in read_fstree
>> - use /proc/device-tree symlink instead of /sys/firmware/devicetree/base
>> path (kernel.org/doc/Documentation/ABI/testing/sysfs-firmware-ofw)
>> - use g_file_get_contents in read_fstree
>> - introduce SYSFS_DT_BASEDIR macro and use strlen
>> - exit on error in load_device_tree_from_sysfs
>> - user error_setg
>>
>> RFC -> v1:
>> - remove runtime dependency on dtc binary and introduce read_fstree
>> ---
>> device_tree.c | 100 +++++++++++++++++++++++++++++++++++++++++++
>> include/sysemu/device_tree.h | 3 ++
>> 2 files changed, 103 insertions(+)
>>
>> diff --git a/device_tree.c b/device_tree.c
>> index a9f5f8e..b262c2d 100644
>> --- a/device_tree.c
>> +++ b/device_tree.c
>> @@ -17,6 +17,9 @@
>> #include <fcntl.h>
>> #include <unistd.h>
>> #include <stdlib.h>
>> +#ifdef CONFIG_LINUX
>> +#include <dirent.h>
>> +#endif
>>
>> #include "qemu-common.h"
>> #include "qemu/error-report.h"
>> @@ -117,6 +120,103 @@ fail:
>> return NULL;
>> }
>>
>> +#ifdef CONFIG_LINUX
>> +
>> +#define SYSFS_DT_BASEDIR "/proc/device-tree"
>> +
>> +/**
>> + * read_fstree: this function is inspired from dtc read_fstree
>> + * @fdt: preallocated fdt blob buffer, to be populated
>> + * @dirname: directory to scan under SYSFS_DT_BASEDIR
>> + * the search is recursive and the tree is searched down to the
>> + * leafs (property files).
>
> "leaves"
OK
>
>> + *
>> + * the function self-asserts in case of error
>
> "asserts"
OK
>
>> + */
>> +static void read_fstree(void *fdt, const char *dirname)
>> +{
>> + DIR *d;
>> + struct dirent *de;
>> + struct stat st;
>> + const char *root_dir = SYSFS_DT_BASEDIR;
>> + char *parent_node;
>> +
>> + if (strstr(dirname, root_dir) != dirname) {
>> + error_report("%s: %s must be searched within %s",
>> + __func__, dirname, root_dir);
>> + exit(1);
>
> Why does this one error_report and exit but other errors below use
> error_setg?
replaced with error_setg(&error_fatal, ...)
>
>> + }
>> + parent_node = (char *)&dirname[strlen(SYSFS_DT_BASEDIR)];
>
> What causes us to need this cast to char* ?
I changed parent_node to a const char * instead of char*
>
>> +
>> + d = opendir(dirname);
>> + if (!d) {
>> + error_setg(&error_fatal, "%s cannot open %s", __func__, dirname);
>
> You need to return here (and similarly to bail out properly
> in the other error paths below).
>
>> + }
>> +
>> + while ((de = readdir(d)) != NULL) {
>> + char *tmpnam;
>> +
>> + if (!g_strcmp0(de->d_name, ".")
>> + || !g_strcmp0(de->d_name, "..")) {
>> + continue;
>> + }
>> +
>> + tmpnam = g_strjoin("/", dirname, de->d_name, NULL);
>> +
>> + if (lstat(tmpnam, &st) < 0) {
>> + error_setg(&error_fatal, "%s cannot lstat %s", __func__, tmpnam);
>> + }
>> +
>> + if (S_ISREG(st.st_mode)) {
>> + gchar *val;
>> + gsize len;
>> +
>> + if (!g_file_get_contents(tmpnam, &val, &len, NULL)) {
>> + error_setg(&error_fatal, "%s not able to extract info from %s",
>> + __func__, tmpnam);
>> + }
>> +
>> + if (strlen(parent_node) > 0) {
>> + qemu_fdt_setprop(fdt, parent_node,
>> + de->d_name, val, len);
>> + } else {
>> + qemu_fdt_setprop(fdt, "/", de->d_name, val, len);
>> + }
>> + g_free(val);
>> + } else if (S_ISDIR(st.st_mode)) {
>> + char *node_name;
>> +
>> + node_name = g_strdup_printf("%s/%s",
>> + parent_node, de->d_name);
>
> I don't mind whether we use g_strjoin("/",...) or g_strdup_printf("%s/%s", ...)
> to glue together strings with a '/' between them, but can we not use
> both methods in the same function, please?
ok
>
>> + qemu_fdt_add_subnode(fdt, node_name);
>> + g_free(node_name);
>> + read_fstree(fdt, tmpnam);
>> + }
>> +
>> + g_free(tmpnam);
>> + }
>> +
>> + closedir(d);
>> +}
>> +
>> +/* load_device_tree_from_sysfs: extract the dt blob from host sysfs */
>> +void *load_device_tree_from_sysfs(void)
>> +{
>> + void *host_fdt;
>> + int host_fdt_size;
>> +
>> + host_fdt = create_device_tree(&host_fdt_size);
>> + read_fstree(host_fdt, SYSFS_DT_BASEDIR);
>> + if (fdt_check_header(host_fdt)) {
>> + error_setg(&error_fatal,
>> + "%s host device tree extracted into memory is invalid",
>> + __func__);
>
> Should we free the created device tree and return NULL here?
>
>> + }
>> + return host_fdt;
>> +}
>> +
>> +#endif /* CONFIG_LINUX */
>> +
>> static int findnode_nofail(void *fdt, const char *node_path)
>> {
>> int offset;
>> diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h
>> index 359e143..fdf25a4 100644
>> --- a/include/sysemu/device_tree.h
>> +++ b/include/sysemu/device_tree.h
>> @@ -16,6 +16,9 @@
>>
>> void *create_device_tree(int *sizep);
>> void *load_device_tree(const char *filename_path, int *sizep);
>> +#ifdef CONFIG_LINUX
>> +void *load_device_tree_from_sysfs(void);
>
> Can we have a doc comment for a new global function, please?
sure
Thanks
Eric
>
>> +#endif
>>
>> int qemu_fdt_setprop(void *fdt, const char *node_path,
>> const char *property, const void *val, int size);
>> --
>> 1.9.1
>
> thanks
> -- PMM
>
next prev parent reply other threads:[~2016-02-01 13:12 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-18 15:16 [PATCH v5 0/8] AMD XGBE KVM platform passthrough Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 1/8] hw/vfio/platform: amd-xgbe device Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 2/8] device_tree: introduce load_device_tree_from_sysfs Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-25 14:13 ` Peter Maydell
2016-01-25 14:13 ` [Qemu-devel] " Peter Maydell
2016-02-01 13:11 ` Eric Auger [this message]
2016-02-01 13:11 ` Eric Auger
2016-01-18 15:16 ` [PATCH v5 3/8] device_tree: introduce qemu_fdt_node_path Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-25 14:26 ` Peter Maydell
2016-01-25 14:26 ` [Qemu-devel] " Peter Maydell
2016-01-25 14:41 ` Eric Auger
2016-01-25 14:41 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 4/8] device_tree: qemu_fdt_getprop converted to use the error API Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 5/8] device_tree: qemu_fdt_getprop_cell " Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 6/8] hw/arm/sysbus-fdt: helpers for clock node generation Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-25 14:05 ` Peter Maydell
2016-01-25 14:05 ` [Qemu-devel] " Peter Maydell
2016-01-25 14:09 ` Eric Auger
2016-01-25 14:09 ` [Qemu-devel] " Eric Auger
2016-01-25 14:34 ` Peter Maydell
2016-01-25 14:34 ` [Qemu-devel] " Peter Maydell
2016-01-25 14:43 ` Peter Maydell
2016-01-25 14:43 ` [Qemu-devel] " Peter Maydell
2016-01-25 14:51 ` Eric Auger
2016-01-25 14:51 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 7/8] hw/arm/sysbus-fdt: enable amd-xgbe dynamic instantiation Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
2016-01-25 14:33 ` Peter Maydell
2016-01-25 14:33 ` [Qemu-devel] " Peter Maydell
2016-02-01 13:11 ` Eric Auger
2016-02-01 13:11 ` [Qemu-devel] " Eric Auger
2016-01-18 15:16 ` [PATCH v5 8/8] hw/arm/sysbus-fdt: remove qemu_fdt_setprop returned value check Eric Auger
2016-01-18 15:16 ` [Qemu-devel] " Eric Auger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56AF5991.9030301@linaro.org \
--to=eric.auger@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=alex.williamson@redhat.com \
--cc=b.reynal@virtualopensystems.com \
--cc=christoffer.dall@linaro.org \
--cc=crosthwaitepeter@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=eric.auger@st.com \
--cc=patches@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=suravee.suthikulpanit@amd.com \
--cc=thomas.lendacky@amd.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.