@@ -74,26 +74,14 @@ static u64 *first_pte_l7(u64 *pte, unsigned long *page_size,
74
74
*
75
75
****************************************************************************/
76
76
77
- static void free_page_list (struct page * freelist )
78
- {
79
- while (freelist != NULL ) {
80
- unsigned long p = (unsigned long )page_address (freelist );
81
-
82
- freelist = freelist -> freelist ;
83
- free_page (p );
84
- }
85
- }
86
-
87
- static struct page * free_pt_page (u64 * pt , struct page * freelist )
77
+ static void free_pt_page (u64 * pt , struct list_head * freelist )
88
78
{
89
79
struct page * p = virt_to_page (pt );
90
80
91
- p -> freelist = freelist ;
92
-
93
- return p ;
81
+ list_add_tail (& p -> lru , freelist );
94
82
}
95
83
96
- static struct page * free_pt_lvl (u64 * pt , struct page * freelist , int lvl )
84
+ static void free_pt_lvl (u64 * pt , struct list_head * freelist , int lvl )
97
85
{
98
86
u64 * p ;
99
87
int i ;
@@ -114,22 +102,22 @@ static struct page *free_pt_lvl(u64 *pt, struct page *freelist, int lvl)
114
102
*/
115
103
p = IOMMU_PTE_PAGE (pt [i ]);
116
104
if (lvl > 2 )
117
- freelist = free_pt_lvl (p , freelist , lvl - 1 );
105
+ free_pt_lvl (p , freelist , lvl - 1 );
118
106
else
119
- freelist = free_pt_page (p , freelist );
107
+ free_pt_page (p , freelist );
120
108
}
121
109
122
- return free_pt_page (pt , freelist );
110
+ free_pt_page (pt , freelist );
123
111
}
124
112
125
- static struct page * free_sub_pt (u64 * root , int mode , struct page * freelist )
113
+ static void free_sub_pt (u64 * root , int mode , struct list_head * freelist )
126
114
{
127
115
switch (mode ) {
128
116
case PAGE_MODE_NONE :
129
117
case PAGE_MODE_7_LEVEL :
130
118
break ;
131
119
case PAGE_MODE_1_LEVEL :
132
- freelist = free_pt_page (root , freelist );
120
+ free_pt_page (root , freelist );
133
121
break ;
134
122
case PAGE_MODE_2_LEVEL :
135
123
case PAGE_MODE_3_LEVEL :
@@ -141,8 +129,6 @@ static struct page *free_sub_pt(u64 *root, int mode, struct page *freelist)
141
129
default :
142
130
BUG ();
143
131
}
144
-
145
- return freelist ;
146
132
}
147
133
148
134
void amd_iommu_domain_set_pgtable (struct protection_domain * domain ,
@@ -350,7 +336,7 @@ static u64 *fetch_pte(struct amd_io_pgtable *pgtable,
350
336
return pte ;
351
337
}
352
338
353
- static struct page * free_clear_pte (u64 * pte , u64 pteval , struct page * freelist )
339
+ static void free_clear_pte (u64 * pte , u64 pteval , struct list_head * freelist )
354
340
{
355
341
u64 * pt ;
356
342
int mode ;
@@ -361,12 +347,12 @@ static struct page *free_clear_pte(u64 *pte, u64 pteval, struct page *freelist)
361
347
}
362
348
363
349
if (!IOMMU_PTE_PRESENT (pteval ))
364
- return freelist ;
350
+ return ;
365
351
366
352
pt = IOMMU_PTE_PAGE (pteval );
367
353
mode = IOMMU_PTE_MODE (pteval );
368
354
369
- return free_sub_pt (pt , mode , freelist );
355
+ free_sub_pt (pt , mode , freelist );
370
356
}
371
357
372
358
/*
@@ -380,7 +366,7 @@ static int iommu_v1_map_page(struct io_pgtable_ops *ops, unsigned long iova,
380
366
phys_addr_t paddr , size_t size , int prot , gfp_t gfp )
381
367
{
382
368
struct protection_domain * dom = io_pgtable_ops_to_domain (ops );
383
- struct page * freelist = NULL ;
369
+ LIST_HEAD ( freelist ) ;
384
370
bool updated = false;
385
371
u64 __pte , * pte ;
386
372
int ret , i , count ;
@@ -400,9 +386,9 @@ static int iommu_v1_map_page(struct io_pgtable_ops *ops, unsigned long iova,
400
386
goto out ;
401
387
402
388
for (i = 0 ; i < count ; ++ i )
403
- freelist = free_clear_pte (& pte [i ], pte [i ], freelist );
389
+ free_clear_pte (& pte [i ], pte [i ], & freelist );
404
390
405
- if (freelist != NULL )
391
+ if (! list_empty ( & freelist ) )
406
392
updated = true;
407
393
408
394
if (count > 1 ) {
@@ -437,7 +423,7 @@ static int iommu_v1_map_page(struct io_pgtable_ops *ops, unsigned long iova,
437
423
}
438
424
439
425
/* Everything flushed out, free pages now */
440
- free_page_list ( freelist );
426
+ put_pages_list ( & freelist );
441
427
442
428
return ret ;
443
429
}
@@ -499,7 +485,7 @@ static void v1_free_pgtable(struct io_pgtable *iop)
499
485
{
500
486
struct amd_io_pgtable * pgtable = container_of (iop , struct amd_io_pgtable , iop );
501
487
struct protection_domain * dom ;
502
- struct page * freelist = NULL ;
488
+ LIST_HEAD ( freelist ) ;
503
489
504
490
if (pgtable -> mode == PAGE_MODE_NONE )
505
491
return ;
@@ -516,9 +502,9 @@ static void v1_free_pgtable(struct io_pgtable *iop)
516
502
BUG_ON (pgtable -> mode < PAGE_MODE_NONE ||
517
503
pgtable -> mode > PAGE_MODE_6_LEVEL );
518
504
519
- freelist = free_sub_pt (pgtable -> root , pgtable -> mode , freelist );
505
+ free_sub_pt (pgtable -> root , pgtable -> mode , & freelist );
520
506
521
- free_page_list ( freelist );
507
+ put_pages_list ( & freelist );
522
508
}
523
509
524
510
static struct io_pgtable * v1_alloc_pgtable (struct io_pgtable_cfg * cfg , void * cookie )
0 commit comments