From nobody Thu Mar 10 23:51:27 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 2308B19FB307; Thu, 10 Mar 2022 23:51:28 +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 4KF5SH6CxBz3lNm; Thu, 10 Mar 2022 23:51:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646956287; 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=Vvmf+xxVaAyKCkzz+aZihjvunT0iWNMfgFGJOB2joNk=; b=jCVcMVC0rqkurbfFpMeZhxE3AGyoaVaRHrBoS/9X/h8tvG/RJi2Io5i290YdHPnrlTxG6T T7tzHGMWB3JyfL4n4WtNqc6G4no32LYe8J96KwdSuIYlXws+QJULQINXpweDxOAdXV1z+C HrZQ4CO2gUxXq7g/Z72mxGTD9h7+F0/9dLJkmvbrvvDKMfvF3qVGvSQv7oSDP0VGkkGuZL hVgVMsh49h5CoHWwLDuUpz2l0e/TvgnZ5ZyVdhmXhkQa7yMiWDS7l4koKT02Wfs/0K35J/ gr2Ge+I3AogvVX7VVoVR4NWJLWULiRjhqWjGqbQM3TDreqzGv3j15UwXBXlObg== 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 981636826; Thu, 10 Mar 2022 23:51:27 +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 22ANpRDg036918; Thu, 10 Mar 2022 23:51:27 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22ANpRDt036917; Thu, 10 Mar 2022 23:51:27 GMT (envelope-from git) Date: Thu, 10 Mar 2022 23:51:27 GMT Message-Id: <202203102351.22ANpRDt036917@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: 7aab9c14a462 - main - 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/main X-Git-Reftype: branch X-Git-Commit: 7aab9c14a462e0871394bbc4e276affb79c8d173 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646956287; 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=Vvmf+xxVaAyKCkzz+aZihjvunT0iWNMfgFGJOB2joNk=; b=oNMN/naQH8bmKCGtQq+6YSDEBX8EqahI+Bfwh6NyHXTTu7cn99cVMdTGprEr2D2EUHssyo RhAzNFoKdqPCYYfliXPRxTsm5+Ad/fZR7FeQ4+5Uw+8o1V0eMq7t4gSDF71Wi9E0GVer6a q7VyrVs3q35fwkiIDA8VJNEqmIFS6MpVlKIhIZILN/V9XK9lv3a1mU5hdZAxeToY4XqnMP p7LPa7tZeBDS8ftJrGSAk/h/1A2qRzUJlCeAOhbvSnQ+0F/spPRtCK1htxdZHOq3FY9gxC Pv4KZQcAfv3Oq7v0ndjsEFD4p8SK3kgyw5UpDzfIuIcgD2diuP3tDg38SkP15Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1646956287; a=rsa-sha256; cv=none; b=M558Gfn9dnsV2Bf1bXv1w1+8iYFi1Yt5b/B4RICKUrreAUpGUXZnk6f7LA3dZdpwbyWwKy W430T7oL9jRyYxyjv2YPSq4G+H28jLq2S9izJTMW1dTQwpbWftrIsNmZBDoNZc/IpWtURE 5HIwU3BcwWZvI7SCIH5supbIpVx2vRhf7DprbcvO9XcckLAN8MhBxb4JaGGBBj3PjeYIhi qIEJQ5Zox0mkAKmeNckJlAp5PjkEyz+a0rTjjoiPkC0utWyDHjsPXOB6lDBeJu6CAHpX4m L9BG2JegnMrIPlbx+I75ic/VxjAI8xqfmQ7DrrbEouAXql5tfwEL4ZDMuKjxTA== 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=7aab9c14a462e0871394bbc4e276affb79c8d173 commit 7aab9c14a462e0871394bbc4e276affb79c8d173 Author: John Baldwin AuthorDate: 2022-03-10 23:49:53 +0000 Commit: John Baldwin CommitDate: 2022-03-10 23:49:53 +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 --- 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 24f805f46362..fa244ba515ff 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 515410b40045..df209380a476 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 7ac600efdddc..e96d2d455d8d 100644 --- a/sys/dev/iscsi/iscsi.c +++ b/sys/dev/iscsi/iscsi.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -1085,6 +1086,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) { @@ -1163,7 +1182,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. @@ -1214,6 +1233,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) { @@ -1308,7 +1343,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; " @@ -2427,7 +2462,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)