19.03.2021 16:39, Dmitry Osipenko пишет: > 19.03.2021 15:44, Dmitry Osipenko пишет: > ... >>> #include <linux/debugfs.h> >>> +#include <linux/kobject.h> >>> + >>> +struct cma_stat { >>> + spinlock_t lock; >>> + /* the number of CMA page successful allocations */ >>> + unsigned long nr_pages_succeeded; >>> + /* the number of CMA page allocation failures */ >>> + unsigned long nr_pages_failed; >>> + struct kobject kobj; >>> +}; >>> >>> struct cma { >>> unsigned long base_pfn; >>> @@ -16,6 +26,9 @@ struct cma { >>> struct debugfs_u32_array dfs_bitmap; >>> #endif >>> char name[CMA_MAX_NAME]; >>> +#ifdef CONFIG_CMA_SYSFS >>> + struct cma_stat *stat; >>> +#endif > > What is the point of allocating stat dynamically? > > ... >>> +void cma_sysfs_alloc_pages_count(struct cma *cma, size_t count) >>> +{ >>> + spin_lock(&cma->stat->lock); >>> + cma->stat->nr_pages_succeeded += count; >>> + spin_unlock(&cma->stat->lock); >>> +} >>> + >>> +void cma_sysfs_fail_pages_count(struct cma *cma, size_t count) >>> +{ >>> + spin_lock(&cma->stat->lock); >>> + cma->stat->nr_pages_failed += count; >>> + spin_unlock(&cma->stat->lock); >>> +} > > You could use atomic increment and then locking isn't needed. > Actually, the counter should be u64 in order not to worry about overflow.