174bde725SJean-Sébastien Pédron /*-
274bde725SJean-Sébastien Pédron * Copyright (c) 2025 The FreeBSD Foundation
374bde725SJean-Sébastien Pédron * Copyright (c) 2025 Jean-Sébastien Pédron
474bde725SJean-Sébastien Pédron *
574bde725SJean-Sébastien Pédron * This software was developed by Jean-Sébastien Pédron under sponsorship
674bde725SJean-Sébastien Pédron * from the FreeBSD Foundation.
774bde725SJean-Sébastien Pédron *
874bde725SJean-Sébastien Pédron * Redistribution and use in source and binary forms, with or without
974bde725SJean-Sébastien Pédron * modification, are permitted provided that the following conditions
1074bde725SJean-Sébastien Pédron * are met:
1174bde725SJean-Sébastien Pédron * 1. Redistributions of source code must retain the above copyright
1274bde725SJean-Sébastien Pédron * notice, this list of conditions and the following disclaimer.
1374bde725SJean-Sébastien Pédron * 2. Redistributions in binary form must reproduce the above copyright
1474bde725SJean-Sébastien Pédron * notice, this list of conditions and the following disclaimer in the
1574bde725SJean-Sébastien Pédron * documentation and/or other materials provided with the distribution.
1674bde725SJean-Sébastien Pédron *
1774bde725SJean-Sébastien Pédron * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1874bde725SJean-Sébastien Pédron * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1974bde725SJean-Sébastien Pédron * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2074bde725SJean-Sébastien Pédron * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2174bde725SJean-Sébastien Pédron * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2274bde725SJean-Sébastien Pédron * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2374bde725SJean-Sébastien Pédron * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2474bde725SJean-Sébastien Pédron * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2574bde725SJean-Sébastien Pédron * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2674bde725SJean-Sébastien Pédron * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2774bde725SJean-Sébastien Pédron * SUCH DAMAGE.
2874bde725SJean-Sébastien Pédron */
2974bde725SJean-Sébastien Pédron
3074bde725SJean-Sébastien Pédron #ifndef _LINUXKPI_LINUX_REF_TRACKER_H_
3174bde725SJean-Sébastien Pédron #define _LINUXKPI_LINUX_REF_TRACKER_H_
3274bde725SJean-Sébastien Pédron
3374bde725SJean-Sébastien Pédron #include <linux/refcount.h>
3474bde725SJean-Sébastien Pédron #include <linux/types.h>
3574bde725SJean-Sébastien Pédron #include <linux/spinlock.h>
3674bde725SJean-Sébastien Pédron #include <linux/stackdepot.h>
3774bde725SJean-Sébastien Pédron
3874bde725SJean-Sébastien Pédron struct ref_tracker;
3974bde725SJean-Sébastien Pédron
4074bde725SJean-Sébastien Pédron struct ref_tracker_dir {
4174bde725SJean-Sébastien Pédron };
4274bde725SJean-Sébastien Pédron
4374bde725SJean-Sébastien Pédron /*
4474bde725SJean-Sébastien Pédron * The following functions currently have dummy implementations that, on Linux,
4574bde725SJean-Sébastien Pédron * are used when CONFIG_REF_TRACKER is not set at compile time.
4674bde725SJean-Sébastien Pédron *
4774bde725SJean-Sébastien Pédron * The ref tracker is a tool to associate a refcount increase to a refcount
4874bde725SJean-Sébastien Pédron * decrease. This helps developers track, document and debug refcounts. We
4974bde725SJean-Sébastien Pédron * don't need this feature for now in linuxkpi.
5074bde725SJean-Sébastien Pédron */
5174bde725SJean-Sébastien Pédron
5274bde725SJean-Sébastien Pédron static inline void
ref_tracker_dir_init(struct ref_tracker_dir * dir,unsigned int quarantine_count,const char * name)5374bde725SJean-Sébastien Pédron ref_tracker_dir_init(struct ref_tracker_dir *dir,
5474bde725SJean-Sébastien Pédron unsigned int quarantine_count, const char *name)
5574bde725SJean-Sébastien Pédron {
5674bde725SJean-Sébastien Pédron }
5774bde725SJean-Sébastien Pédron
5874bde725SJean-Sébastien Pédron static inline void
ref_tracker_dir_exit(struct ref_tracker_dir * dir)5974bde725SJean-Sébastien Pédron ref_tracker_dir_exit(struct ref_tracker_dir *dir)
6074bde725SJean-Sébastien Pédron {
6174bde725SJean-Sébastien Pédron }
6274bde725SJean-Sébastien Pédron
6374bde725SJean-Sébastien Pédron static inline void
ref_tracker_dir_print_locked(struct ref_tracker_dir * dir,unsigned int display_limit)6474bde725SJean-Sébastien Pédron ref_tracker_dir_print_locked(struct ref_tracker_dir *dir,
6574bde725SJean-Sébastien Pédron unsigned int display_limit)
6674bde725SJean-Sébastien Pédron {
6774bde725SJean-Sébastien Pédron }
6874bde725SJean-Sébastien Pédron
6974bde725SJean-Sébastien Pédron static inline void
ref_tracker_dir_print(struct ref_tracker_dir * dir,unsigned int display_limit)7074bde725SJean-Sébastien Pédron ref_tracker_dir_print(struct ref_tracker_dir *dir, unsigned int display_limit)
7174bde725SJean-Sébastien Pédron {
7274bde725SJean-Sébastien Pédron }
7374bde725SJean-Sébastien Pédron
7474bde725SJean-Sébastien Pédron static inline int
ref_tracker_dir_snprint(struct ref_tracker_dir * dir,char * buf,size_t size)7574bde725SJean-Sébastien Pédron ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t size)
7674bde725SJean-Sébastien Pédron {
7774bde725SJean-Sébastien Pédron return (0);
7874bde725SJean-Sébastien Pédron }
7974bde725SJean-Sébastien Pédron
8074bde725SJean-Sébastien Pédron static inline int
ref_tracker_alloc(struct ref_tracker_dir * dir,struct ref_tracker ** trackerp,gfp_t gfp)8174bde725SJean-Sébastien Pédron ref_tracker_alloc(struct ref_tracker_dir *dir, struct ref_tracker **trackerp,
8274bde725SJean-Sébastien Pédron gfp_t gfp)
8374bde725SJean-Sébastien Pédron {
8474bde725SJean-Sébastien Pédron return (0);
8574bde725SJean-Sébastien Pédron }
8674bde725SJean-Sébastien Pédron
8774bde725SJean-Sébastien Pédron static inline int
ref_tracker_free(struct ref_tracker_dir * dir,struct ref_tracker ** trackerp)8874bde725SJean-Sébastien Pédron ref_tracker_free(struct ref_tracker_dir *dir, struct ref_tracker **trackerp)
8974bde725SJean-Sébastien Pédron {
9074bde725SJean-Sébastien Pédron return (0);
9174bde725SJean-Sébastien Pédron }
9274bde725SJean-Sébastien Pédron
9374bde725SJean-Sébastien Pédron #endif /* !defined(_LINUXKPI_LINUX_REF_TRACKER_H_) */
94