[CRIU] Re: [PATCH 8/8] protobuf: Convert IPC entries to PB format

Stanislav Kinsbursky skinsbursky at parallels.com
Wed Jul 18 06:36:46 EDT 2012


18.07.2012 14:30, Cyrill Gorcunov пишет:
> On Wed, Jul 18, 2012 at 02:16:55PM +0400, Stanislav Kinsbursky wrote:
>>>
>>> +#include "protobuf.h"
>>> +#include "protobuf/ipc-var.pb-c.h"
>>> +#include "protobuf/ipc-desc.pb-c.h"
>>
>> Does this include really required?IpcMsg msg = IPC_MSG__IN
>
> Yeah, the ipc-desc.pb-c.h is included implicilty in other headers,
> we can drop it.
>

So, please do. Excessive usage of headers make me scary and crying...

>>>
>>>   static int dump_ipc_var(int fd)
>>>   {
>>> -	int ret;
>>> -	struct ipc_var_entry var;
>>> +	IpcVarEntry var = IPC_VAR_ENTRY__INIT;
>>> +	int ret = -1;
>>> +
>>> +	var.n_sem_ctls	= 4;
>>> +	var.sem_ctls	= xmalloc(pb_repeated_size(&var, sem_ctls));
>>
>> Off-topic: is "pb_repeated_size" our helper or generic one?
>
> It's our helper from protobuf.h
>

Cool. Looks like Pavel didn't take it yet.

>>>   static void show_ipc_sem_entries(int fd)
>>>   {
>>> +	IpcSemEntry *entry;
>>> +	u16 *values;
>>> +
>>>   	pr_msg("\nSemaphores sets:\n");
>>>   	while (1) {
>>>   		int size;
>>> -		struct ipc_sem_entry entry;
>>> -		u16 *values;
>>>
>>> -		if (read_img_eof(fd, &entry) <= 0)
>>> -			return;
>>> -		pr_msg_ipc_sem_entry(&entry);
>>> -		size = sizeof(u16) * entry.nsems;
>>> +		entry = NULL;
>>
>> Looks like this assignment is redundant.
>
> yeah, a nit ;)
>
>>>   		if (read_img_buf(fd, values, round_up(size, sizeof(u64))) <= 0)
>>
>> Probably, "value" should be a repeated field in sem protobuf
>> description? Binary, for example.
>
> Could be, but Stas, initially I wanted to make as close map to original
> image.h structures as possible and make code change less intrusive.
> So if we wanna change it, lets do it on top then.
>

Ok. Just wanna to keep code solid.

>>
>>> -			return;
>>> -		pr_msg_ipc_sem_array(entry.nsems, values);
>>> +			break;
>>> +		pr_msg_ipc_sem_array(entry->nsems, values);
>>> +
>>> +		ipc_sem_entry__free_unpacked(entry, NULL);
>>> +		xfree(values);
>>>   	}
>>> +
>>> +	xfree(values);
>>> +	if (entry)
>>> +		ipc_sem_entry__free_unpacked(entry, NULL);
>>
>> Is this an optimization? I.e. allocating this entry only once and
>> releasing it at the end?
>
> Nope, it's allocated at every cycle and freed at the end of cycle.
> The latest
>
> 	if (entry)
> 		ipc_sem_entry__free_unpacked(entry, NULL);
>
> handles the case where xmalloc for array is failed but entry
> already read and allocated.
>

I see. Looks bad from my POW, but I have nothing else against.

>>> +		if (lseek(fd, round_up(shm->size, sizeof(u32)), SEEK_CUR) == (off_t) -1)
>>> +			ret = -1;
>>> +
>>> +		ipc_shm_entry__free_unpacked(shm, NULL);
>>
>>
>> Maybe we should use one way of managing PB unpacked entries? I.e.
>> either alloc and free only once per image or once per message.
>
> Well, it could be good optimization I think, but lets stick with
> simple first ;)
>
>>>
>>> -		if (msg.msize > MSGMAX) {
>>> +		if (msg->msize > MSGMAX) {
>>> +			ret = -1;
>>>   			pr_err("Unsupported message size: %d (MAX: %d)\n",
>>> -						msg.msize, MSGMAX);
>>> -			return ret;
>>> +						msg->msize, MSGMAX);
>>> +			goto out;
>>
>> "out" label is redundant. Break is enough. This gives us minus 1 line.
>
> yeah, thanks!
>
> 	Cyrill
>


-- 
Best regards,
Stanislav Kinsbursky





More information about the CRIU mailing list