aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ceph/messenger.h14
-rw-r--r--net/ceph/messenger.c31
2 files changed, 24 insertions, 21 deletions
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
index d21f2dba0731..40ae58e3e9db 100644
--- a/include/linux/ceph/messenger.h
+++ b/include/linux/ceph/messenger.h
@@ -285,19 +285,9 @@ extern void ceph_msg_data_add_bio(struct ceph_msg *msg, struct bio *bio,
285 285
286extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, 286extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
287 bool can_fail); 287 bool can_fail);
288extern void ceph_msg_kfree(struct ceph_msg *m);
289 288
290 289extern struct ceph_msg *ceph_msg_get(struct ceph_msg *msg);
291static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg) 290extern void ceph_msg_put(struct ceph_msg *msg);
292{
293 kref_get(&msg->kref);
294 return msg;
295}
296extern void ceph_msg_last_put(struct kref *kref);
297static inline void ceph_msg_put(struct ceph_msg *msg)
298{
299 kref_put(&msg->kref, ceph_msg_last_put);
300}
301 291
302extern void ceph_msg_dump(struct ceph_msg *msg); 292extern void ceph_msg_dump(struct ceph_msg *msg);
303 293
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 1948d592aa54..8bffa5b90fef 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -3269,24 +3269,21 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
3269/* 3269/*
3270 * Free a generically kmalloc'd message. 3270 * Free a generically kmalloc'd message.
3271 */ 3271 */
3272void ceph_msg_kfree(struct ceph_msg *m) 3272static void ceph_msg_free(struct ceph_msg *m)
3273{ 3273{
3274 dout("msg_kfree %p\n", m); 3274 dout("%s %p\n", __func__, m);
3275 ceph_kvfree(m->front.iov_base); 3275 ceph_kvfree(m->front.iov_base);
3276 kmem_cache_free(ceph_msg_cache, m); 3276 kmem_cache_free(ceph_msg_cache, m);
3277} 3277}
3278 3278
3279/* 3279static void ceph_msg_release(struct kref *kref)
3280 * Drop a msg ref. Destroy as needed.
3281 */
3282void ceph_msg_last_put(struct kref *kref)
3283{ 3280{
3284 struct ceph_msg *m = container_of(kref, struct ceph_msg, kref); 3281 struct ceph_msg *m = container_of(kref, struct ceph_msg, kref);
3285 LIST_HEAD(data); 3282 LIST_HEAD(data);
3286 struct list_head *links; 3283 struct list_head *links;
3287 struct list_head *next; 3284 struct list_head *next;
3288 3285
3289 dout("ceph_msg_put last one on %p\n", m); 3286 dout("%s %p\n", __func__, m);
3290 WARN_ON(!list_empty(&m->list_head)); 3287 WARN_ON(!list_empty(&m->list_head));
3291 3288
3292 /* drop middle, data, if any */ 3289 /* drop middle, data, if any */
@@ -3308,9 +3305,25 @@ void ceph_msg_last_put(struct kref *kref)
3308 if (m->pool) 3305 if (m->pool)
3309 ceph_msgpool_put(m->pool, m); 3306 ceph_msgpool_put(m->pool, m);
3310 else 3307 else
3311 ceph_msg_kfree(m); 3308 ceph_msg_free(m);
3309}
3310
3311struct ceph_msg *ceph_msg_get(struct ceph_msg *msg)
3312{
3313 dout("%s %p (was %d)\n", __func__, msg,
3314 atomic_read(&msg->kref.refcount));
3315 kref_get(&msg->kref);
3316 return msg;
3317}
3318EXPORT_SYMBOL(ceph_msg_get);
3319
3320void ceph_msg_put(struct ceph_msg *msg)
3321{
3322 dout("%s %p (was %d)\n", __func__, msg,
3323 atomic_read(&msg->kref.refcount));
3324 kref_put(&msg->kref, ceph_msg_release);
3312} 3325}
3313EXPORT_SYMBOL(ceph_msg_last_put); 3326EXPORT_SYMBOL(ceph_msg_put);
3314 3327
3315void ceph_msg_dump(struct ceph_msg *msg) 3328void ceph_msg_dump(struct ceph_msg *msg)
3316{ 3329{