[CRIU] [PATCH v2] page-xfer: page_server_get_pages: replace BUG_ONs with 'return -1'

Mike Rapoport rppt at linux.vnet.ibm.com
Sun Nov 27 01:47:43 PST 2016


Instead of crashing dump/page-server when a problem detected after the
page-pipe was split, print nice error messages and return error.

Signed-off-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
---
v2: explicitly define requested length as unsigned long to avoid printf
warnings for different build types for different format specifiers

 criu/page-xfer.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index ad89bc9..cae63f4 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -626,6 +626,31 @@ static int page_server_add(int sk, struct page_server_iov *pi, u32 flags)
 	return 0;
 }
 
+static bool can_send_pages(struct page_pipe_buf *ppb, struct iovec *iov,
+			   struct page_server_iov *pi)
+{
+	unsigned long len = pi->nr_pages * PAGE_SIZE;
+
+	if (!(ppb->flags & PPB_LAZY)) {
+		pr_err("Requested pages are not lazy\n");
+		return false;
+	}
+
+	if (iov->iov_len != len) {
+		pr_err("IOV len %zu does not match requested %lu\n",
+		       iov->iov_len, len);
+		return false;
+	}
+
+	if(pi->vaddr != encode_pointer(iov->iov_base)) {
+		pr_err("IOV start %p does not match requested addr %"PRIx64"\n",
+		       iov->iov_base, pi->vaddr);
+		return false;
+	}
+
+	return true;
+}
+
 static int page_server_get_pages(int sk, struct page_server_iov *pi)
 {
 	struct pstree_item *item;
@@ -650,9 +675,8 @@ static int page_server_get_pages(int sk, struct page_server_iov *pi)
 	ppb = list_first_entry(&pp->bufs, struct page_pipe_buf, l);
 	iov = &ppb->iov[0];
 
-	BUG_ON(!(ppb->flags & PPB_LAZY));
-	BUG_ON(iov->iov_len != pi->nr_pages * PAGE_SIZE);
-	BUG_ON(pi->vaddr != encode_pointer(iov->iov_base));
+	if (!can_send_pages(ppb, iov, pi))
+		return -1;
 
 	if (send_psi(sk, PS_IOV_ADD, pi->nr_pages, pi->vaddr, pi->dst_id))
 		return -1;
-- 
1.9.1



More information about the CRIU mailing list