mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	cachefiles: narrow the scope of triggering EPOLLIN events in ondemand mode
Don't trigger EPOLLIN when there are only reopening read requests in xarray. Suggested-by: Xin Yin <yinxin.x@bytedance.com> Signed-off-by: Jia Zhu <zhujia.zj@bytedance.com> Link: https://lore.kernel.org/r/20231120041422.75170-5-zhujia.zj@bytedance.com Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com> Reviewed-by: David Howells <dhowells@redhat.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
		
							parent
							
								
									0a7e54c195
								
							
						
					
					
						commit
						b817e22b2e
					
				
					 2 changed files with 24 additions and 2 deletions
				
			
		|  | @ -355,14 +355,24 @@ static __poll_t cachefiles_daemon_poll(struct file *file, | ||||||
| 					   struct poll_table_struct *poll) | 					   struct poll_table_struct *poll) | ||||||
| { | { | ||||||
| 	struct cachefiles_cache *cache = file->private_data; | 	struct cachefiles_cache *cache = file->private_data; | ||||||
|  | 	XA_STATE(xas, &cache->reqs, 0); | ||||||
|  | 	struct cachefiles_req *req; | ||||||
| 	__poll_t mask; | 	__poll_t mask; | ||||||
| 
 | 
 | ||||||
| 	poll_wait(file, &cache->daemon_pollwq, poll); | 	poll_wait(file, &cache->daemon_pollwq, poll); | ||||||
| 	mask = 0; | 	mask = 0; | ||||||
| 
 | 
 | ||||||
| 	if (cachefiles_in_ondemand_mode(cache)) { | 	if (cachefiles_in_ondemand_mode(cache)) { | ||||||
| 		if (!xa_empty(&cache->reqs)) | 		if (!xa_empty(&cache->reqs)) { | ||||||
| 			mask |= EPOLLIN; | 			rcu_read_lock(); | ||||||
|  | 			xas_for_each_marked(&xas, req, ULONG_MAX, CACHEFILES_REQ_NEW) { | ||||||
|  | 				if (!cachefiles_ondemand_is_reopening_read(req)) { | ||||||
|  | 					mask |= EPOLLIN; | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			rcu_read_unlock(); | ||||||
|  | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		if (test_bit(CACHEFILES_STATE_CHANGED, &cache->flags)) | 		if (test_bit(CACHEFILES_STATE_CHANGED, &cache->flags)) | ||||||
| 			mask |= EPOLLIN; | 			mask |= EPOLLIN; | ||||||
|  |  | ||||||
|  | @ -329,6 +329,13 @@ cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \ | ||||||
| CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN); | CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN); | ||||||
| CACHEFILES_OBJECT_STATE_FUNCS(close, CLOSE); | CACHEFILES_OBJECT_STATE_FUNCS(close, CLOSE); | ||||||
| CACHEFILES_OBJECT_STATE_FUNCS(reopening, REOPENING); | CACHEFILES_OBJECT_STATE_FUNCS(reopening, REOPENING); | ||||||
|  | 
 | ||||||
|  | static inline bool cachefiles_ondemand_is_reopening_read(struct cachefiles_req *req) | ||||||
|  | { | ||||||
|  | 	return cachefiles_ondemand_object_is_reopening(req->object) && | ||||||
|  | 			req->msg.opcode == CACHEFILES_OP_READ; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #else | #else | ||||||
| static inline ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache, | static inline ssize_t cachefiles_ondemand_daemon_read(struct cachefiles_cache *cache, | ||||||
| 					char __user *_buffer, size_t buflen) | 					char __user *_buffer, size_t buflen) | ||||||
|  | @ -359,6 +366,11 @@ static inline int cachefiles_ondemand_init_obj_info(struct cachefiles_object *ob | ||||||
| static inline void cachefiles_ondemand_deinit_obj_info(struct cachefiles_object *obj) | static inline void cachefiles_ondemand_deinit_obj_info(struct cachefiles_object *obj) | ||||||
| { | { | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static inline bool cachefiles_ondemand_is_reopening_read(struct cachefiles_req *req) | ||||||
|  | { | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jia Zhu
						Jia Zhu