[Pvfs2-developers] Patches: (1) fixing incorrect small
I/O total_size, (2) processing multiple aiocbs at a time
Rob Ross
rross at mcs.anl.gov
Thu May 18 19:10:59 EDT 2006
good catch on the aiocb stuff avery; that one has been in there for
years i would guess.
rob
Avery Ching wrote:
> On Thu, 2006-05-18 at 17:26 -0500, Robert Latham wrote:
>> Thanks for the patches. tracking down these bugs can be a big pain.
>> good job, man. just a few questions.
>>
>> On Thu, May 18, 2006 at 03:44:28PM -0600, Avery Ching wrote:
>>> small_io_total_bytes_fix.patch:
>>>
>>> Fixed an issue with the small I/O total size being passed to the
>>> trove_bstream_write_list(). The uint32_t was being casted to
>>> (TROVE_size *)&s_op->req->u.small_io.total_bytes on line 162 of
>>> small_io.sm.
>> If you are going to change the type of 'total_bytes', don't forget
>> you'll have to change the encode_PVFS_servreq_small_io and
>> decode_PVFS_servreq_small_io macros, too.
>>
>
> You're right that this might affect other stuff. I think I guess the
> encode and decode functions will need to be changed. Okay, fixed. I've
> attached another patch that does this and changes it to PVFS_size. I
> think that's it hopefully...
>
>>> process_multiple_aiocbs.patch:
>>>
>>> Fixed the dbpf_bstream_listio_convert() function to actually handle more
>>> than a single aiocb at a time. This should boost noncontiguous I/O
>>> performance quite a bit.
>> Can you help me understand why your changes work? What is making the
>> existing code return too early? I'm not saying you did it wrong, of
>> course. it's just code i don't know very well.
>>
>
> In most cases (actually all that I know of) mem_count = 1. This means
> that when it passes through the while loop it breaks out even if it
> isn't finished since it is oom. Therefore it was only doing a single
> aiocb at a time. By changing the break conditional and updating the
> cur_mem_size and cur_stream_size, we can see where we really need to
> break out of the while loop (when it is oos or oom AND there are no
> bytes left in the current piece). Hope that helps!
>
>> ==rob
>>
>>
>> ------------------------------------------------------------------------
>>
>> ? module.mk
>> Index: pvfs2-req-proto.h
>> ===================================================================
>> RCS file: /anoncvs/pvfs2/src/proto/pvfs2-req-proto.h,v
>> retrieving revision 1.138
>> diff -u -r1.138 pvfs2-req-proto.h
>> --- pvfs2-req-proto.h 24 Jan 2006 21:33:24 -0000 1.138
>> +++ pvfs2-req-proto.h 18 May 2006 23:03:38 -0000
>> @@ -953,7 +953,7 @@
>> PVFS_offset offsets[SMALL_IO_MAX_SEGMENTS];
>> PVFS_size sizes[SMALL_IO_MAX_SEGMENTS];
>>
>> - uint32_t total_bytes;
>> + PVFS_size total_bytes; /* changed from int32_t */
>> void * buffer;
>> };
>>
>> @@ -968,7 +968,7 @@
>> encode_PINT_Request(pptr, &(x)->file_req); \
>> encode_PVFS_offset(pptr, &(x)->file_req_offset); \
>> encode_PVFS_size(pptr, &(x)->aggregate_size); \
>> - encode_uint32_t(pptr, &(x)->total_bytes); \
>> + encode_PVFS_size(pptr, &(x)->total_bytes); \
>> encode_skip4(pptr,); \
>> if ((x)->io_type == PVFS_IO_WRITE) \
>> { \
>> @@ -994,7 +994,7 @@
>> PINT_request_decode((x)->file_req); /* unpacks the pointers */ \
>> decode_PVFS_offset(pptr, &(x)->file_req_offset); \
>> decode_PVFS_size(pptr, &(x)->aggregate_size); \
>> - decode_uint32_t(pptr, &(x)->total_bytes); \
>> + decode_PVFS_size(pptr, &(x)->total_bytes); \
>> decode_skip4(pptr,); \
>> if ((x)->io_type == PVFS_IO_WRITE) \
>> { \
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Pvfs2-developers mailing list
>> Pvfs2-developers at beowulf-underground.org
>> http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers
More information about the Pvfs2-developers
mailing list