[libvirt] [PATCH v2 4.5/4 variant 1] util: Don't check if entries under /sys/fs/resctrl/info/ are directories
Ján Tomko
jtomko at redhat.com
Mon Jan 29 16:54:03 UTC 2018
On Mon, Jan 29, 2018 at 05:45:44PM +0100, Martin Kletzander wrote:
>We are skipping non-directories under /sys/fs/resctrl/(info/) since those are not
>interesting for us. However in tests it can sometimes happen that ent->d_type
>is 0 instead of 4 (DT_DIR) for directories.
>
>I've seen it fail on two machines. Different machines, different systems, I
>cannot reproduce it even using the same setup. So one of the ways how to work
>around this is call stat() on it. The other one is not checking if it is a
>directory since we'll find out eventually when we want to read some files
>underneath it.
>
>Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>---
> src/util/virresctrl.c | 26 ++++++++++++++------------
> 1 file changed, 14 insertions(+), 12 deletions(-)
>
>diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
>index 684cb22fd8a2..ad4294c26b1e 100644
>--- a/src/util/virresctrl.c
>+++ b/src/util/virresctrl.c
>@@ -410,10 +410,6 @@ virResctrlGetInfo(virResctrlInfoPtr resctrl)
>
> while ((rv = virDirRead(dirp, &ent, SYSFS_RESCTRL_PATH "/info")) > 0) {
> VIR_DEBUG("Parsing info type '%s'", ent->d_name);
>-
>- if (ent->d_type != DT_DIR)
>- continue;
>-
> if (ent->d_name[0] != 'L')
> continue;
>
>@@ -436,19 +432,28 @@ virResctrlGetInfo(virResctrlInfoPtr resctrl)
> rv = virFileReadValueUint(&i_type->control.max_allocation,
> SYSFS_RESCTRL_PATH "/info/%s/num_closids",
> ent->d_name);
>- if (rv == -2)
>- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>- _("Cannot get num_closids from resctrl cache info"));
>- if (rv < 0)
>+ if (rv == -2) {
>+ /* The file doesn't exist, so it's unusable for us,
>+ * but we can scan further */
>+ VIR_WARN("The path '" SYSFS_RESCTRL_PATH "/info/%s/num_closids' "
>+ "does not exist",
>+ ent->d_name);
>+ } else if (rv < 0) {
>+ /* Other failures are fatal, so just quit */
> goto cleanup;
>+ }
>
> rv = virFileReadValueString(&i_type->cbm_mask,
> SYSFS_RESCTRL_PATH
> "/info/%s/cbm_mask",
> ent->d_name);
>- if (rv == -2)
>+ if (rv == -2) {
>+ /* If the previous file exists, so should this one. Hence -2 is
>+ * fatal in this case as well - the kernel interface might've
non-fatal, I assume
>+ * changed too much or something else is wrong. */
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("Cannot get cbm_mask from resctrl cache info"));
>+ }
> if (rv < 0)
> goto cleanup;
>
ACK
Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180129/abcc148c/attachment-0001.sig>
More information about the libvir-list
mailing list