ceph: use kref for ceph_msg
Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
		
							parent
							
								
									415e49a9c4
								
							
						
					
					
						commit
						c2e552e76e
					
				| @ -1958,7 +1958,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, | |||||||
| 	m = kmalloc(sizeof(*m), GFP_NOFS); | 	m = kmalloc(sizeof(*m), GFP_NOFS); | ||||||
| 	if (m == NULL) | 	if (m == NULL) | ||||||
| 		goto out; | 		goto out; | ||||||
| 	atomic_set(&m->nref, 1); | 	kref_init(&m->kref); | ||||||
| 	INIT_LIST_HEAD(&m->list_head); | 	INIT_LIST_HEAD(&m->list_head); | ||||||
| 
 | 
 | ||||||
| 	m->hdr.type = cpu_to_le16(type); | 	m->hdr.type = cpu_to_le16(type); | ||||||
| @ -2070,20 +2070,10 @@ void ceph_msg_kfree(struct ceph_msg *m) | |||||||
| /*
 | /*
 | ||||||
|  * Drop a msg ref.  Destroy as needed. |  * Drop a msg ref.  Destroy as needed. | ||||||
|  */ |  */ | ||||||
| void ceph_msg_put(struct ceph_msg *m) | void ceph_msg_last_put(struct kref *kref) | ||||||
| { | { | ||||||
| 	dout("ceph_msg_put %p %d -> %d\n", m, atomic_read(&m->nref), | 	struct ceph_msg *m = container_of(kref, struct ceph_msg, kref); | ||||||
| 	     atomic_read(&m->nref)-1); | 
 | ||||||
| 	if (atomic_read(&m->nref) <= 0) { |  | ||||||
| 		pr_err("bad ceph_msg_put on %p %llu %d=%s %d+%d\n", |  | ||||||
| 		       m, le64_to_cpu(m->hdr.seq), |  | ||||||
| 		       le16_to_cpu(m->hdr.type), |  | ||||||
| 		       ceph_msg_type_name(le16_to_cpu(m->hdr.type)), |  | ||||||
| 		       le32_to_cpu(m->hdr.front_len), |  | ||||||
| 		       le32_to_cpu(m->hdr.data_len)); |  | ||||||
| 		WARN_ON(1); |  | ||||||
| 	} |  | ||||||
| 	if (atomic_dec_and_test(&m->nref)) { |  | ||||||
| 	dout("ceph_msg_put last one on %p\n", m); | 	dout("ceph_msg_put last one on %p\n", m); | ||||||
| 	WARN_ON(!list_empty(&m->list_head)); | 	WARN_ON(!list_empty(&m->list_head)); | ||||||
| 
 | 
 | ||||||
| @ -2099,5 +2089,4 @@ void ceph_msg_put(struct ceph_msg *m) | |||||||
| 		ceph_msgpool_put(m->pool, m); | 		ceph_msgpool_put(m->pool, m); | ||||||
| 	else | 	else | ||||||
| 		ceph_msg_kfree(m); | 		ceph_msg_kfree(m); | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #ifndef __FS_CEPH_MESSENGER_H | #ifndef __FS_CEPH_MESSENGER_H | ||||||
| #define __FS_CEPH_MESSENGER_H | #define __FS_CEPH_MESSENGER_H | ||||||
| 
 | 
 | ||||||
|  | #include <linux/kref.h> | ||||||
| #include <linux/mutex.h> | #include <linux/mutex.h> | ||||||
| #include <linux/net.h> | #include <linux/net.h> | ||||||
| #include <linux/radix-tree.h> | #include <linux/radix-tree.h> | ||||||
| @ -85,7 +86,7 @@ struct ceph_msg { | |||||||
| 	struct page **pages;            /* data payload.  NOT OWNER. */ | 	struct page **pages;            /* data payload.  NOT OWNER. */ | ||||||
| 	unsigned nr_pages;              /* size of page array */ | 	unsigned nr_pages;              /* size of page array */ | ||||||
| 	struct list_head list_head; | 	struct list_head list_head; | ||||||
| 	atomic_t nref; | 	struct kref kref; | ||||||
| 	bool front_is_vmalloc; | 	bool front_is_vmalloc; | ||||||
| 	bool more_to_follow; | 	bool more_to_follow; | ||||||
| 	int front_max; | 	int front_max; | ||||||
| @ -243,11 +244,13 @@ extern int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg); | |||||||
| 
 | 
 | ||||||
| static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg) | static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg) | ||||||
| { | { | ||||||
| 	dout("ceph_msg_get %p %d -> %d\n", msg, atomic_read(&msg->nref), | 	kref_get(&msg->kref); | ||||||
| 	     atomic_read(&msg->nref)+1); |  | ||||||
| 	atomic_inc(&msg->nref); |  | ||||||
| 	return msg; | 	return msg; | ||||||
| } | } | ||||||
| extern void ceph_msg_put(struct ceph_msg *msg); | extern void ceph_msg_last_put(struct kref *kref); | ||||||
|  | static inline void ceph_msg_put(struct ceph_msg *msg) | ||||||
|  | { | ||||||
|  | 	kref_put(&msg->kref, ceph_msg_last_put); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -165,7 +165,7 @@ void ceph_msgpool_put(struct ceph_msgpool *pool, struct ceph_msg *msg) | |||||||
| { | { | ||||||
| 	spin_lock(&pool->lock); | 	spin_lock(&pool->lock); | ||||||
| 	if (pool->num < pool->min) { | 	if (pool->num < pool->min) { | ||||||
| 		ceph_msg_get(msg);   /* retake a single ref */ | 		kref_set(&msg->kref, 1);  /* retake a single ref */ | ||||||
| 		list_add(&msg->list_head, &pool->msgs); | 		list_add(&msg->list_head, &pool->msgs); | ||||||
| 		pool->num++; | 		pool->num++; | ||||||
| 		dout("msgpool_put %p reclaim %p, now %d/%d\n", pool, msg, | 		dout("msgpool_put %p reclaim %p, now %d/%d\n", pool, msg, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user