forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/net/rds/message.c
....@@ -1,5 +1,5 @@
11 /*
2
- * Copyright (c) 2006 Oracle. All rights reserved.
2
+ * Copyright (c) 2006, 2020 Oracle and/or its affiliates.
33 *
44 * This software is available to you under a choice of one of two
55 * licenses. You may choose to be licensed under the terms of the GNU
....@@ -162,12 +162,12 @@
162162 if (rm->rdma.op_active)
163163 rds_rdma_free_op(&rm->rdma);
164164 if (rm->rdma.op_rdma_mr)
165
- rds_mr_put(rm->rdma.op_rdma_mr);
165
+ kref_put(&rm->rdma.op_rdma_mr->r_kref, __rds_put_mr_final);
166166
167167 if (rm->atomic.op_active)
168168 rds_atomic_free_op(&rm->atomic);
169169 if (rm->atomic.op_rdma_mr)
170
- rds_mr_put(rm->atomic.op_rdma_mr);
170
+ kref_put(&rm->atomic.op_rdma_mr->r_kref, __rds_put_mr_final);
171171 }
172172
173173 void rds_message_put(struct rds_message *rm)
....@@ -313,11 +313,16 @@
313313 struct scatterlist *sg_first = (struct scatterlist *) &rm[1];
314314 struct scatterlist *sg_ret;
315315
316
- WARN_ON(rm->m_used_sgs + nents > rm->m_total_sgs);
317
- WARN_ON(!nents);
316
+ if (nents <= 0) {
317
+ pr_warn("rds: alloc sgs failed! nents <= 0\n");
318
+ return ERR_PTR(-EINVAL);
319
+ }
318320
319
- if (rm->m_used_sgs + nents > rm->m_total_sgs)
320
- return NULL;
321
+ if (rm->m_used_sgs + nents > rm->m_total_sgs) {
322
+ pr_warn("rds: alloc sgs failed! total %d used %d nents %d\n",
323
+ rm->m_total_sgs, rm->m_used_sgs, nents);
324
+ return ERR_PTR(-ENOMEM);
325
+ }
321326
322327 sg_ret = &sg_first[rm->m_used_sgs];
323328 sg_init_table(sg_ret, nents);
....@@ -330,7 +335,7 @@
330335 {
331336 struct rds_message *rm;
332337 unsigned int i;
333
- int num_sgs = ceil(total_len, PAGE_SIZE);
338
+ int num_sgs = DIV_ROUND_UP(total_len, PAGE_SIZE);
334339 int extra_bytes = num_sgs * sizeof(struct scatterlist);
335340
336341 rm = rds_message_alloc(extra_bytes, GFP_NOWAIT);
....@@ -339,11 +344,12 @@
339344
340345 set_bit(RDS_MSG_PAGEVEC, &rm->m_flags);
341346 rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len);
342
- rm->data.op_nents = ceil(total_len, PAGE_SIZE);
347
+ rm->data.op_nents = DIV_ROUND_UP(total_len, PAGE_SIZE);
343348 rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);
344
- if (!rm->data.op_sg) {
349
+ if (IS_ERR(rm->data.op_sg)) {
350
+ void *err = ERR_CAST(rm->data.op_sg);
345351 rds_message_put(rm);
346
- return ERR_PTR(-ENOMEM);
352
+ return err;
347353 }
348354
349355 for (i = 0; i < rm->data.op_nents; ++i) {