rhashtable: use cond_resched()
If a hash table has 128 slots and 16384 elems, expand to 256 slots takes more than one second. For larger sets, a soft lockup is detected. Holding cpu for that long, even in a work queue is a show stopper for non preemptable kernels. cond_resched() at strategic points to allow process scheduler to reschedule us. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								061c1a6e36
							
						
					
				
			
			
				commit
				
					
						5beb5c90c1
					
				
			
		
					 1 changed files with 4 additions and 0 deletions
				
			
		|  | @ -17,6 +17,7 @@ | ||||||
| #include <linux/kernel.h> | #include <linux/kernel.h> | ||||||
| #include <linux/init.h> | #include <linux/init.h> | ||||||
| #include <linux/log2.h> | #include <linux/log2.h> | ||||||
|  | #include <linux/sched.h> | ||||||
| #include <linux/slab.h> | #include <linux/slab.h> | ||||||
| #include <linux/vmalloc.h> | #include <linux/vmalloc.h> | ||||||
| #include <linux/mm.h> | #include <linux/mm.h> | ||||||
|  | @ -412,6 +413,7 @@ int rhashtable_expand(struct rhashtable *ht) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		unlock_buckets(new_tbl, old_tbl, new_hash); | 		unlock_buckets(new_tbl, old_tbl, new_hash); | ||||||
|  | 		cond_resched(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Unzip interleaved hash chains */ | 	/* Unzip interleaved hash chains */ | ||||||
|  | @ -435,6 +437,7 @@ int rhashtable_expand(struct rhashtable *ht) | ||||||
| 				complete = false; | 				complete = false; | ||||||
| 
 | 
 | ||||||
| 			unlock_buckets(new_tbl, old_tbl, old_hash); | 			unlock_buckets(new_tbl, old_tbl, old_hash); | ||||||
|  | 			cond_resched(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -493,6 +496,7 @@ int rhashtable_shrink(struct rhashtable *ht) | ||||||
| 				   tbl->buckets[new_hash + new_tbl->size]); | 				   tbl->buckets[new_hash + new_tbl->size]); | ||||||
| 
 | 
 | ||||||
| 		unlock_buckets(new_tbl, tbl, new_hash); | 		unlock_buckets(new_tbl, tbl, new_hash); | ||||||
|  | 		cond_resched(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Publish the new, valid hash table */ | 	/* Publish the new, valid hash table */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Dumazet
				Eric Dumazet