Lines Matching defs:rm

47 void rds_message_addref(struct rds_message *rm)
49 rdsdebug("addref rm %p ref %d\n", rm, atomic_read(&rm->m_refcount));
50 atomic_inc(&rm->m_refcount);
57 static void rds_message_purge(struct rds_message *rm)
61 if (unlikely(test_bit(RDS_MSG_PAGEVEC, &rm->m_flags)))
64 for (i = 0; i < rm->data.op_nents; i++) {
65 rdsdebug("putting data page %p\n", (void *)sg_page(&rm->data.op_sg[i]));
67 __free_page(sg_page(&rm->data.op_sg[i]));
69 rm->data.op_nents = 0;
71 if (rm->rdma.op_active)
72 rds_rdma_free_op(&rm->rdma);
73 if (rm->rdma.op_rdma_mr)
74 rds_mr_put(rm->rdma.op_rdma_mr);
76 if (rm->atomic.op_active)
77 rds_atomic_free_op(&rm->atomic);
78 if (rm->atomic.op_rdma_mr)
79 rds_mr_put(rm->atomic.op_rdma_mr);
82 void rds_message_put(struct rds_message *rm)
84 rdsdebug("put rm %p ref %d\n", rm, atomic_read(&rm->m_refcount));
85 WARN(!atomic_read(&rm->m_refcount), "danger refcount zero on %p\n", rm);
86 if (atomic_dec_and_test(&rm->m_refcount)) {
87 BUG_ON(!list_empty(&rm->m_sock_item));
88 BUG_ON(!list_empty(&rm->m_conn_item));
89 rds_message_purge(rm);
91 kfree(rm);
195 struct rds_message *rm;
200 rm = kzalloc(sizeof(struct rds_message) + extra_len, gfp);
201 if (!rm)
204 rm->m_used_sgs = 0;
205 rm->m_total_sgs = extra_len / sizeof(struct scatterlist);
207 atomic_set(&rm->m_refcount, 1);
208 INIT_LIST_HEAD(&rm->m_sock_item);
209 INIT_LIST_HEAD(&rm->m_conn_item);
210 spin_lock_init(&rm->m_rs_lock);
211 init_waitqueue_head(&rm->m_flush_wait);
214 return rm;
218 * RDS ops use this to grab SG entries from the rm's sg pool.
220 struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents)
222 struct scatterlist *sg_first = (struct scatterlist *) &rm[1];
225 WARN_ON(rm->m_used_sgs + nents > rm->m_total_sgs);
228 if (rm->m_used_sgs + nents > rm->m_total_sgs)
231 sg_ret = &sg_first[rm->m_used_sgs];
233 rm->m_used_sgs += nents;
240 struct rds_message *rm;
245 rm = rds_message_alloc(extra_bytes, GFP_NOWAIT);
246 if (!rm)
249 set_bit(RDS_MSG_PAGEVEC, &rm->m_flags);
250 rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len);
251 rm->data.op_nents = ceil(total_len, PAGE_SIZE);
252 rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);
253 if (!rm->data.op_sg) {
254 rds_message_put(rm);
258 for (i = 0; i < rm->data.op_nents; ++i) {
259 sg_set_page(&rm->data.op_sg[i],
264 return rm;
267 int rds_message_copy_from_user(struct rds_message *rm, struct iovec *first_iov,
277 rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len);
282 sg = rm->data.op_sg;
293 rm->data.op_nents++;
331 struct rds_message *rm;
341 rm = container_of(inc, struct rds_message, m_inc);
342 len = be32_to_cpu(rm->m_inc.i_hdr.h_len);
346 sg = rm->data.op_sg;
390 void rds_message_wait(struct rds_message *rm)
392 wait_event_interruptible(rm->m_flush_wait,
393 !test_bit(RDS_MSG_MAPPED, &rm->m_flags));
396 void rds_message_unmapped(struct rds_message *rm)
398 clear_bit(RDS_MSG_MAPPED, &rm->m_flags);
399 wake_up_interruptible(&rm->m_flush_wait);