Commit ff91d4f7 authored by Pavel Emelyanov's avatar Pavel Emelyanov

skqueue: Split the packets sending code

Reviewed-by: 's avatarKirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 5c84e93e
......@@ -197,25 +197,11 @@ err_brk:
return ret;
}
int restore_sk_queue(int fd, unsigned int peer_id)
static int send_one_pkt(int fd, struct sk_packet *pkt)
{
struct sk_packet *pkt, *tmp;
int ret = -1;
pr_info("Trying to restore recv queue for %u\n", peer_id);
if (restore_prepare_socket(fd))
goto out;
list_for_each_entry_safe(pkt, tmp, &packets_list, list) {
int ret;
SkPacketEntry *entry = pkt->entry;
if (entry->id_for != peer_id)
continue;
pr_info("\tRestoring %d-bytes skb for %u\n",
(unsigned int)entry->length, peer_id);
/*
* Don't try to use sendfile here, because it use sendpage() and
* all data are split on pages and a new skb is allocated for
......@@ -228,14 +214,40 @@ int restore_sk_queue(int fd, unsigned int peer_id)
xfree(pkt->data);
if (ret < 0) {
pr_perror("Failed to send packet");
goto out;
return -1;
}
if (ret != entry->length) {
pr_err("Restored skb trimmed to %d/%d\n",
ret, (unsigned int)entry->length);
ret = -1;
goto out;
return -1;
}
return 0;
}
int restore_sk_queue(int fd, unsigned int peer_id)
{
struct sk_packet *pkt, *tmp;
int ret = -1;
pr_info("Trying to restore recv queue for %u\n", peer_id);
if (restore_prepare_socket(fd))
goto out;
list_for_each_entry_safe(pkt, tmp, &packets_list, list) {
SkPacketEntry *entry = pkt->entry;
if (entry->id_for != peer_id)
continue;
pr_info("\tRestoring %d-bytes skb for %u\n",
(unsigned int)entry->length, peer_id);
ret = send_one_pkt(fd, pkt);
if (ret)
goto out;
list_del(&pkt->list);
sk_packet_entry__free_unpacked(entry, NULL);
xfree(pkt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment