From patchwork Mon Sep 27 13:42:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srikanth Kaka X-Patchwork-Id: 99824 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 04AFAA0C46; Mon, 27 Sep 2021 17:01:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2AD01411A7; Mon, 27 Sep 2021 16:58:38 +0200 (CEST) Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) by mails.dpdk.org (Postfix) with ESMTP id 7623A410DD for ; Mon, 27 Sep 2021 15:43:18 +0200 (CEST) Received: by mail-pl1-f174.google.com with SMTP id t11so11798905plq.11 for ; Mon, 27 Sep 2021 06:43:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oneconvergence.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ypsdkfEQUqstAzTHwOVtK+4V2nRVI41QIW0OB1Uo4Ak=; b=A4qozoIrB6hNq6Pesxr6RBAs7odlKiq2dKHL6LW0EGSR92JrNktCI43nI5ejgJW7wR 1rUPoVLT0MpoKXhAXNVA5QZ287WMXeieoc5IqlPnTmrhXA9Hpfw7EAWuViCShLXig8PX RAJQfkp21cJM2nKBwwW/3mTGoE0xi4/SFkzIw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ypsdkfEQUqstAzTHwOVtK+4V2nRVI41QIW0OB1Uo4Ak=; b=609fopmioxceEx0lM3m0YB+27FFqTUPCXUcrNC+Av+FBnhvDMEAFIWTnHi3BIZy06z KUt7RZuLxTPVvfDuaFrMX2M8wlnRDsAfZBVNExxZkpjrADoa+cTxuJ/Bzal0d92ls7Vw 4f3NGTkmUitQVspk4IEVsD9jndI+Pm2CU7ycQFUd801b3Uj7GGlC9tt6M8nenBANxE/u ZQRHMWpndS7amqERjWaU7nbxJBNahfmgma5Zu/eIuWGaGJqEvxIKy4oaT+vAd+Vz2hBM S0w5qM5gfqb3scoIdEq4XeLo21Q/byqWjtfYX/y2INk3NcM3l/38MDQ8m4X5a41h6AMt yVmA== X-Gm-Message-State: AOAM530nOADG5mcUtkX6W4a+cottjQNk8j+8gR2Ql1WbBAqNl/m1+n6y zTNxPD7NNF0JrSRUsh/PITHvng== X-Google-Smtp-Source: ABdhPJxkHlUofbS3xFYjj4lDxKkI9BDwHctPpQRloYbY1ZWeHCLwsa1myY+/QohEkNo8p88YtKiCUw== X-Received: by 2002:a17:90a:2944:: with SMTP id x4mr2079970pjf.131.1632750197671; Mon, 27 Sep 2021 06:43:17 -0700 (PDT) Received: from srikanth-ThinkPad-T450.domain.name ([223.178.22.200]) by smtp.gmail.com with ESMTPSA id b3sm16960665pfo.23.2021.09.27.06.43.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Sep 2021 06:43:17 -0700 (PDT) From: Srikanth Kaka To: Stephen Hemminger , Long Li Cc: dev@dpdk.org, Vag Singh , Anand Thulasiram , Srikanth Kaka Date: Mon, 27 Sep 2021 19:12:27 +0530 Message-Id: <20210927134231.11177-8-srikanth.k@oneconvergence.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210927134231.11177-1-srikanth.k@oneconvergence.com> References: <20210927134231.11177-1-srikanth.k@oneconvergence.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 27 Sep 2021 16:58:07 +0200 Subject: [dpdk-dev] [PATCH 07/11] bus/vmbus: map the subchannel resources X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Using sysctl, the resource values of subchannels are obtained and an mmap request to made to their buffers. Signed-off-by: Srikanth Kaka Signed-off-by: Vag Singh Signed-off-by: Anand Thulasiram --- drivers/bus/vmbus/freebsd/vmbus_uio.c | 181 ++++++++++---------------- 1 file changed, 66 insertions(+), 115 deletions(-) diff --git a/drivers/bus/vmbus/freebsd/vmbus_uio.c b/drivers/bus/vmbus/freebsd/vmbus_uio.c index 022ac85302..14b858f39d 100644 --- a/drivers/bus/vmbus/freebsd/vmbus_uio.c +++ b/drivers/bus/vmbus/freebsd/vmbus_uio.c @@ -24,8 +24,11 @@ #include "private.h" -/** Pathname of VMBUS devices directory. */ -#define SYSFS_VMBUS_DEVICES "/sys/bus/vmbus/devices" +/* Macros to distinguish mmap request + * [7-0] - Device memory region + * [15-8]- Sub-channel id + */ +#define UH_SUBCHAN_MASK_SHIFT 8 /* ioctl */ #define HVIOOPENSUBCHAN _IOW('h', 14, uint32_t) @@ -274,19 +277,17 @@ static int vmbus_uio_map_primary(struct vmbus_channel *chan, } static int vmbus_uio_map_subchan(const struct rte_vmbus_device *dev, - const struct vmbus_channel *chan, + struct vmbus_channel *chan, void **ring_buf, uint32_t *ring_size) { char ring_path[PATH_MAX]; - size_t file_size; - struct stat sb; + size_t size; void *mapaddr; + off_t offset; int fd; snprintf(ring_path, sizeof(ring_path), - "%s/%s/channels/%u/ring", - SYSFS_VMBUS_DEVICES, dev->device.name, - chan->relid); + "/dev/hv_uio%d", dev->uio_num); fd = open(ring_path, O_RDWR); if (fd < 0) { @@ -295,33 +296,21 @@ static int vmbus_uio_map_subchan(const struct rte_vmbus_device *dev, return -errno; } - if (fstat(fd, &sb) < 0) { - VMBUS_LOG(ERR, "Cannot state %s: %s", - ring_path, strerror(errno)); - close(fd); - return -errno; - } - file_size = sb.st_size; - - if (file_size == 0 || (file_size & (rte_mem_page_size() - 1))) { - VMBUS_LOG(ERR, "incorrect size %s: %zu", - ring_path, file_size); - - close(fd); - return -EINVAL; - } + /* subchannel rings are of the same size as primary */ + size = dev->resource[HV_TXRX_RING_MAP].len; + offset = (chan->relid << UH_SUBCHAN_MASK_SHIFT) * PAGE_SIZE; mapaddr = vmbus_map_resource(vmbus_map_addr, fd, - 0, file_size, 0); + offset, size, 0); close(fd); if (mapaddr == MAP_FAILED) return -EIO; - *ring_size = file_size / 2; + *ring_size = size / 2; *ring_buf = mapaddr; - vmbus_map_addr = RTE_PTR_ADD(mapaddr, file_size); + vmbus_map_addr = RTE_PTR_ADD(mapaddr, size); return 0; } @@ -336,9 +325,7 @@ vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device *dev, int fd; snprintf(ring_path, sizeof(ring_path), - "%s/%s/channels/%u/ring", - SYSFS_VMBUS_DEVICES, dev->device.name, - chan->relid); + "/dev/ring%d", dev->uio_num); ring_buf = br->vbr; ring_size = br->dsize + sizeof(struct vmbus_bufring); @@ -391,32 +378,6 @@ int vmbus_uio_map_rings(struct vmbus_channel *chan) return 0; } -static int vmbus_uio_sysfs_read(const char *dir, const char *name, - unsigned long *val, unsigned long max_range) -{ - char path[PATH_MAX]; - FILE *f; - int ret; - - snprintf(path, sizeof(path), "%s/%s", dir, name); - f = fopen(path, "r"); - if (!f) { - VMBUS_LOG(ERR, "can't open %s:%s", - path, strerror(errno)); - return -errno; - } - - if (fscanf(f, "%lu", val) != 1) - ret = -EIO; - else if (*val > max_range) - ret = -ERANGE; - else - ret = 0; - fclose(f); - - return ret; -} - bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev, const struct vmbus_channel *chan) { @@ -426,7 +387,7 @@ bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev, } static bool vmbus_isnew_subchannel(struct vmbus_channel *primary, - unsigned long id) + uint16_t id) { const struct vmbus_channel *c; @@ -441,83 +402,73 @@ int vmbus_uio_get_subchan(struct vmbus_channel *primary, struct vmbus_channel **subchan) { const struct rte_vmbus_device *dev = primary->device; - char chan_path[PATH_MAX], subchan_path[PATH_MAX]; - struct dirent *ent; - DIR *chan_dir; + char sysctlBuffer[PATH_MAX], sysctlVar[PATH_MAX]; + size_t len = PATH_MAX, sysctl_len; + /* nr_schan, relid, subid & monid datatype must match kernel's for sysctl */ + uint32_t relid, subid, nr_schan, i; + uint8_t monid; int err; - snprintf(chan_path, sizeof(chan_path), - "%s/%s/channels", - SYSFS_VMBUS_DEVICES, dev->device.name); - - chan_dir = opendir(chan_path); - if (!chan_dir) { - VMBUS_LOG(ERR, "cannot open %s: %s", - chan_path, strerror(errno)); - return -errno; + /* get no. of sub-channels opened by hv_uio + * dev.hv_uio.0.subchan_cnt + */ + snprintf(sysctlVar, len, "dev.%s.%d.subchan_cnt", driver_name, + dev->uio_num); + sysctl_len = sizeof(nr_schan); + if (sysctlbyname(sysctlVar, &nr_schan, &sysctl_len, NULL, 0) < 0) { + VMBUS_LOG(ERR, "could not read %s : %s", sysctlVar, + strerror(errno)); + return -1; } - while ((ent = readdir(chan_dir))) { - unsigned long relid, subid, monid; - char *endp; - - if (ent->d_name[0] == '.') - continue; - - errno = 0; - relid = strtoul(ent->d_name, &endp, 0); - if (*endp || errno != 0 || relid > UINT16_MAX) { - VMBUS_LOG(NOTICE, "not a valid channel relid: %s", - ent->d_name); - continue; - } - - if (!vmbus_isnew_subchannel(primary, relid)) { - VMBUS_LOG(DEBUG, "skip already found channel: %lu", - relid); - continue; + /* dev.hv_uio.0.channel.14.sub */ + snprintf(sysctlBuffer, len, "dev.%s.%d.channel.%u.sub", driver_name, + dev->uio_num, primary->relid); + for (i = 1; i <= nr_schan; i++) { + /* get relid */ + snprintf(sysctlVar, len, "%s.%u.chanid", sysctlBuffer, i); + sysctl_len = sizeof(relid); + if (sysctlbyname(sysctlVar, &relid, &sysctl_len, NULL, 0) < 0) { + VMBUS_LOG(ERR, "could not read %s : %s", sysctlVar, + strerror(errno)); + goto error; } - if (!vmbus_uio_ring_present(dev, relid)) { - VMBUS_LOG(DEBUG, "ring mmap not found (yet) for: %lu", - relid); + if (!vmbus_isnew_subchannel(primary, (uint16_t)relid)) { + VMBUS_LOG(DEBUG, "skip already found channel: %u", + relid); continue; } - snprintf(subchan_path, sizeof(subchan_path), "%s/%lu", - chan_path, relid); - err = vmbus_uio_sysfs_read(subchan_path, "subchannel_id", - &subid, UINT16_MAX); - if (err) { - VMBUS_LOG(NOTICE, "no subchannel_id in %s:%s", - subchan_path, strerror(-err)); - goto fail; + /* get sub-channel id */ + snprintf(sysctlVar, len, "%s.%u.ch_subidx", sysctlBuffer, i); + sysctl_len = sizeof(subid); + if (sysctlbyname(sysctlVar, &subid, &sysctl_len, NULL, 0) < 0) { + VMBUS_LOG(ERR, "could not read %s : %s", sysctlVar, + strerror(errno)); + goto error; } - if (subid == 0) - continue; /* skip primary channel */ - - err = vmbus_uio_sysfs_read(subchan_path, "monitor_id", - &monid, UINT8_MAX); - if (err) { - VMBUS_LOG(NOTICE, "no monitor_id in %s:%s", - subchan_path, strerror(-err)); - goto fail; + /* get monitor id */ + snprintf(sysctlVar, len, "%s.%u.monitor_id", sysctlBuffer, i); + sysctl_len = sizeof(monid); + if (sysctlbyname(sysctlVar, &monid, &sysctl_len, NULL, 0) < 0) { + VMBUS_LOG(ERR, "could not read %s : %s", sysctlVar, + strerror(errno)); + goto error; } - err = vmbus_chan_create(dev, relid, subid, monid, subchan); + err = vmbus_chan_create(dev, (uint16_t)relid, (uint16_t)subid, + monid, subchan); if (err) { VMBUS_LOG(ERR, "subchannel setup failed"); - goto fail; + return err; } break; } - closedir(chan_dir); - - return (ent == NULL) ? -ENOENT : 0; -fail: - closedir(chan_dir); - return err; + return 0; +error: + return -1; } int vmbus_uio_subchan_open(struct rte_vmbus_device *dev, uint32_t subchan)