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,6 +197,34 @@ err_brk: ...@@ -197,6 +197,34 @@ err_brk:
return ret; return ret;
} }
static int send_one_pkt(int fd, struct sk_packet *pkt)
{
int ret;
SkPacketEntry *entry = pkt->entry;
/*
* 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
* each page. It creates a big overhead on SNDBUF.
* sendfile() isn't suitable for DGRAM sockets, because message
* boundaries messages should be saved.
*/
ret = write(fd, pkt->data, entry->length);
xfree(pkt->data);
if (ret < 0) {
pr_perror("Failed to send packet");
return -1;
}
if (ret != entry->length) {
pr_err("Restored skb trimmed to %d/%d\n",
ret, (unsigned int)entry->length);
return -1;
}
return 0;
}
int restore_sk_queue(int fd, unsigned int peer_id) int restore_sk_queue(int fd, unsigned int peer_id)
{ {
struct sk_packet *pkt, *tmp; struct sk_packet *pkt, *tmp;
...@@ -216,26 +244,10 @@ int restore_sk_queue(int fd, unsigned int peer_id) ...@@ -216,26 +244,10 @@ int restore_sk_queue(int fd, unsigned int peer_id)
pr_info("\tRestoring %d-bytes skb for %u\n", pr_info("\tRestoring %d-bytes skb for %u\n",
(unsigned int)entry->length, peer_id); (unsigned int)entry->length, peer_id);
/* ret = send_one_pkt(fd, pkt);
* Don't try to use sendfile here, because it use sendpage() and if (ret)
* all data are split on pages and a new skb is allocated for
* each page. It creates a big overhead on SNDBUF.
* sendfile() isn't suitable for DGRAM sockets, because message
* boundaries messages should be saved.
*/
ret = write(fd, pkt->data, entry->length);
xfree(pkt->data);
if (ret < 0) {
pr_perror("Failed to send packet");
goto out;
}
if (ret != entry->length) {
pr_err("Restored skb trimmed to %d/%d\n",
ret, (unsigned int)entry->length);
ret = -1;
goto out; goto out;
}
list_del(&pkt->list); list_del(&pkt->list);
sk_packet_entry__free_unpacked(entry, NULL); sk_packet_entry__free_unpacked(entry, NULL);
xfree(pkt); 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