The change is reflected immediately. There is no caching along the way. When you read /proc/<pid>/smaps, you actually trigger a traversal of that process's page table. Information about the mappings is accumulated along the way, then displayed, without any caching.
The code behind the /proc/<pid>/smaps file is in fs/proc/task_mmu.c, specifically the show_smap function.
That function does a walk_page_range with smaps_pte_range as the PTE callback. smaps_pte_range itself accumulates the information in a struct mem_size_stats.
The part of that code responsible for PSS does:
mapcount = page_mapcount(page); if (mapcount >= 2) { if (pte_dirty(ptent) || PageDirty(page)) mss->shared_dirty += ptent_size; else mss->shared_clean += ptent_size; mss->pss += (ptent_size << PSS_SHIFT) / mapcount; } else { if (pte_dirty(ptent) || PageDirty(page)) mss->private_dirty += ptent_size; else mss->private_clean += ptent_size; mss->pss += (ptent_size << PSS_SHIFT); }
(You can see here that pages can only be accounted in the Shared part if it is actually mapped more than once - it's accounted as private otherwise.)
page_mapcount is defined inline in linux/mm.h and simply accesses a struct page:
static inline int page_mapcount(struct page *page) { return atomic_read(&(page)->_mapcount) + 1; }
So PSS is "always up to date".