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