Message ID | 1617938456-315058-6-git-send-email-lei.rao@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fixed some bugs and optimized some codes for COLO | expand |
> -----Original Message----- > From: Rao, Lei <lei.rao@intel.com> > Sent: Friday, April 9, 2021 11:21 AM > To: Zhang, Chen <chen.zhang@intel.com>; lizhijian@cn.fujitsu.com; > jasowang@redhat.com; quintela@redhat.com; dgilbert@redhat.com; > pbonzini@redhat.com; lukasstraub2@web.de > Cc: qemu-devel@nongnu.org; Rao, Lei <lei.rao@intel.com> > Subject: [PATCH v6 05/10] Add a function named packet_new_nocopy for > COLO. > > From: "Rao, Lei" <lei.rao@intel.com> > > Use the packet_new_nocopy instead of packet_new in the filter-rewriter > module. There will be one less memory copy in the processing of each > network packet. > > Signed-off-by: Lei Rao <lei.rao@intel.com> Reviewed-by: Zhang Chen <chen.zhang@intel.com> Thanks Chen > --- > net/colo.c | 25 +++++++++++++++++-------- > net/colo.h | 1 + > net/filter-rewriter.c | 3 +-- > 3 files changed, 19 insertions(+), 10 deletions(-) > > diff --git a/net/colo.c b/net/colo.c > index ef00609..3a3e6e8 100644 > --- a/net/colo.c > +++ b/net/colo.c > @@ -157,19 +157,28 @@ void connection_destroy(void *opaque) > > Packet *packet_new(const void *data, int size, int vnet_hdr_len) { > - Packet *pkt = g_slice_new(Packet); > + Packet *pkt = g_slice_new0(Packet); > > pkt->data = g_memdup(data, size); > pkt->size = size; > pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST); > pkt->vnet_hdr_len = vnet_hdr_len; > - pkt->tcp_seq = 0; > - pkt->tcp_ack = 0; > - pkt->seq_end = 0; > - pkt->header_size = 0; > - pkt->payload_size = 0; > - pkt->offset = 0; > - pkt->flags = 0; > + > + return pkt; > +} > + > +/* > + * packet_new_nocopy will not copy data, so the caller can't release > + * the data. And it will be released in packet_destroy. > + */ > +Packet *packet_new_nocopy(void *data, int size, int vnet_hdr_len) { > + Packet *pkt = g_slice_new0(Packet); > + > + pkt->data = data; > + pkt->size = size; > + pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST); > + pkt->vnet_hdr_len = vnet_hdr_len; > > return pkt; > } > diff --git a/net/colo.h b/net/colo.h > index 573ab91..d91cd24 100644 > --- a/net/colo.h > +++ b/net/colo.h > @@ -101,6 +101,7 @@ bool connection_has_tracked(GHashTable > *connection_track_table, > ConnectionKey *key); void > connection_hashtable_reset(GHashTable *connection_track_table); Packet > *packet_new(const void *data, int size, int vnet_hdr_len); > +Packet *packet_new_nocopy(void *data, int size, int vnet_hdr_len); > void packet_destroy(void *opaque, void *user_data); void > packet_destroy_partial(void *opaque, void *user_data); > > diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c index 10fe393..cb3a96c > 100644 > --- a/net/filter-rewriter.c > +++ b/net/filter-rewriter.c > @@ -270,8 +270,7 @@ static ssize_t > colo_rewriter_receive_iov(NetFilterState *nf, > vnet_hdr_len = nf->netdev->vnet_hdr_len; > } > > - pkt = packet_new(buf, size, vnet_hdr_len); > - g_free(buf); > + pkt = packet_new_nocopy(buf, size, vnet_hdr_len); > > /* > * if we get tcp packet > -- > 1.8.3.1
diff --git a/net/colo.c b/net/colo.c index ef00609..3a3e6e8 100644 --- a/net/colo.c +++ b/net/colo.c @@ -157,19 +157,28 @@ void connection_destroy(void *opaque) Packet *packet_new(const void *data, int size, int vnet_hdr_len) { - Packet *pkt = g_slice_new(Packet); + Packet *pkt = g_slice_new0(Packet); pkt->data = g_memdup(data, size); pkt->size = size; pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST); pkt->vnet_hdr_len = vnet_hdr_len; - pkt->tcp_seq = 0; - pkt->tcp_ack = 0; - pkt->seq_end = 0; - pkt->header_size = 0; - pkt->payload_size = 0; - pkt->offset = 0; - pkt->flags = 0; + + return pkt; +} + +/* + * packet_new_nocopy will not copy data, so the caller can't release + * the data. And it will be released in packet_destroy. + */ +Packet *packet_new_nocopy(void *data, int size, int vnet_hdr_len) +{ + Packet *pkt = g_slice_new0(Packet); + + pkt->data = data; + pkt->size = size; + pkt->creation_ms = qemu_clock_get_ms(QEMU_CLOCK_HOST); + pkt->vnet_hdr_len = vnet_hdr_len; return pkt; } diff --git a/net/colo.h b/net/colo.h index 573ab91..d91cd24 100644 --- a/net/colo.h +++ b/net/colo.h @@ -101,6 +101,7 @@ bool connection_has_tracked(GHashTable *connection_track_table, ConnectionKey *key); void connection_hashtable_reset(GHashTable *connection_track_table); Packet *packet_new(const void *data, int size, int vnet_hdr_len); +Packet *packet_new_nocopy(void *data, int size, int vnet_hdr_len); void packet_destroy(void *opaque, void *user_data); void packet_destroy_partial(void *opaque, void *user_data); diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c index 10fe393..cb3a96c 100644 --- a/net/filter-rewriter.c +++ b/net/filter-rewriter.c @@ -270,8 +270,7 @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, vnet_hdr_len = nf->netdev->vnet_hdr_len; } - pkt = packet_new(buf, size, vnet_hdr_len); - g_free(buf); + pkt = packet_new_nocopy(buf, size, vnet_hdr_len); /* * if we get tcp packet