[CRIU] [PATCH 2/2] sckets: reorganize queues restore
Kinsbursky Stanislav
skinsbursky at openvz.org
Fri Mar 2 09:36:37 EST 2012
First move peer packets to another list, then go over it without checks.
This allow to add some more usefull debug prints (nr of packets, for example).
It also allows to restore sockets queues in parallel (which cound be usefull
later).
Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
---
sockets.c | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/sockets.c b/sockets.c
index 1902d20..f1896fa 100644
--- a/sockets.c
+++ b/sockets.c
@@ -756,17 +756,37 @@ static int restore_socket_queue(struct sk_packets_pool *pool, int fd,
{
struct sk_packet *pkt, *tmp;
int ret;
-
- pr_info("%d: Restoring recv queue for %u: ", pool->pid, peer_id);
+ int size_size, queue_size, pkt_nr = 0, pkts_size = 0;
+ socklen_t len = sizeof(queue_size);
+ LIST_HEAD(peer_packets);
list_for_each_entry_safe(pkt, tmp, &pool->packets_list, list) {
- struct sk_packet_entry *entry = &pkt->entry;
-
- if (entry->id_for != peer_id)
+ if (pkt->entry.id_for != peer_id)
continue;
+ list_move_tail(&pkt->list, &peer_packets);
+ pkts_size += pkt->entry.length;
+ pkt_nr++;
+ }
+
+ if (!pkt_nr)
+ return 0;
+
+ pr_info("%d: Restoring recv queue for %u: %d packets (overall size: %d bytes)\n", pool->pid, peer_id, pkt_nr, pkts_size);
- pr_info("\tRestoring %d-bytes skb for %u\n",
- entry->length, peer_id);
+ ret = getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &queue_size, &len);
+ if (ret < 0) {
+ pr_perror("%d: Failed to get snd buffer size", pool->pid);
+ return -1;
+ }
+
+ if (pkts_size > queue_size) {
+ pr_err("%d: Can't restore queue - not enough space: %d (required %d)\n",
+ pool->pid, queue_size, pkts_size);
+ return -1;
+ }
+
+ list_for_each_entry_safe(pkt, tmp, &peer_packets, list) {
+ struct sk_packet_entry *entry = &pkt->entry;
ret = sendfile(fd, pool->img_fd, &pkt->img_off, entry->length);
if (ret < 0) {
More information about the CRIU
mailing list