lkml.org 
[lkml]   [2020]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v2 bpf-next 4/7] printk: add type-printing %pT format specifier which uses BTF
    From
    Date
    On Tue, 2020-05-12 at 06:56 +0100, Alan Maguire wrote:
    > printk supports multiple pointer object type specifiers (printing
    > netdev features etc). Extend this support using BTF to cover
    > arbitrary types. "%pT" specifies the typed format, and the pointer
    > argument is a "struct btf_ptr *" where struct btf_ptr is as follows:
    >
    > struct btf_ptr {
    > void *ptr;
    > const char *type;
    > u32 id;
    > };
    >
    > Either the "type" string ("struct sk_buff") or the BTF "id" can be
    > used to identify the type to use in displaying the associated "ptr"
    > value. A convenience function to create and point at the struct
    > is provided:
    >
    > printk(KERN_INFO "%pT", BTF_PTR_TYPE(skb, struct sk_buff));
    >
    > When invoked, BTF information is used to traverse the sk_buff *
    > and display it. Support is present for structs, unions, enums,
    > typedefs and core types (though in the latter case there's not
    > much value in using this feature of course).
    >
    > Default output is indented, but compact output can be specified
    > via the 'c' option. Type names/member values can be suppressed
    > using the 'N' option. Zero values are not displayed by default
    > but can be using the '0' option. Pointer values are obfuscated
    > unless the 'x' option is specified. As an example:
    >
    > struct sk_buff *skb = alloc_skb(64, GFP_KERNEL);
    > pr_info("%pT", BTF_PTR_TYPE(skb, struct sk_buff));
    >
    > ...gives us:
    >
    > (struct sk_buff){
    > .transport_header = (__u16)65535,
    > .mac_header = (__u16)65535,
    > .end = (sk_buff_data_t)192,
    > .head = (unsigned char *)000000006b71155a,
    > .data = (unsigned char *)000000006b71155a,
    > .truesize = (unsigned int)768,
    > .users = (refcount_t){
    > .refs = (atomic_t){
    > .counter = (int)1,

    Given

    #define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24)

    Maybe

    #define BTF_INT_SIGNED (1 << 0)
    #define BTF_INT_CHAR (1 << 1)
    #define BTF_INT_BOOL (1 << 2)

    could be extended to include

    #define BTF_INT_HEX (1 << 3)

    So hex values can be appropriately pretty-printed.


    \
     
     \ /
      Last update: 2020-05-14 01:06    [W:4.736 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site