Skip to content

Commit f3695f3

Browse files
Greg Jumpervijay-suman
authored andcommitted
Revert "net/rds: Monitor socket congestion per network namespace"
This reverts commit 4bf590d7be2ca4700a178544f937f503f6444689. Orabug: 35811116 Signed-off-by: Greg Jumper <[email protected]> Reviewed-by: Sharath Srinivasan <[email protected]> Orabug: 35811116 LUCI => v6.11-rc7 Updates: net/rds/cong.c - Added "static" qualifier to the "-" definitions of rds_cong_monitor_init() and rds_cong_monitor_free() to match the addition of "static" to the corresponding lines in the LUCI v6.11-rc7 changes to the original (pre-reversion) patch. Signed-off-by: Greg Jumper <[email protected]> Reviewed-by: Gerd Rausch <[email protected]>
1 parent b0bb19a commit f3695f3

File tree

4 files changed

+66
-93
lines changed

4 files changed

+66
-93
lines changed

net/rds/af_rds.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ static unsigned int rds_poll(struct file *file, struct socket *sock,
361361
/* When a congestion map was updated, we signal POLLIN for
362362
* "historical" reasons. Applications can also poll for
363363
* WRBAND instead. */
364-
if (rds_cong_updated_since(rs))
364+
if (rds_cong_updated_since(&rs->rs_cong_track))
365365
mask |= (POLLIN | POLLRDNORM | POLLWRBAND);
366366
} else {
367367
if (atomic64_read(&rs->rs_cong_notify))
@@ -1441,10 +1441,12 @@ static void rds_qos_threshold_init(void)
14411441

14421442
static void __exit rds_exit(void)
14431443
{
1444+
rds_cong_monitor_free();
14441445
sock_unregister(rds_family_ops.family);
14451446
proto_unregister(&rds_proto);
14461447
rds_unreg_pernet();
14471448
rds_conn_exit();
1449+
rds_cong_exit();
14481450
rds_sysctl_exit();
14491451
rds_threads_exit();
14501452
rds_stats_exit();
@@ -1492,9 +1494,12 @@ static int __init rds_init(void)
14921494
ret = rds_stats_init();
14931495
if (ret)
14941496
goto out_sysctl;
1495-
ret = proto_register(&rds_proto, 1);
1497+
ret = rds_cong_monitor_init();
14961498
if (ret)
14971499
goto out_stats;
1500+
ret = proto_register(&rds_proto, 1);
1501+
if (ret)
1502+
goto out_cong;
14981503
ret = sock_register(&rds_family_ops);
14991504
if (ret)
15001505
goto out_proto;
@@ -1512,6 +1517,8 @@ static int __init rds_init(void)
15121517

15131518
out_proto:
15141519
proto_unregister(&rds_proto);
1520+
out_cong:
1521+
rds_cong_exit();
15151522
out_stats:
15161523
rds_stats_exit();
15171524
out_sysctl:

net/rds/cong.c

Lines changed: 53 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,32 @@
7979
* finds that the saved generation number is smaller than the global generation
8080
* number, it wakes up the process.
8181
*/
82+
static atomic_t rds_cong_generation = ATOMIC_INIT(0);
83+
84+
/*
85+
* Congestion monitoring
86+
*/
87+
88+
struct rds_cong_monitor {
89+
/* global list of monitoring sockets */
90+
struct list_head rc_monitor;
91+
rwlock_t rc_monitor_lock;
92+
93+
/* kworker related */
94+
spinlock_t rc_notify_lock;
95+
u64 rc_notify_portmask;
96+
struct work_struct rc_notify_work;
97+
bool rc_notify_work_scheduled;
98+
};
99+
100+
static struct rds_cong_monitor *rds_cong_monitor;
82101

83102
static void rds_cong_notify_worker(struct work_struct *work)
84103
{
85104
u64 portmask;
86105
bool qwork = false;
87106
unsigned long flags;
88107
struct rds_sock *rs;
89-
struct rds_cong_monitor *rds_cong_monitor;
90-
91-
rds_cong_monitor = container_of(work, struct rds_cong_monitor,
92-
rc_notify_work);
93108

94109
/* take snapshot of portmask for processing */
95110
spin_lock_bh(&rds_cong_monitor->rc_notify_lock);
@@ -124,7 +139,7 @@ static void rds_cong_notify_worker(struct work_struct *work)
124139
queue_work(rds_wq, &rds_cong_monitor->rc_notify_work);
125140
}
126141

127-
static int rds_cong_monitor_init(struct rds_net *rns)
142+
int rds_cong_monitor_init(void)
128143
{
129144
struct rds_cong_monitor *rcm;
130145

@@ -137,18 +152,15 @@ static int rds_cong_monitor_init(struct rds_net *rns)
137152

138153
spin_lock_init(&rcm->rc_notify_lock);
139154
INIT_WORK(&rcm->rc_notify_work, rds_cong_notify_worker);
140-
rcm->rc_rns = rns;
141-
rns->rns_cong_monitor = rcm;
155+
rds_cong_monitor = rcm;
142156

143157
return 0;
144158
}
145159

146-
static void rds_cong_monitor_free(struct rds_net *rns)
160+
void rds_cong_monitor_free(void)
147161
{
148-
struct rds_cong_monitor *rcm = rns->rns_cong_monitor;
149-
150-
cancel_work_sync(&rcm->rc_notify_work);
151-
kfree(rcm);
162+
cancel_work_sync(&rds_cong_monitor->rc_notify_work);
163+
kfree(rds_cong_monitor);
152164
}
153165

154166
/*
@@ -163,12 +175,13 @@ static void rds_cong_monitor_free(struct rds_net *rns)
163175
* Receive paths can mark ports congested from interrupt context so the
164176
* lock masks interrupts.
165177
*/
178+
static DEFINE_SPINLOCK(rds_cong_lock);
179+
static struct rb_root rds_cong_tree = RB_ROOT;
166180

167-
static struct rds_cong_map *rds_cong_tree_walk(struct rds_net *rns,
168-
struct in6_addr *addr,
181+
static struct rds_cong_map *rds_cong_tree_walk(struct in6_addr *addr,
169182
struct rds_cong_map *insert)
170183
{
171-
struct rb_node **p = &rns->rns_cong_tree.rb_node;
184+
struct rb_node **p = &rds_cong_tree.rb_node;
172185
struct rb_node *parent = NULL;
173186
struct rds_cong_map *map;
174187

@@ -188,7 +201,7 @@ static struct rds_cong_map *rds_cong_tree_walk(struct rds_net *rns,
188201

189202
if (insert) {
190203
rb_link_node(&insert->m_rb_node, parent, p);
191-
rb_insert_color(&insert->m_rb_node, &rns->rns_cong_tree);
204+
rb_insert_color(&insert->m_rb_node, &rds_cong_tree);
192205
}
193206
return NULL;
194207
}
@@ -198,8 +211,7 @@ static struct rds_cong_map *rds_cong_tree_walk(struct rds_net *rns,
198211
* these bitmaps in the process getting pointers to them. The bitmaps are only
199212
* ever freed as the module is removed after all connections have been freed.
200213
*/
201-
static struct rds_cong_map *rds_cong_from_addr(struct rds_net *rns,
202-
struct in6_addr *addr)
214+
static struct rds_cong_map *rds_cong_from_addr(struct in6_addr *addr)
203215
{
204216
struct rds_cong_map *map;
205217
struct rds_cong_map *ret = NULL;
@@ -210,7 +222,7 @@ static struct rds_cong_map *rds_cong_from_addr(struct rds_net *rns,
210222
map = kzalloc(sizeof(struct rds_cong_map), GFP_KERNEL);
211223
if (!map)
212224
return NULL;
213-
map->m_rns = rns;
225+
214226
map->m_addr = *addr;
215227
init_waitqueue_head(&map->m_waitq);
216228
INIT_LIST_HEAD(&map->m_conn_list);
@@ -222,9 +234,9 @@ static struct rds_cong_map *rds_cong_from_addr(struct rds_net *rns,
222234
map->m_page_addrs[i] = zp;
223235
}
224236

225-
spin_lock_irqsave(&rns->rns_cong_lock, flags);
226-
ret = rds_cong_tree_walk(rns, addr, map);
227-
spin_unlock_irqrestore(&rns->rns_cong_lock, flags);
237+
spin_lock_irqsave(&rds_cong_lock, flags);
238+
ret = rds_cong_tree_walk(addr, map);
239+
spin_unlock_irqrestore(&rds_cong_lock, flags);
228240

229241
if (!ret) {
230242
ret = map;
@@ -277,27 +289,27 @@ void rds_cong_add_conn(struct rds_connection *conn)
277289
unsigned long flags;
278290

279291
rdsdebug("conn %p now on map %p\n", conn, conn->c_lcong);
280-
spin_lock_irqsave(&conn->c_rns->rns_cong_lock, flags);
292+
spin_lock_irqsave(&rds_cong_lock, flags);
281293
list_add_tail(&conn->c_map_item, &conn->c_lcong->m_conn_list);
282-
spin_unlock_irqrestore(&conn->c_rns->rns_cong_lock, flags);
294+
spin_unlock_irqrestore(&rds_cong_lock, flags);
283295
}
284296

285297
void rds_cong_remove_conn(struct rds_connection *conn)
286298
{
287299
unsigned long flags;
288300

289301
rdsdebug("removing conn %p from map %p\n", conn, conn->c_lcong);
290-
spin_lock_irqsave(&conn->c_rns->rns_cong_lock, flags);
302+
spin_lock_irqsave(&rds_cong_lock, flags);
291303
list_del_init(&conn->c_map_item);
292-
spin_unlock_irqrestore(&conn->c_rns->rns_cong_lock, flags);
304+
spin_unlock_irqrestore(&rds_cong_lock, flags);
293305
}
294306

295307
int rds_cong_get_maps(struct rds_connection *conn)
296308
{
297309
int hash_inx;
298310

299-
conn->c_lcong = rds_cong_from_addr(conn->c_rns, &conn->c_laddr);
300-
conn->c_fcong = rds_cong_from_addr(conn->c_rns, &conn->c_faddr);
311+
conn->c_lcong = rds_cong_from_addr(&conn->c_laddr);
312+
conn->c_fcong = rds_cong_from_addr(&conn->c_faddr);
301313

302314
if (!(conn->c_lcong && conn->c_fcong))
303315
return -ENOMEM;
@@ -317,7 +329,7 @@ void rds_cong_queue_updates(struct rds_cong_map *map)
317329
struct rds_connection *conn;
318330
unsigned long flags;
319331

320-
spin_lock_irqsave(&map->m_rns->rns_cong_lock, flags);
332+
spin_lock_irqsave(&rds_cong_lock, flags);
321333

322334
list_for_each_entry(conn, &map->m_conn_list, c_map_item) {
323335
if (!test_and_set_bit(RCMQ_BITOFF_CONGU_PENDING,
@@ -327,21 +339,17 @@ void rds_cong_queue_updates(struct rds_cong_map *map)
327339
}
328340
}
329341

330-
spin_unlock_irqrestore(&map->m_rns->rns_cong_lock, flags);
342+
spin_unlock_irqrestore(&rds_cong_lock, flags);
331343
}
332344

333345
void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask)
334346
{
335347
bool qwork = false;
336-
struct rds_net *rns;
337-
struct rds_cong_monitor *rds_cong_monitor;
338348

339349
rdsdebug("waking map %p for %pI6c\n",
340350
map, &map->m_addr);
341-
rns = map->m_rns;
342-
rds_cong_monitor = rns->rns_cong_monitor;
343351
rds_stats_inc(s_cong_update_received);
344-
atomic_inc(&rns->rns_cong_generation);
352+
atomic_inc(&rds_cong_generation);
345353
if (waitqueue_active(&map->m_waitq))
346354
wake_up(&map->m_waitq);
347355
if (waitqueue_active(map->m_wait_queue_ptr))
@@ -364,13 +372,13 @@ void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask)
364372
}
365373
EXPORT_SYMBOL_GPL(rds_cong_map_updated);
366374

367-
int rds_cong_updated_since(struct rds_sock *rs)
375+
int rds_cong_updated_since(unsigned long *recent)
368376
{
369-
unsigned long gen = atomic_read(&rs->rs_rns->rns_cong_generation);
377+
unsigned long gen = atomic_read(&rds_cong_generation);
370378

371-
if (likely(rs->rs_cong_track == gen))
379+
if (likely(*recent == gen))
372380
return 0;
373-
rs->rs_cong_track = gen;
381+
*recent = gen;
374382
return 1;
375383
}
376384

@@ -423,8 +431,6 @@ static int rds_cong_test_bit(struct rds_cong_map *map, __be16 port)
423431
void rds_cong_add_socket(struct rds_sock *rs)
424432
{
425433
unsigned long flags;
426-
struct rds_cong_monitor *rds_cong_monitor =
427-
rs->rs_rns->rns_cong_monitor;
428434

429435
write_lock_irqsave(&rds_cong_monitor->rc_monitor_lock, flags);
430436
if (list_empty(&rs->rs_cong_list))
@@ -436,17 +442,15 @@ void rds_cong_remove_socket(struct rds_sock *rs)
436442
{
437443
unsigned long flags;
438444
struct rds_cong_map *map;
439-
struct rds_cong_monitor *rds_cong_monitor =
440-
rs->rs_rns->rns_cong_monitor;
441445

442446
write_lock_irqsave(&rds_cong_monitor->rc_monitor_lock, flags);
443447
list_del_init(&rs->rs_cong_list);
444448
write_unlock_irqrestore(&rds_cong_monitor->rc_monitor_lock, flags);
445449

446450
/* update congestion map for now-closed port */
447-
spin_lock_irqsave(&rs->rs_rns->rns_cong_lock, flags);
448-
map = rds_cong_tree_walk(rs->rs_rns, &rs->rs_bound_addr, NULL);
449-
spin_unlock_irqrestore(&rs->rs_rns->rns_cong_lock, flags);
451+
spin_lock_irqsave(&rds_cong_lock, flags);
452+
map = rds_cong_tree_walk(&rs->rs_bound_addr, NULL);
453+
spin_unlock_irqrestore(&rds_cong_lock, flags);
450454

451455
if (map && rds_cong_test_bit(map, rs->rs_bound_port)) {
452456
rds_cong_clear_bit(map, rs->rs_bound_port);
@@ -479,31 +483,20 @@ int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock,
479483
!rds_cong_test_bit(map, port));
480484
}
481485

482-
void rds_cong_net_exit(struct rds_net *rns)
486+
void rds_cong_exit(void)
483487
{
484488
struct rb_node *node;
485489
struct rds_cong_map *map;
486490
unsigned long i;
487491

488-
while ((node = rb_first(&rns->rns_cong_tree))) {
492+
while ((node = rb_first(&rds_cong_tree))) {
489493
map = rb_entry(node, struct rds_cong_map, m_rb_node);
490494
rdsdebug("freeing map %p\n", map);
491-
rb_erase(&map->m_rb_node, &rns->rns_cong_tree);
495+
rb_erase(&map->m_rb_node, &rds_cong_tree);
492496
for (i = 0; i < RDS_CONG_MAP_PAGES && map->m_page_addrs[i]; i++)
493497
free_page(map->m_page_addrs[i]);
494498
kfree(map);
495499
}
496-
rds_cong_monitor_free(rns);
497-
}
498-
499-
int rds_cong_net_init(struct rds_net *rns)
500-
{
501-
rns->rns_cong_generation = ((atomic_t) { (0) });
502-
rds_cong_monitor_init(rns);
503-
spin_lock_init(&rns->rns_cong_lock);
504-
rns->rns_cong_tree = RB_ROOT;
505-
506-
return 0;
507500
}
508501

509502
/*

net/rds/rds.h

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -114,27 +114,13 @@ enum {
114114

115115
#define RDS_CP_WQ_MAX_ACTIVE 4
116116

117-
struct rds_cong_monitor {
118-
/* global list of monitoring sockets */
119-
struct list_head rc_monitor;
120-
rwlock_t rc_monitor_lock;
121-
122-
/* kworker related */
123-
spinlock_t rc_notify_lock;
124-
u64 rc_notify_portmask;
125-
struct work_struct rc_notify_work;
126-
bool rc_notify_work_scheduled;
127-
struct rds_net *rc_rns;
128-
};
129-
130117
struct rds_cong_map {
131118
struct rb_node m_rb_node;
132119
struct in6_addr m_addr;
133120
wait_queue_head_t m_waitq;
134121
struct list_head m_conn_list;
135122
struct wait_queue_head *m_wait_queue_ptr;
136123
unsigned long m_page_addrs[RDS_CONG_MAP_PAGES];
137-
struct rds_net *m_rns;
138124
};
139125

140126
/*
@@ -272,10 +258,6 @@ struct rds_net {
272258
spinlock_t rns_conn_lock; /* protect connection */
273259
struct hlist_head *rns_conn_hash;
274260

275-
atomic_t rns_cong_generation;
276-
struct rds_cong_monitor *rns_cong_monitor;
277-
spinlock_t rns_cong_lock; /* protect congestion maps */
278-
struct rb_root rns_cong_tree;
279261
};
280262

281263
#define IS_CANONICAL(laddr, faddr) (htonl(laddr) < htonl(faddr))
@@ -1137,8 +1119,8 @@ int rds_bind_tbl_net_init(struct rds_net *rds_ns);
11371119
void rds_bind_tbl_net_exit(struct rds_net *rds_ns);
11381120

11391121
/* cong.c */
1140-
int rds_cong_net_init(struct rds_net *rds_ns);
1141-
void rds_cong_net_exit(struct rds_net *rds_ns);
1122+
int rds_cong_monitor_init(void);
1123+
void rds_cong_monitor_free(void);
11421124
int rds_cong_get_maps(struct rds_connection *conn);
11431125
void rds_cong_add_conn(struct rds_connection *conn);
11441126
void rds_cong_remove_conn(struct rds_connection *conn);
@@ -1147,9 +1129,10 @@ void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port);
11471129
int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock, struct rds_sock *rs);
11481130
void rds_cong_queue_updates(struct rds_cong_map *map);
11491131
void rds_cong_map_updated(struct rds_cong_map *map, uint64_t);
1150-
int rds_cong_updated_since(struct rds_sock *rs);
1132+
int rds_cong_updated_since(unsigned long *recent);
11511133
void rds_cong_add_socket(struct rds_sock *);
11521134
void rds_cong_remove_socket(struct rds_sock *);
1135+
void rds_cong_exit(void);
11531136
struct rds_message *rds_cong_update_alloc(struct rds_connection *conn);
11541137

11551138
/* conn.c */

0 commit comments

Comments
 (0)