blob: 989f430c4539c62ca68675424e79c86ee42720ba (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#ifndef LINUX_DNBD_NET_H
#define LINUX_DNBD_NET_H 1
#include <linux/version.h>
#include <linux/spinlock.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
#include <asm/semaphore.h>
#else
#include <linux/semaphore.h>
#endif
#include <linux/list.h>
#include <linux/param.h>
#include <linux/jiffies.h>
#define SERVERS_MAX 8
#define SERVER_STALLED -1
#define SERVER_INACTIVE 0
#define SERVER_ACTIVE 1
/* limits and other constants for SRTT calculations */
#define TIMEOUT_MIN 1
#define TIMEOUT_MAX HZ / 4
#define TIMEOUT_STALLED 5 * HZ
#define TIMEOUT_SHIFT 2
/* beta is 99% (990/1000) */
#define SRTT_BETA 990
#define SRTT_BETA_BASE 1000
#define SRTT_SHIFT 10
/* normalize weights to 255 as there is no float arithmetic in kernel */
#define WEIGHT_NORMAL ((1<<8)-1)
#define WEIGHT_FACTOR (1<<20)
#define dnbd_rx_update(servers, id) \
if ((id > 0) && (id <= SERVERS_MAX)) servers.serverlist[id-1].last_rx = jiffies;
#define dnbd_tx_update(servers, id) \
if ((id > 0) && (id <= SERVERS_MAX)) servers.serverlist[id-1].last_tx = jiffies;
/* characteristics of a server */
struct dnbd_server {
int id;
int state;
int srtt;
int weight;
unsigned long last_rx; /* in jiffies */
unsigned long last_tx; /* in jiffies */
};
typedef struct dnbd_server dnbd_server_t;
/* common server information and helper variables */
struct dnbd_servers {
struct dnbd_server *serverlist;
struct dnbd_server *server;
spinlock_t lock;
struct semaphore sema;
int timeout_min;
int timeout_max;
int timeout_stalled;
int asrtt;
int count;
};
typedef struct dnbd_servers dnbd_servers_t;
/* functions */
int dnbd_set_serverid(dnbd_servers_t * servers, int id);
int dnbd_next_server(dnbd_servers_t * servers);
void dnbd_rem_servers(dnbd_servers_t * servers);
void dnbd_rtt_server(dnbd_servers_t * servers, int id, int rtt);
int dnbd_servers_init(dnbd_servers_t *servers);
void dnbd_servers_weight(dnbd_servers_t * servers);
int dnbd_show_servers(dnbd_servers_t * servers, void *buf, int size);
void dnbd_clean_servers(dnbd_servers_t * servers);
#endif
|