On 1/24/25 23:35, Alexander Atanasov wrote:
@@ -1939,11 +1949,45 @@ static void ploop_submit_embedded_pio(struct ploop 
*ploop, struct pio *pio)
        }
ploop_inc_nr_inflight(ploop, pio);
+
+       if (pio->queue_list_id == PLOOP_LIST_FLUSH) {
+               /* Let the FLUSH go last from the queue , do not run here to 
preserve ordering */
+               llist_add((struct llist_node *)(&pio->list), 
&ploop->pios[PLOOP_LIST_PREPARE]);
+               return;
+       }
+
        ploop_prepare_one_embedded_pio(ploop, pio, &deferred_pios);
+       /* check if result is a single pio , so we can try fast path */
+       if (deferred_pios.first && deferred_pios.first->next == NULL) {
+               spio = list_entry((struct list_head *)deferred_pios.first, 
typeof(*spio), list);
+               INIT_LIST_HEAD(&spio->list);
+               if (req_op(rq) == REQ_OP_READ) {
+                       unsigned int old_flags = current->flags;
+
+                       current->flags |= 
PF_IO_THREAD|PF_LOCAL_THROTTLE|PF_MEMALLOC_NOIO;
+                       ret = ploop_process_one_deferred_bio(ploop, spio);
+                       current->flags = old_flags;
+                       if (ret == 1) {
+                               /* not queued add back to deferreed*/

Small nit: You have a fixup which adds a space here after "deferreed" in "[PATCH vz9 v1 40/63] dm-ploop: process pios via runners", we can move it in this patch and fix spelling while on it, should probably be "deferred".

+                               llist_add((struct llist_node *)(&spio->list),
+                                         &ploop->pios[PLOOP_LIST_DEFERRED]);
+                       } else {
+                               return;
+                       }
+
+               } else { /* OP which can not go thru fast path */
+                       INIT_LIST_HEAD(&spio->list);
+                       llist_add((struct llist_node *)(&spio->list),
+                                 &ploop->pios[PLOOP_LIST_DEFERRED]);
+               }
+       } else {
+               struct llist_node *pos, *t;
- llist_for_each_safe(pos, t, deferred_pios.first) {
-               spio = list_entry((struct list_head *)pos, typeof(*pio), list);
-               llist_add((struct llist_node *)(&spio->list), 
&ploop->pios[PLOOP_LIST_DEFERRED]);
+               llist_for_each_safe(pos, t, deferred_pios.first) {
+                       spio = list_entry((struct list_head *)pos, 
typeof(*pio), list);
+                       llist_add((struct llist_node *)(&spio->list),
+                                 &ploop->pios[PLOOP_LIST_DEFERRED]);
+               }
        }
ploop_schedule_work(ploop);

--
Best regards, Tikhomirov Pavel
Senior Software Developer, Virtuozzo.

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to