From: Hongfu Li <[email protected]> The charge APIs currently accept the allocation size as u64, but every caller passes a size_t value derived from drm_gem_object::size. Using u64 is unnecessary and, on 32-bit architectures, may lead to truncation when the value is later cast to unsigned long for internal page_counter functions.
Change the public function signatures to take size_t instead of u64. Inside the implementation, pass the size directly to page_counter_try_charge() and page_counter_uncharge(), which already expect unsigned long. Signed-off-by: Hongfu Li <[email protected]> --- include/linux/cgroup_dmem.h | 8 ++++---- kernel/cgroup/dmem.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/linux/cgroup_dmem.h b/include/linux/cgroup_dmem.h index dd4869f1d736..ed7440eb9c28 100644 --- a/include/linux/cgroup_dmem.h +++ b/include/linux/cgroup_dmem.h @@ -17,10 +17,10 @@ struct dmem_cgroup_region; #if IS_ENABLED(CONFIG_CGROUP_DMEM) struct dmem_cgroup_region *dmem_cgroup_register_region(u64 size, const char *name_fmt, ...) __printf(2,3); void dmem_cgroup_unregister_region(struct dmem_cgroup_region *region); -int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, u64 size, +int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, size_t size, struct dmem_cgroup_pool_state **ret_pool, struct dmem_cgroup_pool_state **ret_limit_pool); -void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, u64 size); +void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, size_t size); bool dmem_cgroup_state_evict_valuable(struct dmem_cgroup_pool_state *limit_pool, struct dmem_cgroup_pool_state *test_pool, bool ignore_low, bool *ret_hit_low); @@ -36,7 +36,7 @@ dmem_cgroup_register_region(u64 size, const char *name_fmt, ...) static inline void dmem_cgroup_unregister_region(struct dmem_cgroup_region *region) { } -static inline int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, u64 size, +static inline int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, size_t size, struct dmem_cgroup_pool_state **ret_pool, struct dmem_cgroup_pool_state **ret_limit_pool) { @@ -48,7 +48,7 @@ static inline int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, u64 return 0; } -static inline void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, u64 size) +static inline void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, size_t size) { } static inline diff --git a/kernel/cgroup/dmem.c b/kernel/cgroup/dmem.c index 4753a67d0f0f..38108536d2d6 100644 --- a/kernel/cgroup/dmem.c +++ b/kernel/cgroup/dmem.c @@ -619,7 +619,7 @@ get_cg_pool_unlocked(struct dmemcg_state *cg, struct dmem_cgroup_region *region) * Must be called with the returned pool as argument, * and same @index and @size. */ -void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, u64 size) +void dmem_cgroup_uncharge(struct dmem_cgroup_pool_state *pool, size_t size) { if (!pool) return; @@ -649,7 +649,7 @@ EXPORT_SYMBOL_GPL(dmem_cgroup_uncharge); * * Return: 0 on success, -EAGAIN on hitting a limit, or a negative errno on failure. */ -int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, u64 size, +int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, size_t size, struct dmem_cgroup_pool_state **ret_pool, struct dmem_cgroup_pool_state **ret_limit_pool) { -- 2.54.0
