diff options
Diffstat (limited to 'net/rds')
-rw-r--r-- | net/rds/ib_send.c | 25 | ||||
-rw-r--r-- | net/rds/rdma.c | 10 | ||||
-rw-r--r-- | net/rds/rds.h | 1 | ||||
-rw-r--r-- | net/rds/send.c | 4 |
4 files changed, 29 insertions, 11 deletions
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 19eca5c4c00c..5e72de10c484 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
@@ -69,16 +69,6 @@ static void rds_ib_send_complete(struct rds_message *rm, | |||
69 | complete(rm, notify_status); | 69 | complete(rm, notify_status); |
70 | } | 70 | } |
71 | 71 | ||
72 | static void rds_ib_send_unmap_data(struct rds_ib_connection *ic, | ||
73 | struct rm_data_op *op, | ||
74 | int wc_status) | ||
75 | { | ||
76 | if (op->op_nents) | ||
77 | ib_dma_unmap_sg(ic->i_cm_id->device, | ||
78 | op->op_sg, op->op_nents, | ||
79 | DMA_TO_DEVICE); | ||
80 | } | ||
81 | |||
82 | static void rds_ib_send_unmap_rdma(struct rds_ib_connection *ic, | 72 | static void rds_ib_send_unmap_rdma(struct rds_ib_connection *ic, |
83 | struct rm_rdma_op *op, | 73 | struct rm_rdma_op *op, |
84 | int wc_status) | 74 | int wc_status) |
@@ -139,6 +129,21 @@ static void rds_ib_send_unmap_atomic(struct rds_ib_connection *ic, | |||
139 | rds_ib_stats_inc(s_ib_atomic_fadd); | 129 | rds_ib_stats_inc(s_ib_atomic_fadd); |
140 | } | 130 | } |
141 | 131 | ||
132 | static void rds_ib_send_unmap_data(struct rds_ib_connection *ic, | ||
133 | struct rm_data_op *op, | ||
134 | int wc_status) | ||
135 | { | ||
136 | struct rds_message *rm = container_of(op, struct rds_message, data); | ||
137 | |||
138 | if (op->op_nents) | ||
139 | ib_dma_unmap_sg(ic->i_cm_id->device, | ||
140 | op->op_sg, op->op_nents, | ||
141 | DMA_TO_DEVICE); | ||
142 | |||
143 | if (rm->rdma.op_active && rm->data.op_notify) | ||
144 | rds_ib_send_unmap_rdma(ic, &rm->rdma, wc_status); | ||
145 | } | ||
146 | |||
142 | /* | 147 | /* |
143 | * Unmap the resources associated with a struct send_work. | 148 | * Unmap the resources associated with a struct send_work. |
144 | * | 149 | * |
diff --git a/net/rds/rdma.c b/net/rds/rdma.c index 4297f3f337d7..138aef644c56 100644 --- a/net/rds/rdma.c +++ b/net/rds/rdma.c | |||
@@ -627,6 +627,16 @@ int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, | |||
627 | } | 627 | } |
628 | op->op_notifier->n_user_token = args->user_token; | 628 | op->op_notifier->n_user_token = args->user_token; |
629 | op->op_notifier->n_status = RDS_RDMA_SUCCESS; | 629 | op->op_notifier->n_status = RDS_RDMA_SUCCESS; |
630 | |||
631 | /* Enable rmda notification on data operation for composite | ||
632 | * rds messages and make sure notification is enabled only | ||
633 | * for the data operation which follows it so that application | ||
634 | * gets notified only after full message gets delivered. | ||
635 | */ | ||
636 | if (rm->data.op_sg) { | ||
637 | rm->rdma.op_notify = 0; | ||
638 | rm->data.op_notify = !!(args->flags & RDS_RDMA_NOTIFY_ME); | ||
639 | } | ||
630 | } | 640 | } |
631 | 641 | ||
632 | /* The cookie contains the R_Key of the remote memory region, and | 642 | /* The cookie contains the R_Key of the remote memory region, and |
diff --git a/net/rds/rds.h b/net/rds/rds.h index ebbf909b87ec..0bb8213c7d0b 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h | |||
@@ -419,6 +419,7 @@ struct rds_message { | |||
419 | } rdma; | 419 | } rdma; |
420 | struct rm_data_op { | 420 | struct rm_data_op { |
421 | unsigned int op_active:1; | 421 | unsigned int op_active:1; |
422 | unsigned int op_notify:1; | ||
422 | unsigned int op_nents; | 423 | unsigned int op_nents; |
423 | unsigned int op_count; | 424 | unsigned int op_count; |
424 | unsigned int op_dmasg; | 425 | unsigned int op_dmasg; |
diff --git a/net/rds/send.c b/net/rds/send.c index 0a6f38b1c8a5..45e025b65d29 100644 --- a/net/rds/send.c +++ b/net/rds/send.c | |||
@@ -476,12 +476,14 @@ void rds_rdma_send_complete(struct rds_message *rm, int status) | |||
476 | struct rm_rdma_op *ro; | 476 | struct rm_rdma_op *ro; |
477 | struct rds_notifier *notifier; | 477 | struct rds_notifier *notifier; |
478 | unsigned long flags; | 478 | unsigned long flags; |
479 | unsigned int notify = 0; | ||
479 | 480 | ||
480 | spin_lock_irqsave(&rm->m_rs_lock, flags); | 481 | spin_lock_irqsave(&rm->m_rs_lock, flags); |
481 | 482 | ||
483 | notify = rm->rdma.op_notify | rm->data.op_notify; | ||
482 | ro = &rm->rdma; | 484 | ro = &rm->rdma; |
483 | if (test_bit(RDS_MSG_ON_SOCK, &rm->m_flags) && | 485 | if (test_bit(RDS_MSG_ON_SOCK, &rm->m_flags) && |
484 | ro->op_active && ro->op_notify && ro->op_notifier) { | 486 | ro->op_active && notify && ro->op_notifier) { |
485 | notifier = ro->op_notifier; | 487 | notifier = ro->op_notifier; |
486 | rs = rm->m_rs; | 488 | rs = rm->m_rs; |
487 | sock_hold(rds_rs_to_sk(rs)); | 489 | sock_hold(rds_rs_to_sk(rs)); |