[dpdk-dev] [PATCH v3 2/5] eal: don't process IPC messages before init finished
Wiles, Keith
keith.wiles at intel.com
Wed Feb 28 05:00:17 CET 2018
>
> + struct message_queue_entry *cur_msg, *next_msg, *new_msg = NULL;
> while (1) {
> - if (read_msg(&msg, &sa) == 0)
> - process_msg(&msg, &sa);
> + /* we want to process all messages in order of their arrival,
> + * but status of init_complete may change while we're iterating
> + * the tailq. so, store it here and check once every iteration.
> + */
> + int init_complete;
Do we allow variables to be defined in the middle of a block, I thought we only allowed them after a ‘{‘ or open block.
> +
> + if (new_msg == NULL)
> + new_msg = malloc(sizeof(*new_msg));
I am very concerned about allocating memory with no limit. If the process never completes then we could receive messages and consume a lot of memory. I would want to see a limit to the number of messages we can consume in the queue just to be sure.
> + if (read_msg(&new_msg->msg, &new_msg->sa) == 0) {
> + /* we successfully read the message, so enqueue it */
> + TAILQ_INSERT_TAIL(&message_queue, new_msg, next);
> + new_msg = NULL;
> + } /* reuse new_msg for next message if we couldn't read_msg */
> +
> + init_complete = internal_config.init_complete;
Does the internal_config.init_complete need to be a volatile to make sure it is reread each time thru the loop?
> +
> + /* tailq only accessed here, so no locking needed */
> + TAILQ_FOREACH_SAFE(cur_msg, &message_queue, next, next_msg) {
> + /* secondary process should not process any incoming
> + * requests until its initialization is complete, but
> + * it is allowed to process replies to its own queries.
> + */
> + if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
> + !init_complete &&
> + cur_msg->msg.type != MP_REP)
> + continue;
> +
> + TAILQ_REMOVE(&message_queue, cur_msg, next);
> +
> + process_msg(&cur_msg->msg, &cur_msg->sa);
> +
> + free(cur_msg);
> + }
> }
>
> return NULL;
> --
> 2.7.4
Regards,
Keith
More information about the dev
mailing list