[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