91 lines
3.1 KiB
Diff
91 lines
3.1 KiB
Diff
From 19afb1431bd730a1e4e09e3c0835c35572517268 Mon Sep 17 00:00:00 2001
|
|
From: Derek Su <dereksu@qnap.com>
|
|
Date: Fri, 22 May 2020 15:53:57 +0800
|
|
Subject: [PATCH 07/11] colo-compare: Fix memory leak in packet_enqueue()
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The patch is to fix the "pkt" memory leak in packet_enqueue().
|
|
The allocated "pkt" needs to be freed if the colo compare
|
|
primary or secondary queue is too big.
|
|
|
|
Replace the error_report of full queue with a trace event.
|
|
|
|
Signed-off-by: Derek Su <dereksu@qnap.com>
|
|
Reviewed-by: Zhang Chen <chen.zhang@intel.com>
|
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
Signed-off-by: Zhang Chen <chen.zhang@intel.com>
|
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
|
Signed-off-by: BiaoXiang Ye <yebiaoxiang@huawei.com>
|
|
---
|
|
net/colo-compare.c | 23 +++++++++++++++--------
|
|
net/trace-events | 1 +
|
|
2 files changed, 16 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/net/colo-compare.c b/net/colo-compare.c
|
|
index 7ee17f2c..3168407e 100644
|
|
--- a/net/colo-compare.c
|
|
+++ b/net/colo-compare.c
|
|
@@ -120,6 +120,10 @@ enum {
|
|
SECONDARY_IN,
|
|
};
|
|
|
|
+static const char *colo_mode[] = {
|
|
+ [PRIMARY_IN] = "primary",
|
|
+ [SECONDARY_IN] = "secondary",
|
|
+};
|
|
|
|
static int compare_chr_send(CompareState *s,
|
|
const uint8_t *buf,
|
|
@@ -215,6 +219,7 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con)
|
|
ConnectionKey key;
|
|
Packet *pkt = NULL;
|
|
Connection *conn;
|
|
+ int ret;
|
|
|
|
if (mode == PRIMARY_IN) {
|
|
pkt = packet_new(s->pri_rs.buf,
|
|
@@ -243,16 +248,18 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con)
|
|
}
|
|
|
|
if (mode == PRIMARY_IN) {
|
|
- if (!colo_insert_packet(&conn->primary_list, pkt, &conn->pack)) {
|
|
- error_report("colo compare primary queue size too big,"
|
|
- "drop packet");
|
|
- }
|
|
+ ret = colo_insert_packet(&conn->primary_list, pkt, &conn->pack);
|
|
} else {
|
|
- if (!colo_insert_packet(&conn->secondary_list, pkt, &conn->sack)) {
|
|
- error_report("colo compare secondary queue size too big,"
|
|
- "drop packet");
|
|
- }
|
|
+ ret = colo_insert_packet(&conn->secondary_list, pkt, &conn->sack);
|
|
}
|
|
+
|
|
+ if (!ret) {
|
|
+ trace_colo_compare_drop_packet(colo_mode[mode],
|
|
+ "queue size too big, drop packet");
|
|
+ packet_destroy(pkt, NULL);
|
|
+ pkt = NULL;
|
|
+ }
|
|
+
|
|
*con = conn;
|
|
|
|
return 0;
|
|
diff --git a/net/trace-events b/net/trace-events
|
|
index ac570564..a9995387 100644
|
|
--- a/net/trace-events
|
|
+++ b/net/trace-events
|
|
@@ -12,6 +12,7 @@ colo_proxy_main(const char *chr) ": %s"
|
|
|
|
# colo-compare.c
|
|
colo_compare_main(const char *chr) ": %s"
|
|
+colo_compare_drop_packet(const char *queue, const char *chr) ": %s: %s"
|
|
colo_compare_udp_miscompare(const char *sta, int size) ": %s = %d"
|
|
colo_compare_icmp_miscompare(const char *sta, int size) ": %s = %d"
|
|
colo_compare_ip_info(int psize, const char *sta, const char *stb, int ssize, const char *stc, const char *std) "ppkt size = %d, ip_src = %s, ip_dst = %s, spkt size = %d, ip_src = %s, ip_dst = %s"
|
|
--
|
|
2.27.0.dirty
|
|
|