On Mon,  6 Nov 2017 15:06:31 +0900, Prashant Bhole wrote:
> Added support to show filenames of pinned objects.
> ...
> Signed-off-by: Prashant Bhole <bhole_prashant...@lab.ntt.co.jp>

Thanks for the changes, a couple more nit picks, sorry for not spotting
them earlier.

> v2:
>  - Dynamically identify bpf-fs moutpoint
>  - Close files descriptors before returning on error
>  - Fixed line break for proper output formatting
>  - Code style: wrapped lines > 80, used reverse christmastree style
> 
> v3:
>  - Handle multiple bpffs mountpoints
>  - Code style: fixed line break indentation
> 
>  tools/bpf/bpftool/common.c | 85 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  tools/bpf/bpftool/main.c   |  8 +++++
>  tools/bpf/bpftool/main.h   | 17 ++++++++++
>  tools/bpf/bpftool/map.c    | 21 ++++++++++++
>  tools/bpf/bpftool/prog.c   | 24 +++++++++++++
>  5 files changed, 155 insertions(+)
> 
> diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c
> index 4556947709ee..152c5bdbe2e9 100644
> --- a/tools/bpf/bpftool/common.c
> +++ b/tools/bpf/bpftool/common.c
> @@ -45,6 +45,8 @@
>  #include <sys/mount.h>
>  #include <sys/types.h>
>  #include <sys/vfs.h>
> +#include <mntent.h>
> +#include <fts.h>

Please try to keep includes in an alphabetical order.

>  #include <bpf.h>
>  
> @@ -290,3 +292,86 @@ void print_hex_data_json(uint8_t *data, size_t len)
>               jsonw_printf(json_wtr, "\"0x%02hhx\"", data[i]);
>       jsonw_end_array(json_wtr);
>  }
> +
> +int build_pinned_obj_table(struct pinned_obj_table *tab,
> +                        enum bpf_obj_type type)
> +{
> +     struct bpf_prog_info pinned_info = {};
> +     __u32 len = sizeof(pinned_info);
> +     struct pinned_obj *obj_node = NULL;
> +     enum bpf_obj_type objtype;
> +     struct mntent *mntent = NULL;

Please try to order variable declarations longest to shortest.

> +     FILE *mntfile = NULL;
> +     FTSENT *ftse = NULL;
> +     FTS *fts = NULL;
> +     int fd, err;
> +
> +     mntfile = setmntent("/proc/mounts", "r");
> +     if (!mntfile)
> +             return -1;
> +
> +     while ((mntent = getmntent(mntfile)) != NULL) {

Please try to avoid comparisons to NULL, writing:

        if (ptr)

is more intuitive to most C programmers than:

        if (ptr != NULL)

> +             char *path[] = {mntent->mnt_dir, 0};

Shouldn't there be spaces after and before the curly braces?  Does
checkpatch --strict not warn about this?

> +
> +             if (strncmp(mntent->mnt_type, "bpf", 3) != 0)
> +                     continue;
> +
> +             fts = fts_open(path, 0, NULL);
> +             if (!fts)
> +                     continue;
> +
> +             while ((ftse = fts_read(fts)) != NULL) {
> +                     if (!(ftse->fts_info & FTS_F))
> +                             continue;
> +                     fd = open_obj_pinned(ftse->fts_path);
> +                     if (fd < 0)
> +                             continue;
> +
> +                     objtype = get_fd_type(fd);
> +                     if (objtype != type) {
> +                             close(fd);
> +                             continue;
> +                     }
> +                     memset(&pinned_info, 0, sizeof(pinned_info));
> +                     err = bpf_obj_get_info_by_fd(fd, &pinned_info, &len);
> +                     if (err) {
> +                             close(fd);
> +                             continue;
> +                     }
> +
> +                     obj_node = malloc(sizeof(*obj_node));
> +                     if (!obj_node) {
> +                             close(fd);
> +                             fts_close(fts);
> +                             fclose(mntfile);
> +                             return -1;
> +                     }
> +
> +                     memset(obj_node, 0, sizeof(*obj_node));
> +                     obj_node->id = pinned_info.id;
> +                     obj_node->path = strdup(ftse->fts_path);
> +                     hash_add(tab->table, &obj_node->hash, obj_node->id);
> +
> +                     close(fd);
> +             }
> +             fts_close(fts);
> +     }
> +     fclose(mntfile);
> +     return 0;
> +}
> +
> +void delete_pinned_obj_table(struct pinned_obj_table *tab)
> +{
> +     struct pinned_obj *obj;
> +     struct hlist_node *tmp;
> +     unsigned int bkt;
> +
> +     if (hash_empty(tab->table))
> +             return;

is this necessary?  Does hash_for_each_safe() not work with empty table?

> +     hash_for_each_safe(tab->table, bkt, tmp, obj, hash) {
> +             hash_del(&obj->hash);
> +             free(obj->path);
> +             free(obj);
> +     }
> +}

Reply via email to