Blame SOURCES/0004-avahi-core-reserve-space-for-record-data-when-size-e.patch

263faa
From 86e213fbd0d24b5b2e58d474d27d47b222011936 Mon Sep 17 00:00:00 2001
263faa
From: "Lee, Chun-Yi" <jlee at suse.com>
263faa
Date: Mon, 10 Sep 2012 10:27:56 +0800
263faa
Subject: [PATCH 4/4] avahi-core: reserve space for record data when size
263faa
 estimate
263faa
263faa
When we tested put a lot of airprint service files(have 45 to 60 flies), found
263faa
there have cpu loadinghigh problem when start avahi-daemon with those service
263faa
files.
263faa
263faa
After traced source code, there have problem in probe-sched.c::elapse_callback
263faa
causes doesn't have any probe job set to DONE so the daemon unlimited send out
263faa
DNS package.
263faa
263faa
The root cause is when compare with the free package space in
263faa
packet_add_probe_query before attach job key, the free package space doesn't
263faa
include any record data that will attached after all keys attached. This defect
263faa
causes whole DNS package is filled by job key, but doesn't remain enough space
263faa
for any rdata. Then, that means have no job set to DONE.
263faa
263faa
This patch add a new res_size member to AvahiDnsPacket, it used to sum the
263faa
reserve size for record data the will attached after all keys attached. It can
263faa
avoid keys consume whole size until p->size larger then p->max_size.
263faa
263faa
Resolves: #1081801
263faa
---
263faa
 avahi-core/dns.c         | 20 ++++++++++++++++++++
263faa
 avahi-core/dns.h         |  4 +++-
263faa
 avahi-core/probe-sched.c | 10 ++++++++--
263faa
 3 files changed, 31 insertions(+), 3 deletions(-)
263faa
263faa
diff --git a/avahi-core/dns.c b/avahi-core/dns.c
263faa
index 2fcd91f..523afdc 100644
263faa
--- a/avahi-core/dns.c
263faa
+++ b/avahi-core/dns.c
263faa
@@ -55,6 +55,7 @@ AvahiDnsPacket* avahi_dns_packet_new(unsigned mtu) {
263faa
 
263faa
     p->size = p->rindex = AVAHI_DNS_PACKET_HEADER_SIZE;
263faa
     p->max_size = max_size;
263faa
+    p->res_size = 0;
263faa
     p->name_table = NULL;
263faa
     p->data = NULL;
263faa
 
263faa
@@ -833,6 +834,25 @@ size_t avahi_dns_packet_space(AvahiDnsPacket *p) {
263faa
     return p->max_size - p->size;
263faa
 }
263faa
 
263faa
+size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t res_size) {
263faa
+    assert(p);
263faa
+
263faa
+    assert(p->size + p->res_size <= p->max_size);
263faa
+
263faa
+    if ((p->size + p->res_size + res_size) <= p->max_size)
263faa
+	p->res_size += res_size;
263faa
+
263faa
+    return p->res_size;
263faa
+}
263faa
+
263faa
+size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p) {
263faa
+    assert(p);
263faa
+
263faa
+    assert(p->size + p->res_size <= p->max_size);
263faa
+
263faa
+    return p->max_size - p->size - p->res_size;
263faa
+}
263faa
+
263faa
 int avahi_rdata_parse(AvahiRecord *record, const void* rdata, size_t size) {
263faa
     int ret;
263faa
     AvahiDnsPacket p;
263faa
diff --git a/avahi-core/dns.h b/avahi-core/dns.h
263faa
index 52e8d88..13b1ac2 100644
263faa
--- a/avahi-core/dns.h
263faa
+++ b/avahi-core/dns.h
263faa
@@ -30,7 +30,7 @@
263faa
 #define AVAHI_DNS_PACKET_SIZE_MAX (AVAHI_DNS_PACKET_HEADER_SIZE + 256 + 2 + 2 + 4 + 2 + AVAHI_DNS_RDATA_MAX)
263faa
 
263faa
 typedef struct AvahiDnsPacket {
263faa
-    size_t size, rindex, max_size;
263faa
+    size_t size, rindex, max_size, res_size;
263faa
     AvahiHashmap *name_table; /* for name compression */
263faa
     uint8_t *data;
263faa
 } AvahiDnsPacket;
263faa
@@ -78,6 +78,8 @@ int avahi_dns_packet_skip(AvahiDnsPacket *p, size_t length);
263faa
 
263faa
 int avahi_dns_packet_is_empty(AvahiDnsPacket *p);
263faa
 size_t avahi_dns_packet_space(AvahiDnsPacket *p);
263faa
+size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t res_size);
263faa
+size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p);
263faa
 
263faa
 #define AVAHI_DNS_FIELD_ID 0
263faa
 #define AVAHI_DNS_FIELD_FLAGS 1
263faa
diff --git a/avahi-core/probe-sched.c b/avahi-core/probe-sched.c
263faa
index 1e63411..63cb817 100644
263faa
--- a/avahi-core/probe-sched.c
263faa
+++ b/avahi-core/probe-sched.c
263faa
@@ -179,7 +179,7 @@ static int packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
263faa
         avahi_record_get_estimate_size(pj->record);
263faa
 
263faa
     /* Too large */
263faa
-    if (size > avahi_dns_packet_space(p))
263faa
+    if (size > avahi_dns_packet_reserved_space(p))
263faa
         return 0;
263faa
 
263faa
     /* Create the probe query */
263faa
@@ -189,6 +189,9 @@ static int packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
263faa
     b = !!avahi_dns_packet_append_key(p, k, 0);
263faa
     assert(b);
263faa
 
263faa
+    /* reserve size for record data */
263faa
+    avahi_dns_packet_reserve_size(p, avahi_record_get_estimate_size(pj->record));
263faa
+
263faa
     /* Mark this job for addition to the packet */
263faa
     pj->chosen = 1;
263faa
 
263faa
@@ -202,9 +205,12 @@ static int packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
263faa
             continue;
263faa
 
263faa
         /* This job wouldn't fit in */
263faa
-        if (avahi_record_get_estimate_size(pj->record) > avahi_dns_packet_space(p))
263faa
+        if (avahi_record_get_estimate_size(pj->record) > avahi_dns_packet_reserved_space(p))
263faa
             break;
263faa
 
263faa
+	/* reserve size for record data */
263faa
+	avahi_dns_packet_reserve_size(p, avahi_record_get_estimate_size(pj->record));
263faa
+
263faa
         /* Mark this job for addition to the packet */
263faa
         pj->chosen = 1;
263faa
     }
263faa
-- 
263faa
2.3.4
263faa