[PATCH v2] makedumpfile: code cleanup: set_bitmap
Wang Nan
wangnan0 at huawei.com
Fri Apr 25 21:31:37 PDT 2014
On 2014/4/25 16:03, Petr Tesarik wrote:
> On Fri, 25 Apr 2014 13:25:23 +0800
> Wang Nan <wangnan0 at huawei.com> wrote:
>
>> On 2014/4/24 17:28, Petr Tesarik wrote:
>>> On Thu, 24 Apr 2014 17:11:13 +0800
>>> Wang Nan <wangnan0 at huawei.com> wrote:
>> [...]
>>>> set_bitmap(struct dump_bitmap *bitmap, unsigned long long pfn,
>>>> int val)
>>>> {
>>>> @@ -3317,20 +3345,11 @@ set_bitmap(struct dump_bitmap *bitmap, unsigned long long pfn,
>>>> old_offset = bitmap->offset + BUFSIZE_BITMAP * bitmap->no_block;
>>>> new_offset = bitmap->offset + BUFSIZE_BITMAP * (pfn / PFN_BUFBITMAP);
>>>
>>> After applying this patch, both old_offset and new_offset are
>>> calculated only to compare for equality. And new_offset is in fact
>>> computed twice (once in set_bitmap and once in sync_bitmap).
>>>
>>> This could be cleaned up by replacing the offsets with:
>>>
>>> int new_no_block = pfn / PFN_BUFBITMAP;
>>>
>>> Then change all occurrences of if (old_offset != new_offset) to:
>>>
>>> if (bitmap->no_block != new_no_block)
>>>
>>> and finally re-use new_no_block in the assignment to bitmap->no_block
>>> near the end of the function, like this:
>>>
>>> - bitmap->no_block = pfn / PFN_BUFBITMAP;
>>> + bitmap->no_block = new_no_block;
>>>
>>> Petr T
>>>
>>>>
>>>> - if (0 <= bitmap->no_block && old_offset != new_offset) {
>>>> - if (lseek(bitmap->fd, old_offset, SEEK_SET) < 0 ) {
>>>> - ERRMSG("Can't seek the bitmap(%s). %s\n",
>>>> - bitmap->file_name, strerror(errno));
>>>> - return FALSE;
>>>> - }
>>>> - if (write(bitmap->fd, bitmap->buf, BUFSIZE_BITMAP)
>>>> - != BUFSIZE_BITMAP) {
>>>> - ERRMSG("Can't write the bitmap(%s). %s\n",
>>>> - bitmap->file_name, strerror(errno));
>>>> + if (old_offset != new_offset) {
>>>> + if (!sync_bitmap(bitmap)) {
>>>> + ERRMSG("Can't sync bitmap\n");
>>>> return FALSE;
>>>> }
>>>> - }
>>>> - if (old_offset != new_offset) {
>>>> if (lseek(bitmap->fd, new_offset, SEEK_SET) < 0 ) {
>>>> ERRMSG("Can't seek the bitmap(%s). %s\n",
>>>> bitmap->file_name, strerror(errno));
>> [ .. see below .. ]
>>
>> Good suggestion, but new_offset is still needed to be calculated for these lseeks.
>
> True, but it will be calculated only once (in sync_bitmap). OTOH the
> block number is always needed, because it is stored in bitmap->no_block.
>
> Okay, that can be changed, and you can store the offset instead. I
> don't have a strong opinion on this.
>
>> In addition, I have another idea: what about to replace all lseek .. read/write pattern to pread/pwrite?
>
> Definitely! After doing that, we could even reuse the same file descriptor
> for all processes.
>
I posted a series of patches for lseek. If Atsushi Kumagai accept them, I will
redo this patch on top of them.
> Now, since the original patch looks good as it is, let's see if Atsushi
> Kumagai takes it into the tree and post more clean up patches afterwards.
>
> Petr T
>
More information about the kexec
mailing list