Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109363393
D30566.id90164.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D30566.id90164.diff
View Options
Index: sys/netinet/libalias/alias_db.c
===================================================================
--- sys/netinet/libalias/alias_db.c
+++ sys/netinet/libalias/alias_db.c
@@ -176,6 +176,7 @@
#endif
static LIST_HEAD(, libalias) instancehead = LIST_HEAD_INITIALIZER(instancehead);
+int LibAliasTime;
/*
Constants (note: constants are also defined
@@ -820,7 +821,7 @@
if (lnk == NULL || *lnk == NULL)
return;
- if (la->timeStamp - (*lnk)->timestamp > (*lnk)->expire_time) {
+ if (LibAliasTime - (*lnk)->timestamp > (*lnk)->expire_time) {
DeleteLink(lnk);
if ((*lnk) == NULL)
return;
@@ -940,7 +941,7 @@
#endif
lnk->flags = 0;
lnk->pflags = 0;
- lnk->timestamp = la->timeStamp;
+ lnk->timestamp = LibAliasTime;
/* Expiration time */
switch (link_type) {
@@ -1109,7 +1110,7 @@
CleanupLink(la, &lnk);
if (lnk != NULL)
- lnk->timestamp = la->timeStamp;
+ lnk->timestamp = LibAliasTime;
/* Search for partially specified links. */
if (lnk == NULL && replace_partial_links) {
@@ -1240,7 +1241,7 @@
CleanupLink(la, &lnk_fully_specified);
if (lnk_fully_specified != NULL) {
- lnk_fully_specified->timestamp = la->timeStamp;
+ lnk_fully_specified->timestamp = LibAliasTime;
lnk = lnk_fully_specified;
} else if (lnk_unknown_dst_port != NULL)
lnk = lnk_unknown_dst_port;
@@ -2101,24 +2102,45 @@
void
HouseKeeping(struct libalias *la)
{
- struct alias_link * lnk = TAILQ_FIRST(&la->checkExpire);
-#ifndef _KERNEL
- struct timeval tv;
-#endif
+ static unsigned int packets = 0;
+ static unsigned int packet_limit = 1000;
LIBALIAS_LOCK_ASSERT(la);
+ packets++;
+
/*
- * Save system time (seconds) in global variable timeStamp for use
- * by other functions. This is done so as not to unnecessarily
- * waste timeline by making system calls.
+ * User space time/gettimeofday/... is very expensive.
+ * Kernel space cache trashing is unnecessary.
+ *
+ * Save system time (seconds) in global variable LibAliasTime
+ * for use by other functions. This is done so as not to
+ * unnecessarily waste timeline by making system calls.
+ *
+ * Reduce the amount of house keeping work substantially by
+ * sampling over the packets.
*/
+ if (packets > packet_limit) {
+ time_t now;
+
#ifdef _KERNEL
- la->timeStamp = time_uptime;
+ now = time_uptime;
#else
- gettimeofday(&tv, NULL);
- la->timeStamp = tv.tv_sec;
+ now = time(NULL);
#endif
- CleanupLink(la, &lnk);
+ if (now != LibAliasTime) {
+ /* retry three times a second */
+ packet_limit = packets / 3;
+ packets = 0;
+ LibAliasTime = now;
+ }
+ }
+
+ /* Do a cleanup for the first packets of the new second only */
+ if (packets < 1000) {
+ struct alias_link * lnk = TAILQ_FIRST(&la->checkExpire);
+
+ CleanupLink(la, &lnk);
+ }
}
/* Init the log file and enable logging */
@@ -2392,9 +2414,6 @@
LibAliasInit(struct libalias *la)
{
int i;
-#ifndef _KERNEL
- struct timeval tv;
-#endif
if (la == NULL) {
#ifdef _KERNEL
@@ -2414,10 +2433,9 @@
LIST_INSERT_HEAD(&instancehead, la, instancelist);
#ifdef _KERNEL
- la->timeStamp = time_uptime;
+ LibAliasTime = time_uptime;
#else
- gettimeofday(&tv, NULL);
- la->timeStamp = tv.tv_sec;
+ LibAliasTime = time(NULL);
#endif
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++)
Index: sys/netinet/libalias/alias_local.h
===================================================================
--- sys/netinet/libalias/alias_local.h
+++ sys/netinet/libalias/alias_local.h
@@ -107,8 +107,6 @@
int sockCount;
/* Index to chain of link table being inspected for old links */
int cleanupIndex;
- /* System time in seconds for current packet */
- int timeStamp;
/* If equal to zero, DeleteLink()
* will not remove permanent links */
int deleteAllLinks;
@@ -208,6 +206,9 @@
/* Prototypes */
+/* System time in seconds for current packet */
+extern int LibAliasTime;
+
/*
* SctpFunction prototypes
*
Index: sys/netinet/libalias/alias_sctp.c
===================================================================
--- sys/netinet/libalias/alias_sctp.c
+++ sys/netinet/libalias/alias_sctp.c
@@ -298,10 +298,10 @@
#define SN_MAX_TIMER 600
#define SN_TIMER_QUEUE_SIZE SN_MAX_TIMER+2
-#define SN_I_T(la) (la->timeStamp + sysctl_init_timer) /**< INIT State expiration time in seconds */
-#define SN_U_T(la) (la->timeStamp + sysctl_up_timer) /**< UP State expiration time in seconds */
-#define SN_C_T(la) (la->timeStamp + sysctl_shutdown_timer) /**< CL State expiration time in seconds */
-#define SN_X_T(la) (la->timeStamp + sysctl_holddown_timer) /**< Wait after a shutdown complete in seconds */
+#define SN_I_T(la) (LibAliasTime + sysctl_init_timer) /**< INIT State expiration time in seconds */
+#define SN_U_T(la) (LibAliasTime + sysctl_up_timer) /**< UP State expiration time in seconds */
+#define SN_C_T(la) (LibAliasTime + sysctl_shutdown_timer) /**< CL State expiration time in seconds */
+#define SN_X_T(la) (LibAliasTime + sysctl_holddown_timer) /**< Wait after a shutdown complete in seconds */
/** @}
* @defgroup sysctl SysCtl Variable and callback function declarations
*
@@ -667,9 +667,9 @@
for (i = 0; i < SN_TIMER_QUEUE_SIZE; i++)
LIST_INIT(&la->sctpNatTimer.TimerQ[i]);
#ifdef _KERNEL
- la->sctpNatTimer.loc_time=time_uptime; /* la->timeStamp is not set yet */
+ la->sctpNatTimer.loc_time=time_uptime; /* LibAliasTime is not set yet */
#else
- la->sctpNatTimer.loc_time=la->timeStamp;
+ la->sctpNatTimer.loc_time=LibAliasTime;
#endif
la->sctpNatTimer.cur_loc = 0;
la->sctpLinkCount = 0;
@@ -2493,12 +2493,12 @@
struct sctp_nat_assoc *assoc;
LIBALIAS_LOCK_ASSERT(la);
- while(la->timeStamp >= la->sctpNatTimer.loc_time) {
+ while(LibAliasTime >= la->sctpNatTimer.loc_time) {
while (!LIST_EMPTY(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc])) {
assoc = LIST_FIRST(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc]);
//SLIST_REMOVE_HEAD(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc], timer_Q);
LIST_REMOVE(assoc, timer_Q);
- if (la->timeStamp >= assoc->exp) { /* state expired */
+ if (LibAliasTime >= assoc->exp) { /* state expired */
SN_LOG(((assoc->state == SN_CL) ? (SN_LOG_DEBUG) : (SN_LOG_INFO)),
logsctperror("Timer Expired", assoc->g_vtag, assoc->state, SN_TO_NODIR));
RmSctpAssoc(la, assoc);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 5, 2:22 AM (45 m, 47 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16465232
Default Alt Text
D30566.id90164.diff (6 KB)
Attached To
Mode
D30566: libalias: Promote per instance global variable timeStamp
Attached
Detach File
Event Timeline
Log In to Comment