diff --git a/drivers/video/tegra/nvmap/nvmap_alloc.c b/drivers/video/tegra/nvmap/nvmap_alloc.c index 19d62f5f..6b0f80c1 100644 --- a/drivers/video/tegra/nvmap/nvmap_alloc.c +++ b/drivers/video/tegra/nvmap/nvmap_alloc.c @@ -596,7 +596,7 @@ static int handle_page_alloc(struct nvmap_client *client, * Increment the RSS counter of the allocating process by number of pages allocated. */ h->anon_count = nr_page; - add_mm_counter(mm, MM_ANONPAGES, nr_page); + nvmap_add_mm_counter(mm, MM_ANONPAGES, nr_page); /* * Make sure any data in the caches is cleaned out before @@ -618,7 +618,7 @@ static int handle_page_alloc(struct nvmap_client *client, ref->mm = mm; ref->anon_count = h->anon_count; } else { - add_mm_counter(mm, MM_ANONPAGES, -nr_page); + nvmap_add_mm_counter(mm, MM_ANONPAGES, -nr_page); mmput(mm); } @@ -1176,7 +1176,7 @@ void nvmap_free_handle(struct nvmap_client *client, * to this ref and do mmput so that mm_struct can be freed, if required. */ if (ref->mm != NULL && ref->anon_count != 0) { - add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); + nvmap_add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); mmput(ref->mm); ref->mm = NULL; ref->anon_count = 0; diff --git a/drivers/video/tegra/nvmap/nvmap_dev.c b/drivers/video/tegra/nvmap/nvmap_dev.c index 02d6bccb..8332694a 100644 --- a/drivers/video/tegra/nvmap/nvmap_dev.c +++ b/drivers/video/tegra/nvmap/nvmap_dev.c @@ -283,7 +283,7 @@ static void destroy_client(struct nvmap_client *client) * to this ref and do mmput so that mm_struct can be freed, if required. */ if (ref->mm != NULL && ref->anon_count != 0) { - add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); + nvmap_add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); mmput(ref->mm); ref->mm = NULL; ref->anon_count = 0; diff --git a/drivers/video/tegra/nvmap/nvmap_handle.c b/drivers/video/tegra/nvmap/nvmap_handle.c index 3be9c8bb..fff983b0 100644 --- a/drivers/video/tegra/nvmap/nvmap_handle.c +++ b/drivers/video/tegra/nvmap/nvmap_handle.c @@ -414,7 +414,7 @@ struct nvmap_handle_ref *nvmap_duplicate_handle(struct nvmap_client *client, if (!mmget_not_zero(ref->mm)) goto exit; - add_mm_counter(ref->mm, MM_ANONPAGES, ref->anon_count); + nvmap_add_mm_counter(ref->mm, MM_ANONPAGES, ref->anon_count); } if (is_ro) { @@ -436,7 +436,7 @@ out: exit_mm: if (ref->anon_count != 0 && ref->mm != NULL) { - add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); + nvmap_add_mm_counter(ref->mm, MM_ANONPAGES, -ref->anon_count); mmput(ref->mm); ref->mm = NULL; ref->anon_count = 0; diff --git a/drivers/video/tegra/nvmap/nvmap_priv.h b/drivers/video/tegra/nvmap/nvmap_priv.h index 01328bfa..3b505936 100644 --- a/drivers/video/tegra/nvmap/nvmap_priv.h +++ b/drivers/video/tegra/nvmap/nvmap_priv.h @@ -916,6 +916,16 @@ static inline struct dma_buf *nvmap_id_array_id_release(struct xarray *xarr, u32 return NULL; } #endif + +static inline void nvmap_add_mm_counter(struct mm_struct *mm, int member, long value) +{ +#if defined(NV_MM_STRUCT_STRUCT_HAS_PERCPU_COUNTER_RSS_STAT) /* Linux v6.2 */ + percpu_counter_add(&mm->rss_stat[member], value); +#else + atomic_long_add_return(value, &mm->rss_stat.count[member]); +#endif +} + void *nvmap_dmabuf_get_drv_data(struct dma_buf *dmabuf, struct device *dev); bool is_nvmap_memory_available(size_t size, uint32_t heap); diff --git a/scripts/conftest/Makefile b/scripts/conftest/Makefile index e4e68320..b854ee79 100644 --- a/scripts/conftest/Makefile +++ b/scripts/conftest/Makefile @@ -125,6 +125,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += i2c_driver_struct_remove_return_type_int NV_CONFTEST_FUNCTION_COMPILE_TESTS += iio_dev_opaque_has_mlock NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_map_has_gfp_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += kthread_complete_and_exit +NV_CONFTEST_FUNCTION_COMPILE_TESTS += mm_struct_struct_has_percpu_counter_rss_stat NV_CONFTEST_FUNCTION_COMPILE_TESTS += mii_bus_struct_has_read_c45 NV_CONFTEST_FUNCTION_COMPILE_TESTS += mii_bus_struct_has_write_c45 NV_CONFTEST_FUNCTION_COMPILE_TESTS += netif_set_tso_max_size diff --git a/scripts/conftest/conftest.sh b/scripts/conftest/conftest.sh index a7fb0197..fcfbde06 100755 --- a/scripts/conftest/conftest.sh +++ b/scripts/conftest/conftest.sh @@ -7152,6 +7152,23 @@ compile_test() { compile_check_conftest "$CODE" "NV_MII_BUS_STRUCT_HAS_WRITE_C45" "" "types" ;; + mm_struct_struct_has_percpu_counter_rss_stat) + # + # Determine if the 'rss_stat' member of the 'mm_struct' structure is + # defined with 'percpu_counter'. + # + # This change was made in Linux v6.2 by commit f1a7941243c1 ("mm: + # convert mm's rss stats into percpu_counter2"). + # + CODE=" + #include + void conftest_mm_struct_struct_has_percpu_counter_rss_stat(struct mm_struct *mm) { + percpu_counter_add(&mm->rss_stat[0], 0); + }" + + compile_check_conftest "$CODE" "NV_MM_STRUCT_STRUCT_HAS_PERCPU_COUNTER_RSS_STAT" "" "types" + ;; + pwm_chip_struct_has_base_arg) # # Determine if 'struct pwm_chip' has the 'base' field.