On Wed, Feb 28, 2024 at 8:41 AM Vlastimil Babka <vbabka@xxxxxxx> wrote: > > Another thing I noticed, dunno how critical > > On 2/21/24 20:40, Suren Baghdasaryan wrote: > > +static inline void __alloc_tag_sub(union codetag_ref *ref, size_t bytes) > > +{ > > + struct alloc_tag *tag; > > + > > +#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG > > + WARN_ONCE(ref && !ref->ct, "alloc_tag was not set\n"); > > +#endif > > + if (!ref || !ref->ct) > > + return; > > This is quite careful. > > > + > > + tag = ct_to_alloc_tag(ref->ct); > > + > > + this_cpu_sub(tag->counters->bytes, bytes); > > + this_cpu_dec(tag->counters->calls); > > + > > + ref->ct = NULL; > > +} > > + > > +static inline void alloc_tag_sub(union codetag_ref *ref, size_t bytes) > > +{ > > + __alloc_tag_sub(ref, bytes); > > +} > > + > > +static inline void alloc_tag_sub_noalloc(union codetag_ref *ref, size_t bytes) > > +{ > > + __alloc_tag_sub(ref, bytes); > > +} > > + > > +static inline void alloc_tag_ref_set(union codetag_ref *ref, struct alloc_tag *tag) > > +{ > > +#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG > > + WARN_ONCE(ref && ref->ct, > > + "alloc_tag was not cleared (got tag for %s:%u)\n",\ > > + ref->ct->filename, ref->ct->lineno); > > + > > + WARN_ONCE(!tag, "current->alloc_tag not set"); > > +#endif > > + if (!ref || !tag) > > + return; > > This too. > > > + > > + ref->ct = &tag->ct; > > + /* > > + * We need in increment the call counter every time we have a new > > + * allocation or when we split a large allocation into smaller ones. > > + * Each new reference for every sub-allocation needs to increment call > > + * counter because when we free each part the counter will be decremented. > > + */ > > + this_cpu_inc(tag->counters->calls); > > +} > > + > > +static inline void alloc_tag_add(union codetag_ref *ref, struct alloc_tag *tag, size_t bytes) > > +{ > > + alloc_tag_ref_set(ref, tag); > > We might have returned from alloc_tag_ref_set() due to !tag > > > + this_cpu_add(tag->counters->bytes, bytes); > > But here we still assume it's valid. Yes, this is a blunder on my side after splitting alloc_tag_ref_set() into a separate function. I'll fix this in the next version. Thanks! > > > +} > > + > > -- > To unsubscribe from this group and stop receiving emails from it, send an email to kernel-team+unsubscribe@xxxxxxxxxxx. >