hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/xen/xen-scsiback.c
....@@ -99,6 +99,8 @@
9999 struct list_head v2p_entry_lists;
100100
101101 wait_queue_head_t waiting_to_free;
102
+
103
+ struct gnttab_page_cache free_pages;
102104 };
103105
104106 /* theoretical maximum of grants for one request */
....@@ -188,10 +190,6 @@
188190 MODULE_PARM_DESC(max_buffer_pages,
189191 "Maximum number of free pages to keep in backend buffer");
190192
191
-static DEFINE_SPINLOCK(free_pages_lock);
192
-static int free_pages_num;
193
-static LIST_HEAD(scsiback_free_pages);
194
-
195193 /* Global spinlock to protect scsiback TPG list */
196194 static DEFINE_MUTEX(scsiback_mutex);
197195 static LIST_HEAD(scsiback_list);
....@@ -205,41 +203,6 @@
205203 {
206204 if (atomic_dec_and_test(&info->nr_unreplied_reqs))
207205 wake_up(&info->waiting_to_free);
208
-}
209
-
210
-static void put_free_pages(struct page **page, int num)
211
-{
212
- unsigned long flags;
213
- int i = free_pages_num + num, n = num;
214
-
215
- if (num == 0)
216
- return;
217
- if (i > scsiback_max_buffer_pages) {
218
- n = min(num, i - scsiback_max_buffer_pages);
219
- gnttab_free_pages(n, page + num - n);
220
- n = num - n;
221
- }
222
- spin_lock_irqsave(&free_pages_lock, flags);
223
- for (i = 0; i < n; i++)
224
- list_add(&page[i]->lru, &scsiback_free_pages);
225
- free_pages_num += n;
226
- spin_unlock_irqrestore(&free_pages_lock, flags);
227
-}
228
-
229
-static int get_free_page(struct page **page)
230
-{
231
- unsigned long flags;
232
-
233
- spin_lock_irqsave(&free_pages_lock, flags);
234
- if (list_empty(&scsiback_free_pages)) {
235
- spin_unlock_irqrestore(&free_pages_lock, flags);
236
- return gnttab_alloc_pages(1, page);
237
- }
238
- page[0] = list_first_entry(&scsiback_free_pages, struct page, lru);
239
- list_del(&page[0]->lru);
240
- free_pages_num--;
241
- spin_unlock_irqrestore(&free_pages_lock, flags);
242
- return 0;
243206 }
244207
245208 static unsigned long vaddr_page(struct page *page)
....@@ -302,7 +265,8 @@
302265 BUG_ON(err);
303266 }
304267
305
- put_free_pages(req->pages, req->n_grants);
268
+ gnttab_page_cache_put(&req->info->free_pages, req->pages,
269
+ req->n_grants);
306270 req->n_grants = 0;
307271 }
308272
....@@ -445,8 +409,8 @@
445409 struct vscsibk_info *info = pending_req->info;
446410
447411 for (i = 0; i < cnt; i++) {
448
- if (get_free_page(pg + mapcount)) {
449
- put_free_pages(pg, mapcount);
412
+ if (gnttab_page_cache_get(&info->free_pages, pg + mapcount)) {
413
+ gnttab_page_cache_put(&info->free_pages, pg, mapcount);
450414 pr_err("no grant page\n");
451415 return -ENOMEM;
452416 }
....@@ -796,6 +760,8 @@
796760 cond_resched();
797761 }
798762
763
+ gnttab_page_cache_shrink(&info->free_pages, scsiback_max_buffer_pages);
764
+
799765 RING_FINAL_CHECK_FOR_REQUESTS(&info->ring, more_to_do);
800766 return more_to_do;
801767 }
....@@ -858,7 +824,8 @@
858824 static int scsiback_map(struct vscsibk_info *info)
859825 {
860826 struct xenbus_device *dev = info->dev;
861
- unsigned int ring_ref, evtchn;
827
+ unsigned int ring_ref;
828
+ evtchn_port_t evtchn;
862829 int err;
863830
864831 err = xenbus_gather(XBT_NIL, dev->otherend,
....@@ -1188,7 +1155,7 @@
11881155 xenbus_switch_state(dev, XenbusStateClosed);
11891156 if (xenbus_dev_is_online(dev))
11901157 break;
1191
- /* fall through if not online */
1158
+ fallthrough; /* if not online */
11921159 case XenbusStateUnknown:
11931160 device_unregister(&dev->dev);
11941161 break;
....@@ -1232,6 +1199,8 @@
12321199
12331200 scsiback_release_translation_entry(info);
12341201
1202
+ gnttab_page_cache_shrink(&info->free_pages, 0);
1203
+
12351204 dev_set_drvdata(&dev->dev, NULL);
12361205
12371206 return 0;
....@@ -1262,6 +1231,7 @@
12621231 info->irq = 0;
12631232 INIT_LIST_HEAD(&info->v2p_entry_lists);
12641233 spin_lock_init(&info->v2p_lock);
1234
+ gnttab_page_cache_init(&info->free_pages);
12651235
12661236 err = xenbus_printf(XBT_NIL, dev->nodename, "feature-sg-grant", "%u",
12671237 SG_ALL);
....@@ -1404,11 +1374,6 @@
14041374 /* Go ahead and process the write immediately */
14051375 target_execute_cmd(se_cmd);
14061376
1407
- return 0;
1408
-}
1409
-
1410
-static int scsiback_write_pending_status(struct se_cmd *se_cmd)
1411
-{
14121377 return 0;
14131378 }
14141379
....@@ -1715,11 +1680,6 @@
17151680 NULL,
17161681 };
17171682
1718
-static char *scsiback_get_fabric_name(void)
1719
-{
1720
- return "xen-pvscsi";
1721
-}
1722
-
17231683 static int scsiback_port_link(struct se_portal_group *se_tpg,
17241684 struct se_lun *lun)
17251685 {
....@@ -1813,8 +1773,7 @@
18131773
18141774 static const struct target_core_fabric_ops scsiback_ops = {
18151775 .module = THIS_MODULE,
1816
- .name = "xen-pvscsi",
1817
- .get_fabric_name = scsiback_get_fabric_name,
1776
+ .fabric_name = "xen-pvscsi",
18181777 .tpg_get_wwn = scsiback_get_fabric_wwn,
18191778 .tpg_get_tag = scsiback_get_tag,
18201779 .tpg_check_demo_mode = scsiback_check_true,
....@@ -1827,7 +1786,6 @@
18271786 .sess_get_index = scsiback_sess_get_index,
18281787 .sess_get_initiator_sid = NULL,
18291788 .write_pending = scsiback_write_pending,
1830
- .write_pending_status = scsiback_write_pending_status,
18311789 .set_default_node_attributes = scsiback_set_default_node_attrs,
18321790 .get_cmd_state = scsiback_get_cmd_state,
18331791 .queue_data_in = scsiback_queue_data_in,
....@@ -1890,13 +1848,6 @@
18901848
18911849 static void __exit scsiback_exit(void)
18921850 {
1893
- struct page *page;
1894
-
1895
- while (free_pages_num) {
1896
- if (get_free_page(&page))
1897
- BUG();
1898
- gnttab_free_pages(1, &page);
1899
- }
19001851 target_unregister_template(&scsiback_ops);
19011852 xenbus_unregister_driver(&scsiback_driver);
19021853 }