Skip to content

Commit 04017e2

Browse files
Alex ElderSage Weil
Alex Elder
authored and
Sage Weil
committed
libceph: make method call data be a separate data item
Right now the data for a method call is specified via a pointer and length, and it's copied--along with the class and method name--into a pagelist data item to be sent to the osd. Instead, encode the data in a data item separate from the class and method names. This will allow large amounts of data to be supplied to methods without copying. Only rbd uses the class functionality right now, and when it really needs this it will probably need to use a page array rather than a page list. But this simple implementation demonstrates the functionality on the osd client, and that's enough for now. This resolves: http://tracker.ceph.com/issues/4104 Signed-off-by: Alex Elder <[email protected]> Reviewed-by: Josh Durgin <[email protected]>
1 parent 90af360 commit 04017e2

File tree

3 files changed

+62
-25
lines changed

3 files changed

+62
-25
lines changed

drivers/block/rbd.c

+13-2
Original file line numberDiff line numberDiff line change
@@ -1847,8 +1847,19 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
18471847
goto out;
18481848

18491849
osd_req_op_cls_init(obj_request->osd_req, 0, CEPH_OSD_OP_CALL,
1850-
class_name, method_name,
1851-
outbound, outbound_size);
1850+
class_name, method_name);
1851+
if (outbound_size) {
1852+
struct ceph_pagelist *pagelist;
1853+
1854+
pagelist = kmalloc(sizeof (*pagelist), GFP_NOFS);
1855+
if (!pagelist)
1856+
goto out;
1857+
1858+
ceph_pagelist_init(pagelist);
1859+
ceph_pagelist_append(pagelist, outbound, outbound_size);
1860+
osd_req_op_cls_request_data_pagelist(obj_request->osd_req, 0,
1861+
pagelist);
1862+
}
18521863
osd_req_op_cls_response_data_pages(obj_request->osd_req, 0,
18531864
obj_request->pages, inbound_size,
18541865
0, false, false);

include/linux/ceph/osd_client.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,9 @@ struct ceph_osd_req_op {
9292
struct {
9393
const char *class_name;
9494
const char *method_name;
95-
const void *request_data;
9695
struct ceph_osd_data request_info;
96+
struct ceph_osd_data request_data;
9797
struct ceph_osd_data response_data;
98-
u32 request_data_len;
9998
__u8 class_len;
10099
__u8 method_len;
101100
__u8 argc;
@@ -259,6 +258,9 @@ extern void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *,
259258
struct bio *bio, size_t bio_length);
260259
#endif /* CONFIG_BLOCK */
261260

261+
extern void osd_req_op_cls_request_data_pagelist(struct ceph_osd_request *,
262+
unsigned int which,
263+
struct ceph_pagelist *pagelist);
262264
extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
263265
unsigned int which,
264266
struct page **pages, u64 length,
@@ -267,9 +269,7 @@ extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
267269

268270
extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
269271
unsigned int which, u16 opcode,
270-
const char *class, const char *method,
271-
const void *request_data,
272-
size_t request_data_size);
272+
const char *class, const char *method);
273273
extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
274274
unsigned int which, u16 opcode,
275275
u64 cookie, u64 version, int flag);

net/ceph/osd_client.c

+44-18
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ osd_req_op_cls_request_info(struct ceph_osd_request *osd_req,
135135
}
136136
EXPORT_SYMBOL(osd_req_op_cls_request_info); /* ??? */
137137

138+
struct ceph_osd_data *
139+
osd_req_op_cls_request_data(struct ceph_osd_request *osd_req,
140+
unsigned int which)
141+
{
142+
BUG_ON(which >= osd_req->r_num_ops);
143+
144+
return &osd_req->r_ops[which].cls.request_data;
145+
}
146+
EXPORT_SYMBOL(osd_req_op_cls_request_data); /* ??? */
147+
138148
struct ceph_osd_data *
139149
osd_req_op_cls_response_data(struct ceph_osd_request *osd_req,
140150
unsigned int which)
@@ -192,6 +202,17 @@ static void osd_req_op_cls_request_info_pagelist(
192202
ceph_osd_data_pagelist_init(osd_data, pagelist);
193203
}
194204

