@@ -921,20 +921,26 @@ extern unsigned long xcall_flush_dcache_page_cheetah;
921
921
#endif
922
922
extern unsigned long xcall_flush_dcache_page_spitfire ;
923
923
924
- static inline void __local_flush_dcache_page (struct page * page )
924
+ static inline void __local_flush_dcache_folio (struct folio * folio )
925
925
{
926
+ unsigned int i , nr = folio_nr_pages (folio );
927
+
926
928
#ifdef DCACHE_ALIASING_POSSIBLE
927
- __flush_dcache_page (page_address (page ),
929
+ for (i = 0 ; i < nr ; i ++ )
930
+ __flush_dcache_page (folio_address (folio ) + i * PAGE_SIZE ,
928
931
((tlb_type == spitfire ) &&
929
- page_mapping_file ( page ) != NULL ));
932
+ folio_flush_mapping ( folio ) != NULL ));
930
933
#else
931
- if (page_mapping_file (page ) != NULL &&
932
- tlb_type == spitfire )
933
- __flush_icache_page (__pa (page_address (page )));
934
+ if (folio_flush_mapping (folio ) != NULL &&
935
+ tlb_type == spitfire ) {
936
+ unsigned long pfn = folio_pfn (folio )
937
+ for (i = 0 ; i < nr ; i ++ )
938
+ __flush_icache_page ((pfn + i ) * PAGE_SIZE );
939
+ }
934
940
#endif
935
941
}
936
942
937
- void smp_flush_dcache_page_impl (struct page * page , int cpu )
943
+ void smp_flush_dcache_folio_impl (struct folio * folio , int cpu )
938
944
{
939
945
int this_cpu ;
940
946
@@ -948,33 +954,38 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
948
954
this_cpu = get_cpu ();
949
955
950
956
if (cpu == this_cpu ) {
951
- __local_flush_dcache_page ( page );
957
+ __local_flush_dcache_folio ( folio );
952
958
} else if (cpu_online (cpu )) {
953
- void * pg_addr = page_address ( page );
959
+ void * pg_addr = folio_address ( folio );
954
960
u64 data0 = 0 ;
955
961
956
962
if (tlb_type == spitfire ) {
957
963
data0 = ((u64 )& xcall_flush_dcache_page_spitfire );
958
- if (page_mapping_file ( page ) != NULL )
964
+ if (folio_flush_mapping ( folio ) != NULL )
959
965
data0 |= ((u64 )1 << 32 );
960
966
} else if (tlb_type == cheetah || tlb_type == cheetah_plus ) {
961
967
#ifdef DCACHE_ALIASING_POSSIBLE
962
968
data0 = ((u64 )& xcall_flush_dcache_page_cheetah );
963
969
#endif
964
970
}
965
971
if (data0 ) {
966
- xcall_deliver (data0 , __pa (pg_addr ),
967
- (u64 ) pg_addr , cpumask_of (cpu ));
972
+ unsigned int i , nr = folio_nr_pages (folio );
973
+
974
+ for (i = 0 ; i < nr ; i ++ ) {
975
+ xcall_deliver (data0 , __pa (pg_addr ),
976
+ (u64 ) pg_addr , cpumask_of (cpu ));
968
977
#ifdef CONFIG_DEBUG_DCFLUSH
969
- atomic_inc (& dcpage_flushes_xcall );
978
+ atomic_inc (& dcpage_flushes_xcall );
970
979
#endif
980
+ pg_addr += PAGE_SIZE ;
981
+ }
971
982
}
972
983
}
973
984
974
985
put_cpu ();
975
986
}
976
987
977
- void flush_dcache_page_all (struct mm_struct * mm , struct page * page )
988
+ void flush_dcache_folio_all (struct mm_struct * mm , struct folio * folio )
978
989
{
979
990
void * pg_addr ;
980
991
u64 data0 ;
@@ -988,24 +999,29 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
988
999
atomic_inc (& dcpage_flushes );
989
1000
#endif
990
1001
data0 = 0 ;
991
- pg_addr = page_address ( page );
1002
+ pg_addr = folio_address ( folio );
992
1003
if (tlb_type == spitfire ) {
993
1004
data0 = ((u64 )& xcall_flush_dcache_page_spitfire );
994
- if (page_mapping_file ( page ) != NULL )
1005
+ if (folio_flush_mapping ( folio ) != NULL )
995
1006
data0 |= ((u64 )1 << 32 );
996
1007
} else if (tlb_type == cheetah || tlb_type == cheetah_plus ) {
997
1008
#ifdef DCACHE_ALIASING_POSSIBLE
998
1009
data0 = ((u64 )& xcall_flush_dcache_page_cheetah );
999
1010
#endif
1000
1011
}
1001
1012
if (data0 ) {
1002
- xcall_deliver (data0 , __pa (pg_addr ),
1003
- (u64 ) pg_addr , cpu_online_mask );
1013
+ unsigned int i , nr = folio_nr_pages (folio );
1014
+
1015
+ for (i = 0 ; i < nr ; i ++ ) {
1016
+ xcall_deliver (data0 , __pa (pg_addr ),
1017
+ (u64 ) pg_addr , cpu_online_mask );
1004
1018
#ifdef CONFIG_DEBUG_DCFLUSH
1005
- atomic_inc (& dcpage_flushes_xcall );
1019
+ atomic_inc (& dcpage_flushes_xcall );
1006
1020
#endif
1021
+ pg_addr += PAGE_SIZE ;
1022
+ }
1007
1023
}
1008
- __local_flush_dcache_page ( page );
1024
+ __local_flush_dcache_folio ( folio );
1009
1025
1010
1026
preempt_enable ();
1011
1027
}
0 commit comments