Re: [PATCH bpf-next v2 1/2] tools/resolve_btfids: Refactor set sorting with types from btf_ids.h

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2/2/24 14:06, Jiri Olsa wrote:
> On Wed, Jan 31, 2024 at 05:24:08PM +0100, Viktor Malik wrote:
>> Instead of using magic offsets to access BTF ID set data, leverage types
>> from btf_ids.h (btf_id_set and btf_id_set8) which define the actual
>> layout of the data. Thanks to this change, set sorting should also
>> continue working if the layout changes.
>>
>> This requires to sync the definition of 'struct btf_id_set8' from
>> include/linux/btf_ids.h to tools/include/linux/btf_ids.h. We don't sync
>> the rest of the file at the moment, b/c that would require to also sync
>> multiple dependent headers and we don't need any other defs from
>> btf_ids.h.
>>
>> Signed-off-by: Viktor Malik <vmalik@xxxxxxxxxx>
>> ---
>>  tools/bpf/resolve_btfids/main.c | 30 ++++++++++++++++++++++--------
>>  tools/include/linux/btf_ids.h   |  9 +++++++++
>>  2 files changed, 31 insertions(+), 8 deletions(-)
>>
>> diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c
>> index 27a23196d58e..7badf1557e5c 100644
>> --- a/tools/bpf/resolve_btfids/main.c
>> +++ b/tools/bpf/resolve_btfids/main.c
>> @@ -70,6 +70,7 @@
>>  #include <sys/stat.h>
>>  #include <fcntl.h>
>>  #include <errno.h>
>> +#include <linux/btf_ids.h>
>>  #include <linux/rbtree.h>
>>  #include <linux/zalloc.h>
>>  #include <linux/err.h>
>> @@ -78,7 +79,7 @@
>>  #include <subcmd/parse-options.h>
>>  
>>  #define BTF_IDS_SECTION	".BTF_ids"
>> -#define BTF_ID		"__BTF_ID__"
>> +#define BTF_ID_PREFIX	"__BTF_ID__"
> 
> nit does not look necessary to me

There's a conflicting definition of BTF_ID in btf_ids.h, this change is
to prevent a warning after we include the header.

> 
>>  
>>  #define BTF_STRUCT	"struct"
>>  #define BTF_UNION	"union"
>> @@ -161,7 +162,7 @@ static int eprintf(int level, int var, const char *fmt, ...)
>>  
>>  static bool is_btf_id(const char *name)
>>  {
>> -	return name && !strncmp(name, BTF_ID, sizeof(BTF_ID) - 1);
>> +	return name && !strncmp(name, BTF_ID_PREFIX, sizeof(BTF_ID_PREFIX) - 1);
>>  }
>>  
>>  static struct btf_id *btf_id__find(struct rb_root *root, const char *name)
>> @@ -441,7 +442,7 @@ static int symbols_collect(struct object *obj)
>>  		 * __BTF_ID__TYPE__vfs_truncate__0
>>  		 * prefix =  ^
>>  		 */
>> -		prefix = name + sizeof(BTF_ID) - 1;
>> +		prefix = name + sizeof(BTF_ID_PREFIX) - 1;
>>  
>>  		/* struct */
>>  		if (!strncmp(prefix, BTF_STRUCT, sizeof(BTF_STRUCT) - 1)) {
>> @@ -656,8 +657,8 @@ static int sets_patch(struct object *obj)
>>  	while (next) {
>>  		unsigned long addr, idx;
>>  		struct btf_id *id;
>> -		int *base;
>> -		int cnt;
>> +		void *base;
>> +		int cnt, size;
>>  
>>  		id   = rb_entry(next, struct btf_id, rb_node);
>>  		addr = id->addr[0];
>> @@ -671,13 +672,26 @@ static int sets_patch(struct object *obj)
>>  		}
>>  
>>  		idx = idx / sizeof(int);
>> -		base = &ptr[idx] + (id->is_set8 ? 2 : 1);
>> -		cnt = ptr[idx];
>> +		if (id->is_set) {
>> +			struct btf_id_set *set;
>> +
>> +			set = (struct btf_id_set *)&ptr[idx];
>> +			base = set->ids;
>> +			cnt = set->cnt;
>> +			size = sizeof(set->ids[0]);
>> +		} else {
>> +			struct btf_id_set8 *set8;
>> +
>> +			set8 = (struct btf_id_set8 *)&ptr[idx];
>> +			base = set8->pairs;
>> +			cnt = set8->cnt;
>> +			size = sizeof(set8->pairs[0]);
>> +		}
>>  
>>  		pr_debug("sorting  addr %5lu: cnt %6d [%s]\n",
>>  			 (idx + 1) * sizeof(int), cnt, id->name);
>>  
>> -		qsort(base, cnt, id->is_set8 ? sizeof(uint64_t) : sizeof(int), cmp_id);
>> +		qsort(base, cnt, size, cmp_id);
> 
> maybe we could call qsort on top of each set type, seems simpler:

That looks much cleaner, I'll use that, thanks!

V.

> 
>  	while (next) {
> +		struct btf_id_set8 *set8;
> +		struct btf_id_set *set;
>  		unsigned long addr, idx;
>  		struct btf_id *id;
> -		int *base;
> -		int cnt;
>  
>  		id   = rb_entry(next, struct btf_id, rb_node);
>  		addr = id->addr[0];
> @@ -671,13 +672,16 @@ static int sets_patch(struct object *obj)
>  		}
>  
>  		idx = idx / sizeof(int);
> -		base = &ptr[idx] + (id->is_set8 ? 2 : 1);
> -		cnt = ptr[idx];
> +		if (id->is_set) {
> +			set = (struct btf_id_set *)&ptr[idx];
> +			qsort(set->ids, set->cnt, sizeof(set->ids[0]), cmp_id);
> +		} else {
> +			set8 = (struct btf_id_set8 *)&ptr[idx];
> +			qsort(set8->pairs, set8->cnt, sizeof(set8->pairs[0]), cmp_id);
> +		}
>  
>  		pr_debug("sorting  addr %5lu: cnt %6d [%s]\n",
> -			 (idx + 1) * sizeof(int), cnt, id->name);
> -
> -		qsort(base, cnt, id->is_set8 ? sizeof(uint64_t) : sizeof(int), cmp_id);
> +			 (idx + 1) * sizeof(int), id->is_set ? set->cnt : set8->cnt, id->name);
>  
>  		next = rb_next(next);
>  	}
> 
> 
> jirka
> 





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux