diff --git a/src/jtag/commands.c b/src/jtag/commands.c
index 5e06840a693680a5604cf4e06ea10abf166b5a3a..750ebab0d6eab01bd661aaa79e8a00aae09f8d38 100644
--- a/src/jtag/commands.c
+++ b/src/jtag/commands.c
@@ -36,13 +36,14 @@
 #include "commands.h"
 
 struct cmd_queue_page {
+	struct cmd_queue_page *next;
 	void *address;
 	size_t used;
-	struct cmd_queue_page *next;
 };
 
 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
 static struct cmd_queue_page *cmd_queue_pages;
+static struct cmd_queue_page *cmd_queue_pages_tail;
 
 struct jtag_command *jtag_command_queue;
 static struct jtag_command **next_command_pointer = &jtag_command_queue;
@@ -100,8 +101,7 @@ void *cmd_queue_alloc(size_t size)
 	/* Done... */
 
 	if (*p_page) {
-		while ((*p_page)->next)
-			p_page = &((*p_page)->next);
+		p_page = &cmd_queue_pages_tail;
 		if (CMD_QUEUE_PAGE_SIZE - (*p_page)->used < size)
 			p_page = &((*p_page)->next);
 	}
@@ -113,6 +113,7 @@ void *cmd_queue_alloc(size_t size)
 					CMD_QUEUE_PAGE_SIZE : size;
 		(*p_page)->address = malloc(alloc_size);
 		(*p_page)->next = NULL;
+		cmd_queue_pages_tail = *p_page;
 	}
 
 	offset = (*p_page)->used;
@@ -134,6 +135,7 @@ static void cmd_queue_free(void)
 	}
 
 	cmd_queue_pages = NULL;
+	cmd_queue_pages_tail = NULL;
 }
 
 void jtag_command_queue_reset(void)