From nobody Wed May 11 21:04:37 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 C58611AE632D; Wed, 11 May 2022 21:04:37 +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 4Kz6q93k8pz4vPG; Wed, 11 May 2022 21:04:37 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652303077; 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=Lq+lPlgZis8NUxHsiY5LyzlZHnjyrUju2g2+nzDlOes=; b=ts9mkJ3W5lC2RqhUaCgwu3HqPmEoa+Lbi2n1Um7Sxahujrxq9jJG7GSlLOS+33Ei+qrnsX Hm0oUsRBcCl3b6lwr/TVpnvcgQamNSPfObI/TXzJ9EVOBSMaq5Lri+fakSqHzI95mCU9PA KDJs8VeUO9/CgM8LCdjumWdR/zx+BRN0eplOaY9OD2Jj3yIZY3tA0r6DD+Egdc7X6nC7hX TRpxkg1Lai/CCIUzXYjP3p/IcT1VOrqh9mdaMbOdlonUkyjCA/aeh8Sp3HKqoPAQ+iow0o Xlj4mng0AYgJ+wPDAllJThNal03R45E72jHk2TyWddy4SLFH9QsxaZ/i55s18Q== 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 2D7EB20F6C; Wed, 11 May 2022 21:04:37 +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 24BL4bq5025686; Wed, 11 May 2022 21:04:37 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24BL4b1m025685; Wed, 11 May 2022 21:04:37 GMT (envelope-from git) Date: Wed, 11 May 2022 21:04:37 GMT Message-Id: <202205112104.24BL4b1m025685@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 156e41c4b772 - stable/13 - iscsi: Handle unmapped I/O requests. 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/stable/13 X-Git-Reftype: branch X-Git-Commit: 156e41c4b772c80c0ab5f36fced54072d3dd70d8 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652303077; 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=Lq+lPlgZis8NUxHsiY5LyzlZHnjyrUju2g2+nzDlOes=; b=dsS9TeN3p2uhwO3Hr6lWiJ3RgRwYEemXt+45nVtMUiLYGwcyeNfsCmAK8xW71r6jnLaQ9k 1+ubCizFFDSOJa+Yaz0D4ZQPbaRBaXsqqjV1Q7V4kA5hVbM6Gs5PS4pWkZRnU7njYwnlXB 58ISEeEYrCEzraKhLmz6ecqjzXNKT/rUIcNnXdaZ1iP5GuXbk1xbIbEM5RSBSmPgE8PrH7 5aBU+TsBGIEqjs2RmK5VDVPgM0Ve8PMkxOUGNuxCyv6Es4PxMMIy/7q3QL2zKBuPtPRBeE 4s2E40ZqoD5+a3OBcXRlypeYo4fHF7gPq88nC24zAhm0IDPbh6Q5+XwICuIGUA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1652303077; a=rsa-sha256; cv=none; b=Y1YLMU54JmeiZam/+SantJ6HIsj0E1Bkv7RaJC4PvnEdC7JaeAi7OY8vrZSHaNnhnZGL0M TunY8WD0CXmUSVs9RlrFyykOSYIx9I8QB8PKeGf8q8m6i1hiRLUeEF/G6Iijkxd7Qlaclr KBaXpy7Ty4TBk+GcTkxLpLIMM0lKw7QUiUS3cp0bCKpR7CYRBGmn3uKdot9B7Ny4if0hTK o5SFuX/O5MF76o7O+iXIlFBq67Kf0cvORhDrr3aUbEThh9d7okv3yztg1BOlO+po4qBKnP XWljv82iK7gCGm59pbeJwf4eHPkFiUikpRrHTnhWcSRWEtxtp/HcdoIY67WiDg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=156e41c4b772c80c0ab5f36fced54072d3dd70d8 commit 156e41c4b772c80c0ab5f36fced54072d3dd70d8 Author: John Baldwin AuthorDate: 2022-03-10 23:49:53 +0000 Commit: John Baldwin CommitDate: 2022-05-11 20:52:17 +0000 iscsi: Handle unmapped I/O requests. Don't assume that csio->data_ptr is pointer to a data buffer that can be passed to icl_get_pdu_data and icl_append_data. For unmapped I/O requests, csio->data_ptr is instead a pointer to a struct bio as indicated by CAM_DATA_BIO. To support these requests, add icl_pdu_append_bio and icl_pdu_get_bio methods which pass a pointer to the bio and an offset and length relative to the bio's buffer. Note that only backends supporting unmapped requests need to implement these hooks. Implement simple no-op hooks for the iser backend. Reviewed by: mav Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D34382 (cherry picked from commit 7aab9c14a462e0871394bbc4e276affb79c8d173) --- sys/dev/iscsi/icl_conn_if.m | 19 +++++++++++++++++++ sys/dev/iscsi/icl_wrappers.h | 18 ++++++++++++++++++ sys/dev/iscsi/iscsi.c | 41 ++++++++++++++++++++++++++++++++++++++--- sys/dev/iser/icl_iser.c | 24 ++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 3 deletions(-) diff --git a/sys/dev/iscsi/icl_conn_if.m b/sys/dev/iscsi/icl_conn_if.m index e46b8cdc20dc..1b424b0b0f31 100644 --- a/sys/dev/iscsi/icl_conn_if.m +++ b/sys/dev/iscsi/icl_conn_if.m @@ -30,6 +30,7 @@ # $FreeBSD$ # +#include #include #include @@ -50,6 +51,15 @@ METHOD size_t pdu_data_segment_length { const struct icl_pdu *_ip; }; +METHOD int pdu_append_bio { + struct icl_conn *_ic; + struct icl_pdu *_ip; + struct bio *_bp; + size_t _offset; + size_t _len; + int _flags; +}; + METHOD int pdu_append_data { struct icl_conn *_ic; struct icl_pdu *_ip; @@ -58,6 +68,15 @@ METHOD int pdu_append_data { int _flags; }; +METHOD void pdu_get_bio { + struct icl_conn *_ic; + struct icl_pdu *_ip; + size_t _pdu_off; + struct bio *_bp; + size_t _bio_off; + size_t _len; +}; + METHOD void pdu_get_data { struct icl_conn *_ic; struct icl_pdu *_ip; diff --git a/sys/dev/iscsi/icl_wrappers.h b/sys/dev/iscsi/icl_wrappers.h index cc37771c7dba..c2f215c10607 100644 --- a/sys/dev/iscsi/icl_wrappers.h +++ b/sys/dev/iscsi/icl_wrappers.h @@ -38,6 +38,7 @@ #ifndef ICL_WRAPPERS_H #define ICL_WRAPPERS_H +#include #include #include @@ -57,6 +58,15 @@ icl_pdu_data_segment_length(const struct icl_pdu *ip) return (ICL_CONN_PDU_DATA_SEGMENT_LENGTH(ip->ip_conn, ip)); } +static inline int +icl_pdu_append_bio(struct icl_pdu *ip, struct bio *bp, size_t offset, + size_t len, int flags) +{ + + return (ICL_CONN_PDU_APPEND_BIO(ip->ip_conn, ip, bp, offset, len, + flags)); +} + static inline int icl_pdu_append_data(struct icl_pdu *ip, const void *addr, size_t len, int flags) { @@ -64,6 +74,14 @@ icl_pdu_append_data(struct icl_pdu *ip, const void *addr, size_t len, int flags) return (ICL_CONN_PDU_APPEND_DATA(ip->ip_conn, ip, addr, len, flags)); } +static inline void +icl_pdu_get_bio(struct icl_pdu *ip, size_t pdu_off, struct bio *bp, + size_t bio_off, size_t len) +{ + + ICL_CONN_PDU_GET_BIO(ip->ip_conn, ip, pdu_off, bp, bio_off, len); +} + static inline void icl_pdu_get_data(struct icl_pdu *ip, size_t off, void *addr, size_t len) { diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c index 155faa0910e4..e4bfb6a353d2 100644 --- a/sys/dev/iscsi/iscsi.c +++ b/sys/dev/iscsi/iscsi.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -1059,6 +1060,24 @@ iscsi_pdu_handle_task_response(struct icl_pdu *response) icl_pdu_free(response); } +static void +iscsi_pdu_get_data_csio(struct icl_pdu *response, size_t pdu_offset, + struct ccb_scsiio *csio, size_t oreceived, size_t data_segment_len) +{ + switch (csio->ccb_h.flags & CAM_DATA_MASK) { + case CAM_DATA_BIO: + icl_pdu_get_bio(response, pdu_offset, + (struct bio *)csio->data_ptr, oreceived, data_segment_len); + break; + case CAM_DATA_VADDR: + icl_pdu_get_data(response, pdu_offset, + csio->data_ptr + oreceived, data_segment_len); + break; + default: + __assert_unreachable(); + } +} + static void iscsi_pdu_handle_data_in(struct icl_pdu *response) { @@ -1137,7 +1156,7 @@ iscsi_pdu_handle_data_in(struct icl_pdu *response) iscsi_outstanding_remove(is, io); ISCSI_SESSION_UNLOCK(is); - icl_pdu_get_data(response, 0, csio->data_ptr + oreceived, data_segment_len); + iscsi_pdu_get_data_csio(response, 0, csio, oreceived, data_segment_len); /* * XXX: Check F. @@ -1188,6 +1207,22 @@ iscsi_pdu_handle_logout_response(struct icl_pdu *response) icl_pdu_free(response); } +static int +iscsi_pdu_append_data_csio(struct icl_pdu *request, struct ccb_scsiio *csio, + size_t off, size_t len, int how) +{ + switch (csio->ccb_h.flags & CAM_DATA_MASK) { + case CAM_DATA_BIO: + return (icl_pdu_append_bio(request, + (struct bio *)csio->data_ptr, off, len, how)); + case CAM_DATA_VADDR: + return (icl_pdu_append_data(request, csio->data_ptr + off, len, + how)); + default: + __assert_unreachable(); + } +} + static void iscsi_pdu_handle_r2t(struct icl_pdu *response) { @@ -1282,7 +1317,7 @@ iscsi_pdu_handle_r2t(struct icl_pdu *response) bhsr2t->bhsr2t_target_transfer_tag; bhsdo->bhsdo_datasn = htonl(datasn); bhsdo->bhsdo_buffer_offset = htonl(off); - error = icl_pdu_append_data(request, csio->data_ptr + off, len, + error = iscsi_pdu_append_data_csio(request, csio, off, len, M_NOWAIT | ICL_NOCOPY); if (error != 0) { ISCSI_SESSION_WARN(is, "failed to allocate memory; " @@ -2387,7 +2422,7 @@ iscsi_action_scsiio(struct iscsi_session *is, union ccb *ccb) len = is->is_conn->ic_max_send_data_segment_length; } - error = icl_pdu_append_data(request, csio->data_ptr, len, + error = iscsi_pdu_append_data_csio(request, csio, 0, len, M_NOWAIT | ICL_NOCOPY); if (error != 0) { iscsi_outstanding_remove(is, io); diff --git a/sys/dev/iser/icl_iser.c b/sys/dev/iser/icl_iser.c index 2c2514a1422b..140b5622385d 100644 --- a/sys/dev/iser/icl_iser.c +++ b/sys/dev/iser/icl_iser.c @@ -43,6 +43,7 @@ static void iser_conn_release(struct icl_conn *ic); static icl_conn_new_pdu_t iser_conn_new_pdu; static icl_conn_pdu_free_t iser_conn_pdu_free; static icl_conn_pdu_data_segment_length_t iser_conn_pdu_data_segment_length; +static icl_conn_pdu_append_bio_t iser_conn_pdu_append_bio; static icl_conn_pdu_append_data_t iser_conn_pdu_append_data; static icl_conn_pdu_queue_t iser_conn_pdu_queue; static icl_conn_handoff_t iser_conn_handoff; @@ -51,12 +52,14 @@ static icl_conn_close_t iser_conn_close; static icl_conn_connect_t iser_conn_connect; static icl_conn_task_setup_t iser_conn_task_setup; static icl_conn_task_done_t iser_conn_task_done; +static icl_conn_pdu_get_bio_t iser_conn_pdu_get_bio; static icl_conn_pdu_get_data_t iser_conn_pdu_get_data; static kobj_method_t icl_iser_methods[] = { KOBJMETHOD(icl_conn_new_pdu, iser_conn_new_pdu), KOBJMETHOD(icl_conn_pdu_free, iser_conn_pdu_free), KOBJMETHOD(icl_conn_pdu_data_segment_length, iser_conn_pdu_data_segment_length), + KOBJMETHOD(icl_conn_pdu_append_bio, iser_conn_pdu_append_bio), KOBJMETHOD(icl_conn_pdu_append_data, iser_conn_pdu_append_data), KOBJMETHOD(icl_conn_pdu_queue, iser_conn_pdu_queue), KOBJMETHOD(icl_conn_handoff, iser_conn_handoff), @@ -65,6 +68,7 @@ static kobj_method_t icl_iser_methods[] = { KOBJMETHOD(icl_conn_connect, iser_conn_connect), KOBJMETHOD(icl_conn_task_setup, iser_conn_task_setup), KOBJMETHOD(icl_conn_task_done, iser_conn_task_done), + KOBJMETHOD(icl_conn_pdu_get_bio, iser_conn_pdu_get_bio), KOBJMETHOD(icl_conn_pdu_get_data, iser_conn_pdu_get_data), { 0, 0 } }; @@ -108,6 +112,18 @@ out: return (ret); } +int +iser_conn_pdu_append_bio(struct icl_conn *ic, struct icl_pdu *request, + struct bio *bp, size_t offset, size_t len, int flags) +{ + MPASS(!((request->ip_bhs->bhs_opcode & ISCSI_OPCODE_MASK) == + ISCSI_BHS_OPCODE_LOGIN_REQUEST || + (request->ip_bhs->bhs_opcode & ISCSI_OPCODE_MASK) == + ISCSI_BHS_OPCODE_TEXT_REQUEST)); + + return (0); +} + int iser_conn_pdu_append_data(struct icl_conn *ic, struct icl_pdu *request, const void *addr, size_t len, int flags) @@ -126,6 +142,14 @@ iser_conn_pdu_append_data(struct icl_conn *ic, struct icl_pdu *request, return (0); } +void +iser_conn_pdu_get_bio(struct icl_conn *ic, struct icl_pdu *ip, + size_t pdu_off, struct bio *bp, size_t bio_off, + size_t len) +{ + MPASS(ip->ip_data_mbuf == NULL); +} + void iser_conn_pdu_get_data(struct icl_conn *ic, struct icl_pdu *ip, size_t off, void *addr, size_t len)