DPDK patches and discussions
 help / color / mirror / Atom feed
From: Maxime Coquelin <maxime.coquelin@redhat.com>
To: Ilya Maximets <i.maximets@samsung.com>,
	dev@dpdk.org, tiwei.bie@intel.com, zhihong.wang@intel.com,
	jfreimann@redhat.com, nicknickolaev@gmail.com,
	bruce.richardson@intel.com, alejandro.lucero@netronome.com
Cc: dgilbert@redhat.com, stable@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v6 01/19] vhost: fix messages results handling
Date: Fri, 12 Oct 2018 11:03:51 +0200	[thread overview]
Message-ID: <888fb7e9-8293-8a38-cba3-450a54295e40@redhat.com> (raw)
In-Reply-To: <20181011161540eucas1p2dbf54108af22eb68b2c87003d9d2d511~cmgoaUNMO3252632526eucas1p2e@eucas1p2.samsung.com>



On 10/11/2018 06:18 PM, Ilya Maximets wrote:
> On 11.10.2018 12:24, Maxime Coquelin wrote:
>> Return of message handling has now changed to an enum that can
>> take non-negative value that is not zero in case a reply is
>> needed. But the code checking the variable afterwards has not
>> been updated, leading to success messages handling being
>> treated as errors.
>>
>> External post and pre callbacks return type needs also to be
>> changed to the new enum, so that its handling is consistent.
>> This is done in this patch alongside with the convertion of
>> its only user, vhost-crypto backend.
>>
>> Fixes: 0bff510b5ea6 ("vhost: unify message handling function signature")
>>
>> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>> ---
>>   lib/librte_vhost/vhost.h        | 19 +++++++-----------
>>   lib/librte_vhost/vhost_crypto.c | 24 +++++++++++------------
>>   lib/librte_vhost/vhost_user.c   | 34 +++++++++------------------------
>>   lib/librte_vhost/vhost_user.h   |  9 +++++++++
>>   4 files changed, 36 insertions(+), 50 deletions(-)
>>
>> diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
>> index 25ffd7614..341b0a147 100644
>> --- a/lib/librte_vhost/vhost.h
>> +++ b/lib/librte_vhost/vhost.h
>> @@ -292,17 +292,15 @@ struct guest_page {
>>    *  vhost device id
>>    * @param msg
>>    *  Message pointer.
>> - * @param require_reply
>> - *  If the handler requires sending a reply, this varaible shall be written 1,
>> - *  otherwise 0.
>>    * @param skip_master
>>    *  If the handler requires skipping the master message handling, this variable
>>    *  shall be written 1, otherwise 0.
>>    * @return
>> - *  0 on success, -1 on failure
>> + *  VH_RESULT_OK on success, VH_RESULT_REPLY on success with reply,
>> + *  VH_RESULT_ERR on failure
>>    */
>> -typedef int (*vhost_msg_pre_handle)(int vid, void *msg,
>> -		uint32_t *require_reply, uint32_t *skip_master);
>> +typedef enum vh_result (*vhost_msg_pre_handle)(int vid, void *msg,
>> +		uint32_t *skip_master);
>>   
>>   /**
>>    * function prototype for the vhost backend to handler specific vhost user
>> @@ -312,14 +310,11 @@ typedef int (*vhost_msg_pre_handle)(int vid, void *msg,
>>    *  vhost device id
>>    * @param msg
>>    *  Message pointer.
>> - * @param require_reply
>> - *  If the handler requires sending a reply, this varaible shall be written 1,
>> - *  otherwise 0.
>>    * @return
>> - *  0 on success, -1 on failure
>> + *  VH_RESULT_OK on success, VH_RESULT_REPLY on success with reply,
>> + *  VH_RESULT_ERR on failure
>>    */
>> -typedef int (*vhost_msg_post_handle)(int vid, void *msg,
>> -		uint32_t *require_reply);
>> +typedef enum vh_result (*vhost_msg_post_handle)(int vid, void *msg);
> 
> I think that function prototypes and the enum definition should be
> in the same header, because headers are not including each other directly.
> Not sure in which one, but it seems that handlers are vhost-user specific.
> Are they? If so, meybe we could move the prototypes to vhost_user.h.

Makes sense, I will move the definitions to vhost-user.h

>>   
>>   /**
>>    * pre and post vhost user message handlers
>> diff --git a/lib/librte_vhost/vhost_crypto.c b/lib/librte_vhost/vhost_crypto.c
>> index 57341ef8f..e534e1187 100644
>> --- a/lib/librte_vhost/vhost_crypto.c
>> +++ b/lib/librte_vhost/vhost_crypto.c
>> @@ -425,35 +425,33 @@ vhost_crypto_close_sess(struct vhost_crypto *vcrypto, uint64_t session_id)
>>   	return 0;
>>   }
>>   
>> -static int
>> -vhost_crypto_msg_post_handler(int vid, void *msg, uint32_t *require_reply)
>> +static enum vh_result
>> +vhost_crypto_msg_post_handler(int vid, void *msg)
>>   {
>>   	struct virtio_net *dev = get_device(vid);
>>   	struct vhost_crypto *vcrypto;
>>   	VhostUserMsg *vmsg = msg;
>> -	int ret = 0;
>> +	enum vh_result ret = VH_RESULT_ERR;
>>   
>> -	if (dev == NULL || require_reply == NULL) {
>> +	if (dev == NULL) {
>>   		VC_LOG_ERR("Invalid vid %i", vid);
>> -		return -EINVAL;
>> +		return VH_RESULT_ERR;
>>   	}
>>   
>>   	vcrypto = dev->extern_data;
>>   	if (vcrypto == NULL) {
>>   		VC_LOG_ERR("Cannot find required data, is it initialized?");
>> -		return -ENOENT;
>> +		return VH_RESULT_ERR;
>>   	}
>>   
>> -	*require_reply = 0;
>> -
>>   	if (vmsg->request.master == VHOST_USER_CRYPTO_CREATE_SESS) {
>>   		vhost_crypto_create_sess(vcrypto,
>>   				&vmsg->payload.crypto_session);
>> -		*require_reply = 1;
>> -	} else if (vmsg->request.master == VHOST_USER_CRYPTO_CLOSE_SESS)
>> -		ret = vhost_crypto_close_sess(vcrypto, vmsg->payload.u64);
>> -	else
>> -		ret = -EINVAL;
>> +		ret = VH_RESULT_REPLY;
> 
> Maybe we need to print error message here? Seems that we're loosing
> the information about error type.

Yes, I can add a message here.

>> +	} else if (vmsg->request.master == VHOST_USER_CRYPTO_CLOSE_SESS) {
>> +		if (!vhost_crypto_close_sess(vcrypto, vmsg->payload.u64))
>> +			ret = VH_RESULT_OK;
>> +	}
>>   
>>   	return ret;
>>   }
>> diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
>> index 7ef3fb4a4..e8375ca34 100644
>> --- a/lib/librte_vhost/vhost_user.c
>> +++ b/lib/librte_vhost/vhost_user.c
>> @@ -71,16 +71,6 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
>>   	[VHOST_USER_CRYPTO_CLOSE_SESS] = "VHOST_USER_CRYPTO_CLOSE_SESS",
>>   };
>>   
>> -/* The possible results of a message handling function */
>> -enum vh_result {
>> -	/* Message handling failed */
>> -	VH_RESULT_ERR   = -1,
>> -	/* Message handling successful */
>> -	VH_RESULT_OK    =  0,
>> -	/* Message handling successful and reply prepared */
>> -	VH_RESULT_REPLY =  1,
>> -};
>> -
>>   static uint64_t
>>   get_blk_size(int fd)
>>   {
>> @@ -1738,14 +1728,11 @@ vhost_user_msg_handler(int vid, int fd)
>>   	}
>>   
>>   	if (dev->extern_ops.pre_msg_handle) {
>> -		uint32_t need_reply;
>> -
>>   		ret = (*dev->extern_ops.pre_msg_handle)(dev->vid,
>> -				(void *)&msg, &need_reply, &skip_master);
>> -		if (ret < 0)
>> +				(void *)&msg, &skip_master);
>> +		if (ret == VH_RESULT_ERR)
>>   			goto skip_to_reply;
>> -
>> -		if (need_reply)
>> +		else if (ret == VH_RESULT_REPLY)
>>   			send_vhost_reply(fd, &msg);
>>   
>>   		if (skip_master)
>> @@ -1783,15 +1770,12 @@ vhost_user_msg_handler(int vid, int fd)
>>   	}
>>   
>>   skip_to_post_handle:
>> -	if (!ret && dev->extern_ops.post_msg_handle) {
>> -		uint32_t need_reply;
>> -
>> +	if (ret != VH_RESULT_ERR && dev->extern_ops.post_msg_handle) {
>>   		ret = (*dev->extern_ops.post_msg_handle)(
>> -				dev->vid, (void *)&msg, &need_reply);
>> -		if (ret < 0)
>> +				dev->vid, (void *)&msg);
>> +		if (ret == VH_RESULT_ERR)
>>   			goto skip_to_reply;
>> -
>> -		if (need_reply)
>> +		else if (ret == VH_RESULT_REPLY)
>>   			send_vhost_reply(fd, &msg);
>>   	}
>>   
>> @@ -1800,10 +1784,10 @@ vhost_user_msg_handler(int vid, int fd)
>>   		vhost_user_unlock_all_queue_pairs(dev);
>>   
>>   	if (msg.flags & VHOST_USER_NEED_REPLY) {
>> -		msg.payload.u64 = !!ret;
>> +		msg.payload.u64 = ret == VH_RESULT_ERR;
>>   		msg.size = sizeof(msg.payload.u64);
>>   		send_vhost_reply(fd, &msg);
>> -	} else if (ret) {
>> +	} else if (ret == VH_RESULT_ERR) {
>>   		RTE_LOG(ERR, VHOST_CONFIG,
>>   			"vhost message handling failed.\n");
>>   		return -1;
>> diff --git a/lib/librte_vhost/vhost_user.h b/lib/librte_vhost/vhost_user.h
>> index 42166adf2..62654f736 100644
>> --- a/lib/librte_vhost/vhost_user.h
>> +++ b/lib/librte_vhost/vhost_user.h
>> @@ -139,6 +139,15 @@ typedef struct VhostUserMsg {
>>   /* The version of the protocol we support */
>>   #define VHOST_USER_VERSION    0x1
>>   
>> +/* The possible results of a message handling function */
>> +enum vh_result {
>> +	/* Message handling failed */
>> +	VH_RESULT_ERR   = -1,
>> +	/* Message handling successful */
>> +	VH_RESULT_OK    =  0,
>> +	/* Message handling successful and reply prepared */
>> +	VH_RESULT_REPLY =  1,
>> +};
>>   
>>   /* vhost_user.c */
>>   int vhost_user_msg_handler(int vid, int fd);
>>

  reply	other threads:[~2018-10-12  9:04 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-11  9:24 [dpdk-dev] [PATCH v6 00/19] vhost: add postcopy live-migration support Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 01/19] vhost: fix messages results handling Maxime Coquelin
2018-10-11 16:18   ` Ilya Maximets
2018-10-12  9:03     ` Maxime Coquelin [this message]
2018-10-12  9:55       ` Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 02/19] vhost: fix return code of messages requiring replies Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 03/19] vhost: clarify reply-ack in case a reply was already sent Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 04/19] vhost: fix payload size of reply Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 05/19] vhost: fix error handling when mem table gets updated Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 06/19] vhost: define postcopy protocol flag Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 07/19] vhost: add number of fds to vhost-user messages and use it Maxime Coquelin
2018-10-11 15:59   ` Ilya Maximets
2018-10-12  8:43     ` Maxime Coquelin
2018-10-12  8:45       ` Maxime Coquelin
2018-10-12  8:57         ` Maxime Coquelin
2018-10-12  9:53           ` Ilya Maximets
2018-10-12  9:52             ` Maxime Coquelin
2018-10-12 10:04               ` Ilya Maximets
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 08/19] vhost: pass socket fd to message handling callbacks Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 09/19] vhost: enable fds passing when sending vhost-user messages Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 10/19] vhost: add config flag for postcopy feature Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 11/19] vhost: introduce postcopy's advise message Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 12/19] vhost: add support for postcopy's listen message Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 13/19] vhost: register new regions with userfaultfd Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 14/19] vhost: avoid useless VhostUserMemory copy Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 15/19] vhost: send userfault range addresses back to qemu Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 16/19] vhost: add support to postcopy's end request Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 17/19] vhost: restrict postcopy live-migration enablement Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 18/19] net/vhost: add parameter to enable postcopy support Maxime Coquelin
2018-10-11  9:24 ` [dpdk-dev] [PATCH v6 19/19] vhost: enable postcopy protocol feature Maxime Coquelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=888fb7e9-8293-8a38-cba3-450a54295e40@redhat.com \
    --to=maxime.coquelin@redhat.com \
    --cc=alejandro.lucero@netronome.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=dgilbert@redhat.com \
    --cc=i.maximets@samsung.com \
    --cc=jfreimann@redhat.com \
    --cc=nicknickolaev@gmail.com \
    --cc=stable@dpdk.org \
    --cc=tiwei.bie@intel.com \
    --cc=zhihong.wang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).