205+
void osd_req_op_cls_request_data_pagelist(
206+
struct ceph_osd_request *osd_req,
207+
unsigned int which, struct ceph_pagelist *pagelist)
208+
{
209+
struct ceph_osd_data *osd_data;
210+
211+
osd_data = osd_req_op_cls_request_data(osd_req, which);
212+
ceph_osd_data_pagelist_init(osd_data, pagelist);
213+
}
214+
EXPORT_SYMBOL(osd_req_op_cls_request_data_pagelist);
215+
195216
void osd_req_op_cls_response_data_pages(struct ceph_osd_request *osd_req,
196217
unsigned int which, struct page **pages, u64 length,
197218
u32 alignment, bool pages_from_pool, bool own_pages)
@@ -251,6 +272,7 @@ static void osd_req_op_data_release(struct ceph_osd_request *osd_req,
251272
break;
252273
case CEPH_OSD_OP_CALL:
253274
ceph_osd_data_release(&op->cls.request_info);
275+
ceph_osd_data_release(&op->cls.request_data);
254276
ceph_osd_data_release(&op->cls.response_data);
255277
break;
256278
default:
@@ -492,8 +514,7 @@ void osd_req_op_extent_update(struct ceph_osd_request *osd_req,
492514
EXPORT_SYMBOL(osd_req_op_extent_update);
493515

494516
void osd_req_op_cls_init(struct ceph_osd_request *osd_req, unsigned int which,
495-
u16 opcode, const char *class, const char *method,
496-
const void *request_data, size_t request_data_size)
517+
u16 opcode, const char *class, const char *method)
497518
{
498519
struct ceph_osd_req_op *op = osd_req_op_init(osd_req, which, opcode);
499520
struct ceph_pagelist *pagelist;
@@ -520,12 +541,6 @@ void osd_req_op_cls_init(struct ceph_osd_request *osd_req, unsigned int which,
520541
ceph_pagelist_append(pagelist, method, size);
521542
payload_len += size;
522543

523-
op->cls.request_data = request_data;
524-
BUG_ON(request_data_size > (size_t) U32_MAX);
525-
op->cls.request_data_len = (u32) request_data_size;
526-
ceph_pagelist_append(pagelist, request_data, request_data_size);
527-
payload_len += request_data_size;
528-
529544
osd_req_op_cls_request_info_pagelist(osd_req, which, pagelist);
530545

531546
op->cls.argc = 0; /* currently unused */
@@ -576,7 +591,9 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
576591
struct ceph_osd_op *dst, unsigned int which)
577592
{
578593
struct ceph_osd_req_op *src;
594+
struct ceph_osd_data *osd_data;
579595
u64 request_data_len = 0;
596+
u64 data_length;
580597

581598
BUG_ON(which >= req->r_num_ops);
582599
src = &req->r_ops[which];
@@ -599,22 +616,31 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
599616
cpu_to_le64(src->extent.truncate_size);
600617
dst->extent.truncate_seq =
601618
cpu_to_le32(src->extent.truncate_seq);
619+
osd_data = &src->extent.osd_data;
602620
if (src->op == CEPH_OSD_OP_WRITE)
603-
ceph_osdc_msg_data_add(req->r_request,
604-
&src->extent.osd_data);
621+
ceph_osdc_msg_data_add(req->r_request, osd_data);
605622
else
606-
ceph_osdc_msg_data_add(req->r_reply,
607-
&src->extent.osd_data);
623+
ceph_osdc_msg_data_add(req->r_reply, osd_data);
608624
break;
609625
case CEPH_OSD_OP_CALL:
610626
dst->cls.class_len = src->cls.class_len;
611627
dst->cls.method_len = src->cls.method_len;
612-
dst->cls.indata_len = cpu_to_le32(src->cls.request_data_len);
613-
ceph_osdc_msg_data_add(req->r_reply, &src->cls.response_data);
614-
ceph_osdc_msg_data_add(req->r_request, &src->cls.request_info);
615-
BUG_ON(src->cls.request_info.type !=
616-
CEPH_OSD_DATA_TYPE_PAGELIST);
617-
request_data_len = src->cls.request_info.pagelist->length;
628+
osd_data = &src->cls.request_info;
629+
ceph_osdc_msg_data_add(req->r_request, osd_data);
630+
BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_PAGELIST);
631+
request_data_len = osd_data->pagelist->length;
632+
633+
osd_data = &src->cls.request_data;
634+
data_length = ceph_osd_data_length(osd_data);
635+
if (data_length) {
636+
BUG_ON(osd_data->type == CEPH_OSD_DATA_TYPE_NONE);
637+
dst->cls.indata_len = cpu_to_le32(data_length);
638+
ceph_osdc_msg_data_add(req->r_request, osd_data);
639+
src->payload_len += data_length;
640+
request_data_len += data_length;
641+
}
642+
osd_data = &src->cls.response_data;
643+
ceph_osdc_msg_data_add(req->r_reply, osd_data);
618644
break;
619645
case CEPH_OSD_OP_STARTSYNC:
620646
break;

0 commit comments

Comments
 (0)