From patchwork Wed Feb 19 08:18:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?J=C3=BAlius_Milan?= X-Patchwork-Id: 65890 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 91E20A0555; Wed, 19 Feb 2020 09:18:44 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5B06C1BF95; Wed, 19 Feb 2020 09:18:44 +0100 (CET) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by dpdk.org (Postfix) with ESMTP id E4CB11BF7D for ; Wed, 19 Feb 2020 09:18:42 +0100 (CET) Received: by mail-wm1-f66.google.com with SMTP id q9so5393036wmj.5 for ; Wed, 19 Feb 2020 00:18:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:mime-version:content-disposition :content-transfer-encoding:user-agent; bh=9T53w6mRTVWwHcNk5HQ+oeH/t4VS4+Fi9j6h/h4YwxE=; b=HjOIevCh4jsOpbvVUa468e2p8AiOj3k66XOveNZLmPCkHoFXu4e7h1afeXxt7rmNie ZdwmsWT0HQTfpVNczoPkr5n2uWdCLEPbRhbLzBqAfODeo/vM/I/qOQJvBFsk3tdVzRBf yl/NFtRfGf5bSHnvct2dbMv6t32a2zUMpXcCF6F+1DOK5D/1/elbesYmA6R3f/NYYXe1 ZUBI1MjBwCm5PkDRw4laGLhB2yi6g1QvRYXo4slaqA7KVPCOOtHTHhFjQJB2CLuua5F5 yF9xK37ZzyNeeBmXasNZB9fybmM5FO7rMtImQxmEAwN3WHHElRwzUnIeh/kPOd5zk/Ke Tzug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:content-transfer-encoding:user-agent; bh=9T53w6mRTVWwHcNk5HQ+oeH/t4VS4+Fi9j6h/h4YwxE=; b=JDsw7pQ4ICBypx97xd4KxN4m0pVSzpyDePuhxIwFfA2ZSK0eThL13heHcTrGNrVQrl nxudjg8M5y3ttPFXTorMc23qoojP6mHZlHWciRhSYEk06WsnXAvA12pAwY0JatiApNWZ GsJ26Z59TFeXinaFT8FMeEjwaHIMT/95K1V+dj7FIHzUJ7BpKn+u0bV7ucH79RGkKcmC bpeEzQ7qOwNpqQfZ5Z19F1QoMcRA82GrGECnoenkvcWm5U4GVcnBAXX3DvYf8ETFZEg9 tafPa6JE+UpYBFbVHlaoYo1jBWhAjtSthEieqJElO2YGiVKOXXZWYRDct7u07es5+RWx QO0Q== X-Gm-Message-State: APjAAAVGFzeHOo+Tst38F0lXr6yFlJcROYUQ2tV+/XVv7NY1CkGOLoHg tnyszgVAgINF3cmL7YB5KGHkzQRJPXs= X-Google-Smtp-Source: APXvYqzHCCtG4Qd8/UmD53YvWT9bueJAHEsOJWTyZMwzjI2hgMszO9bof0HGP4hQzbxXNJBK4WNw8A== X-Received: by 2002:a1c:df8b:: with SMTP id w133mr8086172wmg.184.1582100322304; Wed, 19 Feb 2020 00:18:42 -0800 (PST) Received: from vbox ([185.140.29.250]) by smtp.gmail.com with ESMTPSA id x11sm1895525wmg.46.2020.02.19.00.18.41 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 19 Feb 2020 00:18:41 -0800 (PST) Date: Wed, 19 Feb 2020 09:18:40 +0100 From: =?iso-8859-1?q?J=FAlius?= Milan To: dev@dpdk.org, jgrajcia@cisco.com Message-ID: <20200219081840.GA11729@vbox> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) Subject: [dpdk-dev] [PATCH 1/2] net/memif: enable loopback X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" With this patch it is possible to connect 2 DPDK memifs into loopback, i.e. when they have the same id and different roles, as for example: "--vdev=net_memif0,role=master,id=0" "--vdev=net_memif1,role=slave,id=0" Signed-off-by: Július Milan Reviewed-by: Jakub Grajciar --- drivers/net/memif/memif_socket.c | 30 ++++++++++++++---------------- drivers/net/memif/rte_eth_memif.c | 1 + drivers/net/memif/rte_eth_memif.h | 1 + 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index ad5e30b96..553f8b004 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private; if (((pmd->flags & ETH_MEMIF_FLAG_DISABLED) == 0) && - pmd->id == i->id) { + (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_MASTER)) { /* assign control channel to device */ cc->dev = dev; pmd->cc = cc; @@ -528,6 +528,7 @@ memif_disconnect(struct rte_eth_dev *dev) pmd->flags &= ~ETH_MEMIF_FLAG_CONNECTING; pmd->flags &= ~ETH_MEMIF_FLAG_CONNECTED; + rte_spinlock_lock(&pmd->cc_lock); if (pmd->cc != NULL) { /* Clear control message queue (except disconnect message if any). */ for (elt = TAILQ_FIRST(&pmd->cc->msg_queue); elt != NULL; elt = next) { @@ -570,6 +571,7 @@ memif_disconnect(struct rte_eth_dev *dev) "Failed to unregister control channel callback."); } } + rte_spinlock_unlock(&pmd->cc_lock); /* unconfig interrupts */ for (i = 0; i < pmd->cfg.num_s2m_rings; i++) { @@ -612,7 +614,8 @@ memif_disconnect(struct rte_eth_dev *dev) /* reset connection configuration */ memset(&pmd->run, 0, sizeof(pmd->run)); - MIF_LOG(DEBUG, "Disconnected."); + MIF_LOG(DEBUG, "Disconnected, id: %d, role: %s.", pmd->id, + (pmd->role == MEMIF_ROLE_MASTER) ? "master" : "slave"); } static int @@ -642,8 +645,12 @@ memif_msg_receive(struct memif_control_channel *cc) size = recvmsg(cc->intr_handle.fd, &mh, 0); if (size != sizeof(memif_msg_t)) { - MIF_LOG(DEBUG, "Invalid message size."); - memif_msg_enq_disconnect(cc, "Invalid message size", 0); + MIF_LOG(DEBUG, "Invalid message size = %ld", size); + if (size > 0) + /* 0 means end-of-file, negative size means error, + * don't send further disconnect message in such cases. + */ + memif_msg_enq_disconnect(cc, "Invalid message size", 0); return -1; } MIF_LOG(DEBUG, "Received msg type: %u.", msg.type); @@ -965,20 +972,11 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } pmd->socket_filename = socket->filename; - if (socket->listener != 0 && pmd->role == MEMIF_ROLE_SLAVE) { - MIF_LOG(ERR, "Socket is a listener."); - return -1; - } else if ((socket->listener == 0) && (pmd->role == MEMIF_ROLE_MASTER)) { - MIF_LOG(ERR, "Socket is not a listener."); - return -1; - } - TAILQ_FOREACH(elt, &socket->dev_queue, next) { tmp_pmd = elt->dev->data->dev_private; - if (tmp_pmd->id == pmd->id) { - MIF_LOG(ERR, "Memif device with id %d already " - "exists on socket %s", - pmd->id, socket->filename); + if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { + MIF_LOG(ERR, "Two interfaces with the same id (%d) can " + "not have the same role.", pmd->id); return -1; } } diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index 27c0f0924..81d71c53a 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -1491,6 +1491,7 @@ memif_create(struct rte_vdev_device *vdev, enum memif_role_t role, pmd->cfg.num_m2s_rings = 0; pmd->cfg.pkt_buffer_size = pkt_buffer_size; + rte_spinlock_init(&pmd->cc_lock); data = eth_dev->data; data->dev_private = pmd; diff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h index 0d2566392..6f45b7072 100644 --- a/drivers/net/memif/rte_eth_memif.h +++ b/drivers/net/memif/rte_eth_memif.h @@ -94,6 +94,7 @@ struct pmd_internals { char secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */ struct memif_control_channel *cc; /**< control channel */ + rte_spinlock_t cc_lock; /**< control channel lock */ /* remote info */ char remote_name[RTE_DEV_NAME_MAX_LEN]; /**< remote app name */ From patchwork Wed Feb 19 08:19:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?J=C3=BAlius_Milan?= X-Patchwork-Id: 65891 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 12A40A0555; Wed, 19 Feb 2020 09:19:21 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D29A41BF9F; Wed, 19 Feb 2020 09:19:20 +0100 (CET) Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by dpdk.org (Postfix) with ESMTP id D6A1E3B5 for ; Wed, 19 Feb 2020 09:19:18 +0100 (CET) Received: by mail-wm1-f67.google.com with SMTP id a9so5692370wmj.3 for ; Wed, 19 Feb 2020 00:19:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:mime-version:content-disposition :content-transfer-encoding:user-agent; bh=vVlDEUkhy5V666kJNY9cobXpYKxmCrcUopw89vJgQ8U=; b=r9twQRa1QnXiljvJ/J6IEKmDblXQ627BR9PP/HFXOpoP6Fv/Cr0+MOLO3pAeFY04j8 9PRhw/7dFKWO55uoF1AZDLCbYMy6qu3pul5ZC5M3v7jpSAcux1tmMyiaOKktfmfffDn7 IfOzfN92xmxP/oHZEypfTPIKIKOgumK6Yo+Gjq0+a2gavD2gImyOQwASEmre6z0d5U2/ /YdFslg2MUSSL8icpeSSDghSC3Fy2m+Ugkx835uMEWSNVLUlsy+hQ3tk7tyzJLWsP5lO 09Zp2DycVtJ0SDK9HEWkK+2hPxI0FJ+4+l+DKJZHanX/ra8uPWcZzya7/gzypH/hBxyT o24w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:content-transfer-encoding:user-agent; bh=vVlDEUkhy5V666kJNY9cobXpYKxmCrcUopw89vJgQ8U=; b=hMco+rs+xF97hsZEaa8hFmYovceEQ9Qr0nh43bWDouvjpSixMwutdvOFZ5OZsONv2R r7H+IeHRJ4jq7AuqNlPfK4hNmkhnvw2urojSlfqL3ABLqaDRGV0lgG7oUOqMJKe9/sVu LOf7S7iBLHapw1oFi4IyW3EiUDCbEYz5/jn2QoNTXbSpalUQQFrVXhCN4ADG0rbkgkYG /G9HpvgbtKT16lDK4WmWoSXhL/OmAzFPKqr6gh8OLLw41ghrPWFEZGRu2CKy95E/nnD/ uqYdHBxC8t67D6p7qDwknuqRi4Ais/4Ke019d9IgnaKfDNgSQTMBwAEjuLTDCAKWvlvD J1LQ== X-Gm-Message-State: APjAAAVztmS02AoXhyPX/ZnjYGSU9nLS4sGVeb1r8QMZZin4JBkYCqJG 3m27UNBaEtn6qiR8a8aarrenlsJa6aY= X-Google-Smtp-Source: APXvYqydKCWDlKweev7T+6PuXiNymjCHeZZOYOSOQ7bHjaWyXkNiz91HHnX6Fx7b0Y9TCSN0hwEyWA== X-Received: by 2002:a1c:541b:: with SMTP id i27mr9002952wmb.137.1582100358278; Wed, 19 Feb 2020 00:19:18 -0800 (PST) Received: from vbox ([185.140.29.250]) by smtp.gmail.com with ESMTPSA id s65sm1956792wmf.48.2020.02.19.00.19.17 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 19 Feb 2020 00:19:17 -0800 (PST) Date: Wed, 19 Feb 2020 09:19:16 +0100 From: =?iso-8859-1?q?J=FAlius?= Milan To: dev@dpdk.org, jgrajcia@cisco.com Message-ID: <20200219081916.GA11931@vbox> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) Subject: [dpdk-dev] [PATCH 2/2] net/memif: fix init handling when already connected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch fixes the situation when there is already connected pair of memif interfaces and another slave tries to initiate the connection with (already occupied) master. Expected behavior is that the second slave is refused and gets disconnect message with reason: "Already connected", while old connection remains functional. Fixes: 09c7e63a71f9 ("net/memif: introduce memory interface PMD") Signed-off-by: Július Milan Reviewed-by: Jakub Grajciar --- drivers/net/memif/memif_socket.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index 553f8b004..1a06c6850 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -204,6 +204,13 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) pmd = dev->data->dev_private; if (((pmd->flags & ETH_MEMIF_FLAG_DISABLED) == 0) && (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_MASTER)) { + if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING | + ETH_MEMIF_FLAG_CONNECTED)) { + memif_msg_enq_disconnect(cc, + "Already connected", 0); + return -1; + } + /* assign control channel to device */ cc->dev = dev; pmd->cc = cc; @@ -215,12 +222,6 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) return -1; } - if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING | - ETH_MEMIF_FLAG_CONNECTED)) { - memif_msg_enq_disconnect(pmd->cc, - "Already connected", 0); - return -1; - } strlcpy(pmd->remote_name, (char *)i->name, sizeof(pmd->remote_name)); @@ -772,6 +773,7 @@ memif_intr_handler(void *arg) ret = memif_msg_receive(cc); /* if driver failed to assign device */ if (cc->dev == NULL) { + memif_msg_send_from_queue(cc); ret = rte_intr_callback_unregister_pending(&cc->intr_handle, memif_intr_handler, cc,