From nobody Tue Feb 01 01:12:25 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 7AE3119A042F; Tue, 1 Feb 2022 01:12:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Jnn3F2JSqz4ldG; Tue, 1 Feb 2022 01:12:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643677945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8EDlehW8lazBorUVV4rnbK3QyF9lb4V0EN8RpCPF6Vg=; b=fJ7GP5kObzG8kUDjdkOLfdllzoBszXl+DXKv/L7JgdL4HTv+qkhZMsheTmB2hg2NMp7uGG un4Yu2iCEze1z2JGGud2Woc3rYvDfsf6n4QxXwWzrA0u6yfU63HePvh9WgO4kWrnyslo7/ 1I/xHDPUBPIjOCHcxlvGMYdmRaLghRNPh2OvYgMBxqD4W/fNeCdh9wu/SK/6D0oEFIlv1P /u06eKZ8z4X9muLrTlFJuOL8NKAjlPQ6itDnrRfE7ZL6+w76L3MsIvXhBK1zw/Hivnqlnz ehxND5LGklOdu+U974OAF+k7kB4jh0nVMy4DdOkouRe2TzITCndn76dgRwzS1g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 2EDFF26C2C; Tue, 1 Feb 2022 01:12:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2111CPPl013672; Tue, 1 Feb 2022 01:12:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2111CPYU013671; Tue, 1 Feb 2022 01:12:25 GMT (envelope-from git) Date: Tue, 1 Feb 2022 01:12:25 GMT Message-Id: <202202010112.2111CPYU013671@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 53e938e408be - main - hyperv storvsc: Don't abuse struct sglist to hold virtual addresses. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 53e938e408be78a45c82012ca7a7be50b216159b Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643677945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8EDlehW8lazBorUVV4rnbK3QyF9lb4V0EN8RpCPF6Vg=; b=W845Gf8wt/6kJRLoggyXa2TVTYznOv4z/31lTTMe5LHGsEMiXknZKshe6u29rfpjsWqRSb mvkL8PpTM9yom+MXEh3nka99m8ESRR8jSYoaIlY8tLqw/5Qf+yzditRJa2kszZuUMmfVNV djS+3mWFfao0iEyN+/j657rUulnFykRt8a3jDd3nm2gRV8FFzI3gzaHhZ4J/oq1slSMmtP F7CecBjivoxa02pK3u/AfbYq6Q6aLqBFRkpxZQEh3+uPU7udhfigBZWxqNORbY7RTu7YZ9 /8znR0gVV8qQLaSpr9SchnZT7LIv9Zphy1IX//+Ys+AuZfk2v5MYtWSphkqosA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1643677945; a=rsa-sha256; cv=none; b=Si7scMzG5eqliH3Yk3+OSu0iglYjbyZu6ar7SFaZ7HktSR+CwlK748Q+1us5v81wrJWRaW pTwT/7GD66u3vAy8RtpmXJAXtA45vkZ8nlAFhCd1o9PDXJAOvoLACn8SIiWut0cr3GxoVo XJnYFHl9mOrW9yEyT6vnwY+boT/9FkGwmn890QrK4h/rFyQ91sb8B3hC1Pc2VMYEiuUd6y uJuwNjINMo+C7j/Ck4KbVhHKBfz/+qsVFAb8i4On5OJGgs9gPB5kb1ZPjXMPTw1uKPm8+m NfS1YqhzfZLF5F8JAzC9fm99DZze03BHQV+wI1arQ7RK+M4N3ok8gchw0h0KXw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=53e938e408be78a45c82012ca7a7be50b216159b commit 53e938e408be78a45c82012ca7a7be50b216159b Author: John Baldwin AuthorDate: 2022-02-01 01:11:27 +0000 Commit: John Baldwin CommitDate: 2022-02-01 01:11:27 +0000 hyperv storvsc: Don't abuse struct sglist to hold virtual addresses. struct sglist is intended for holding S/G lists of physical address ranges, not virtual address ranges. GCC 9.x issues several warnings due to casts between pointers and integers of different sizes as a result (vm_paddr_t is 64-bits on i386). Instead, add a local 'struct hv_sglist' which uses an array of 'struct iovec' to hold the S/G list of virtual address ranges. Differential Revision: https://reviews.freebsd.org/D31933 --- sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c | 64 ++++++++++++------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c index 13e52ec1b6db..091515e1f5df 100644 --- a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c +++ b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c @@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -110,9 +109,15 @@ __FBSDID("$FreeBSD$"); struct storvsc_softc; +struct hv_sglist { + struct iovec sg_iov[STORVSC_DATA_SEGCNT_MAX]; + u_short sg_nseg; + u_short sg_maxseg; +}; + struct hv_sgl_node { LIST_ENTRY(hv_sgl_node) link; - struct sglist *sgl_data; + struct hv_sglist *sgl_data; }; struct hv_sgl_page_pool{ @@ -186,7 +191,7 @@ struct hv_storvsc_request { struct storvsc_softc *softc; struct callout callout; struct sema synch_sema; /*Synchronize the request/response if needed */ - struct sglist *bounce_sgl; + struct hv_sglist *bounce_sgl; unsigned int bounce_sgl_count; uint64_t not_aligned_seg_bits; bus_dmamap_t data_dmap; @@ -344,13 +349,13 @@ static void hv_storvsc_on_iocompletion( struct storvsc_softc *sc, struct hv_storvsc_request *request); static int hv_storvsc_connect_vsp(struct storvsc_softc *); static void storvsc_io_done(struct hv_storvsc_request *reqp); -static void storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl, +static void storvsc_copy_sgl_to_bounce_buf(struct hv_sglist *bounce_sgl, bus_dma_segment_t *orig_sgl, unsigned int orig_sgl_count, uint64_t seg_bits); void storvsc_copy_from_bounce_buf_to_sgl(bus_dma_segment_t *dest_sgl, unsigned int dest_sgl_count, - struct sglist* src_sgl, + struct hv_sglist *src_sgl, uint64_t seg_bits); static device_method_t storvsc_methods[] = { @@ -1112,16 +1117,15 @@ storvsc_attach(device_t dev) sgl_node = malloc(sizeof(struct hv_sgl_node), M_DEVBUF, M_WAITOK|M_ZERO); - sgl_node->sgl_data = - sglist_alloc(STORVSC_DATA_SEGCNT_MAX, - M_WAITOK|M_ZERO); + sgl_node->sgl_data = malloc(sizeof(struct hv_sglist), + M_DEVBUF, M_WAITOK|M_ZERO); for (j = 0; j < STORVSC_DATA_SEGCNT_MAX; j++) { tmp_buff = malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK|M_ZERO); - sgl_node->sgl_data->sg_segs[j].ss_paddr = - (vm_paddr_t)tmp_buff; + sgl_node->sgl_data->sg_iov[j].iov_base = + tmp_buff; } LIST_INSERT_HEAD(&g_hv_sgl_page_pool.free_sgl_list, @@ -1210,12 +1214,9 @@ cleanup: sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.free_sgl_list); LIST_REMOVE(sgl_node, link); for (j = 0; j < STORVSC_DATA_SEGCNT_MAX; j++) { - if (NULL != - (void*)sgl_node->sgl_data->sg_segs[j].ss_paddr) { - free((void*)sgl_node->sgl_data->sg_segs[j].ss_paddr, M_DEVBUF); - } + free(sgl_node->sgl_data->sg_iov[j].iov_base, M_DEVBUF); } - sglist_free(sgl_node->sgl_data); + free(sgl_node->sgl_data, M_DEVBUF); free(sgl_node, M_DEVBUF); } @@ -1273,12 +1274,9 @@ storvsc_detach(device_t dev) sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.free_sgl_list); LIST_REMOVE(sgl_node, link); for (j = 0; j < STORVSC_DATA_SEGCNT_MAX; j++){ - if (NULL != - (void*)sgl_node->sgl_data->sg_segs[j].ss_paddr) { - free((void*)sgl_node->sgl_data->sg_segs[j].ss_paddr, M_DEVBUF); - } + free(sgl_node->sgl_data->sg_iov[j].iov_base, M_DEVBUF); } - sglist_free(sgl_node->sgl_data); + free(sgl_node->sgl_data, M_DEVBUF); free(sgl_node, M_DEVBUF); } @@ -1621,7 +1619,7 @@ storvsc_action(struct cam_sim *sim, union ccb *ccb) * */ static void -storvsc_destroy_bounce_buffer(struct sglist *sgl) +storvsc_destroy_bounce_buffer(struct hv_sglist *sgl) { struct hv_sgl_node *sgl_node = NULL; if (LIST_EMPTY(&g_hv_sgl_page_pool.in_use_sgl_list)) { @@ -1646,15 +1644,15 @@ storvsc_destroy_bounce_buffer(struct sglist *sgl) * * return NULL if create failed */ -static struct sglist * +static struct hv_sglist * storvsc_create_bounce_buffer(uint16_t seg_count, int write) { int i = 0; - struct sglist *bounce_sgl = NULL; + struct hv_sglist *bounce_sgl = NULL; unsigned int buf_len = ((write == WRITE_TYPE) ? 0 : PAGE_SIZE); struct hv_sgl_node *sgl_node = NULL; - /* get struct sglist from free_sgl_list */ + /* get struct hv_sglist from free_sgl_list */ if (LIST_EMPTY(&g_hv_sgl_page_pool.free_sgl_list)) { printf("storvsc error: not enough free sgl\n"); return NULL; @@ -1672,7 +1670,7 @@ storvsc_create_bounce_buffer(uint16_t seg_count, int write) bounce_sgl->sg_nseg = seg_count; for (i = 0; i < seg_count; i++) - bounce_sgl->sg_segs[i].ss_len = buf_len; + bounce_sgl->sg_iov[i].iov_len = buf_len; return bounce_sgl; } @@ -1691,7 +1689,7 @@ storvsc_create_bounce_buffer(uint16_t seg_count, int write) * */ static void -storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl, +storvsc_copy_sgl_to_bounce_buf(struct hv_sglist *bounce_sgl, bus_dma_segment_t *orig_sgl, unsigned int orig_sgl_count, uint64_t seg_bits) @@ -1700,11 +1698,11 @@ storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl, for (src_sgl_idx = 0; src_sgl_idx < orig_sgl_count; src_sgl_idx++) { if (seg_bits & (1 << src_sgl_idx)) { - memcpy((void*)bounce_sgl->sg_segs[src_sgl_idx].ss_paddr, + memcpy(bounce_sgl->sg_iov[src_sgl_idx].iov_base, (void*)orig_sgl[src_sgl_idx].ds_addr, orig_sgl[src_sgl_idx].ds_len); - bounce_sgl->sg_segs[src_sgl_idx].ss_len = + bounce_sgl->sg_iov[src_sgl_idx].iov_len = orig_sgl[src_sgl_idx].ds_len; } } @@ -1725,7 +1723,7 @@ storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl, void storvsc_copy_from_bounce_buf_to_sgl(bus_dma_segment_t *dest_sgl, unsigned int dest_sgl_count, - struct sglist* src_sgl, + struct hv_sglist* src_sgl, uint64_t seg_bits) { int sgl_idx = 0; @@ -1733,8 +1731,8 @@ storvsc_copy_from_bounce_buf_to_sgl(bus_dma_segment_t *dest_sgl, for (sgl_idx = 0; sgl_idx < dest_sgl_count; sgl_idx++) { if (seg_bits & (1 << sgl_idx)) { memcpy((void*)(dest_sgl[sgl_idx].ds_addr), - (void*)(src_sgl->sg_segs[sgl_idx].ss_paddr), - src_sgl->sg_segs[sgl_idx].ss_len); + src_sgl->sg_iov[sgl_idx].iov_base, + src_sgl->sg_iov[sgl_idx].iov_len); } } } @@ -2024,7 +2022,7 @@ create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp) /* transfer virtual address to physical frame number */ if (reqp->not_aligned_seg_bits & 0x1){ phys_addr = - vtophys(reqp->bounce_sgl->sg_segs[0].ss_paddr); + vtophys(reqp->bounce_sgl->sg_iov[0].iov_base); }else{ phys_addr = vtophys(storvsc_sglist[0].ds_addr); @@ -2037,7 +2035,7 @@ create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp) for (i = 1; i < storvsc_sg_count; i++) { if (reqp->not_aligned_seg_bits & (1 << i)) { phys_addr = - vtophys(reqp->bounce_sgl->sg_segs[i].ss_paddr); + vtophys(reqp->bounce_sgl->sg_iov[i].iov_base); } else { phys_addr = vtophys(storvsc_sglist[i].ds_addr);