@@ -104,12 +104,6 @@ static u32 page_to_balloon_pfn(struct page *page)
104
104
return pfn * VIRTIO_BALLOON_PAGES_PER_PAGE ;
105
105
}
106
106
107
- static struct page * balloon_pfn_to_page (u32 pfn )
108
- {
109
- BUG_ON (pfn % VIRTIO_BALLOON_PAGES_PER_PAGE );
110
- return pfn_to_page (pfn / VIRTIO_BALLOON_PAGES_PER_PAGE );
111
- }
112
-
113
107
static void balloon_ack (struct virtqueue * vq )
114
108
{
115
109
struct virtio_balloon * vb = vq -> vdev -> priv ;
@@ -138,8 +132,10 @@ static void set_page_pfns(struct virtio_balloon *vb,
138
132
{
139
133
unsigned int i ;
140
134
141
- /* Set balloon pfns pointing at this page.
142
- * Note that the first pfn points at start of the page. */
135
+ /*
136
+ * Set balloon pfns pointing at this page.
137
+ * Note that the first pfn points at start of the page.
138
+ */
143
139
for (i = 0 ; i < VIRTIO_BALLOON_PAGES_PER_PAGE ; i ++ )
144
140
pfns [i ] = cpu_to_virtio32 (vb -> vdev ,
145
141
page_to_balloon_pfn (page ) + i );
@@ -182,18 +178,16 @@ static unsigned fill_balloon(struct virtio_balloon *vb, size_t num)
182
178
return num_allocated_pages ;
183
179
}
184
180
185
- static void release_pages_balloon (struct virtio_balloon * vb )
181
+ static void release_pages_balloon (struct virtio_balloon * vb ,
182
+ struct list_head * pages )
186
183
{
187
- unsigned int i ;
188
- struct page * page ;
184
+ struct page * page , * next ;
189
185
190
- /* Find pfns pointing at start of each page, get pages and free them. */
191
- for (i = 0 ; i < vb -> num_pfns ; i += VIRTIO_BALLOON_PAGES_PER_PAGE ) {
192
- page = balloon_pfn_to_page (virtio32_to_cpu (vb -> vdev ,
193
- vb -> pfns [i ]));
186
+ list_for_each_entry_safe (page , next , pages , lru ) {
194
187
if (!virtio_has_feature (vb -> vdev ,
195
188
VIRTIO_BALLOON_F_DEFLATE_ON_OOM ))
196
189
adjust_managed_page_count (page , 1 );
190
+ list_del (& page -> lru );
197
191
put_page (page ); /* balloon reference */
198
192
}
199
193
}
@@ -203,6 +197,7 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
203
197
unsigned num_freed_pages ;
204
198
struct page * page ;
205
199
struct balloon_dev_info * vb_dev_info = & vb -> vb_dev_info ;
200
+ LIST_HEAD (pages );
206
201
207
202
/* We can only do one array worth at a time. */
208
203
num = min (num , ARRAY_SIZE (vb -> pfns ));
@@ -216,6 +211,7 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
216
211
if (!page )
217
212
break ;
218
213
set_page_pfns (vb , vb -> pfns + vb -> num_pfns , page );
214
+ list_add (& page -> lru , & pages );
219
215
vb -> num_pages -= VIRTIO_BALLOON_PAGES_PER_PAGE ;
220
216
}
221
217
@@ -227,7 +223,7 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
227
223
*/
228
224
if (vb -> num_pfns != 0 )
229
225
tell_host (vb , vb -> deflate_vq );
230
- release_pages_balloon (vb );
226
+ release_pages_balloon (vb , & pages );
231
227
mutex_unlock (& vb -> balloon_lock );
232
228
return num_freed_pages ;
233
229
}
0 commit comments