Statistics
| Branch: | Revision:

root / drivers / tapdisk-loglimit.c @ abdb293f

History | View | Annotate | Download (2.8 kB)

1
/*
2
 * Copyright (c) 2011, XenSource Inc.
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 *     * Redistributions of source code must retain the above copyright
8
 *       notice, this list of conditions and the following disclaimer.
9
 *     * Redistributions in binary form must reproduce the above copyright
10
 *       notice, this list of conditions and the following disclaimer in the
11
 *       documentation and/or other materials provided with the distribution.
12
 *     * Neither the name of XenSource Inc. nor the names of its contributors
13
 *       may be used to endorse or promote products derived from this software
14
 *       without specific prior written permission.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28

    
29
/*
30
 * Simple log rate limiting. Allow for bursts, then drop messages
31
 * until some interval expired.
32
 */
33

    
34
#ifdef HAVE_CONFIG_H
35
#include "config.h"
36
#endif
37

    
38
#include "tapdisk-loglimit.h"
39
#include "compiler.h"
40
#include "list.h"
41

    
42
void
43
tapdisk_loglimit_init(td_loglimit_t *rl, int burst, int interval)
44
{
45
        rl->burst    = burst;
46
        rl->interval = interval;
47

    
48
        rl->count    = 0;
49
        rl->dropped  = 0;
50

    
51
        gettimeofday(&rl->ts, NULL);
52
}
53

    
54
static void
55
timeradd_ms(struct timeval *tv, long ms)
56
{
57
        tv->tv_usec += ms * 1000;
58
        if (tv->tv_usec > 1000000) {
59
                tv->tv_sec  += tv->tv_usec / 1000000;
60
                tv->tv_usec %= 1000000;
61
        }
62
}
63

    
64
static void
65
tapdisk_loglimit_update(td_loglimit_t *rl, struct timeval *now)
66
{
67
        struct timeval next = rl->ts;
68

    
69
        timeradd_ms(&next, rl->interval);
70

    
71
        if (timercmp(&next, now, <)) {
72
                rl->count = 0;
73
                rl->ts    = *now;
74
        }
75
}
76

    
77
static void
78
tapdisk_loglimit_update_now(td_loglimit_t *rl)
79
{
80
        struct timeval now;
81

    
82
        gettimeofday(&now, NULL);
83

    
84
        tapdisk_loglimit_update(rl, &now);
85
}
86

    
87
int
88
tapdisk_loglimit_pass(td_loglimit_t *rl)
89
{
90
        if (!rl->interval)
91
                return 1; /* unlimited */
92

    
93
        if (unlikely(rl->count >= rl->burst)) {
94

    
95
                tapdisk_loglimit_update_now(rl);
96

    
97
                if (rl->count >= rl->burst) {
98
                        rl->dropped++;
99
                        return 0;
100
                }
101
        }
102

    
103
        rl->count++;
104
        return 1;
105
}