From nobody Wed May 7 12:41:25 2025 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 4Zsvyl3tCrz5wDdV; Wed, 07 May 2025 12:41:35 +0000 (UTC) (envelope-from herbert@gojira.at) Received: from mail.bsd4all.net (mail.bsd4all.net [IPv6:2a01:4f8:13b:240c::25]) (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 ECDSA (secp384r1) client-digest SHA384) (Client CN "mail.bsd4all.net", Issuer "E6" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zsvyk37jjz3tbJ; Wed, 07 May 2025 12:41:34 +0000 (UTC) (envelope-from herbert@gojira.at) Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gojira.at header.s=mail202005 header.b=l9PxTWY8; spf=pass (mx1.freebsd.org: domain of herbert@gojira.at designates 2a01:4f8:13b:240c::25 as permitted sender) smtp.mailfrom=herbert@gojira.at; dmarc=none Date: Wed, 07 May 2025 14:41:25 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=gojira.at; s=mail202005; t=1746621686; bh=CsKm11Tqr/fvrzBATlnaZuUYJmJvyjj2NGJJAFMmneo=; h=Date:Message-ID:From:To:Cc:Subject:MIME-Version:Content-Type; b=l9PxTWY8AFMwW58hfDsEwH0a29CijzeQVMsY1dmx750ZWg07MMwTaZHxpvQcX2Mu5 hqdl8obQQSlGpezprzjRhjGeA0efuOqUE5nie+HSo1AHeJAcGG2DpvkugzPBQ0fpBc CejcX+ZIr2gcvkZGLfeOJ+Ue48o/PFMxIXUVG+OLklLAGeRI+AgfPKdUs9zaFhV9pa kHBHK7Mzse82Lrwq9zgFQBjU3lG1+EVMbxMQ1k03yc+0Ov4F+O4BRbsVXEAX/99Pb0 oZLYzBUM9j/UbU3z4YStsfMae8xBXuLc+eGcbRefIZ0xNKJERvxJVgj4zaR3hGj+aO EsCu2N4VTgolg== Message-ID: <878qn8r3t6.wl-herbert@gojira.at> From: "Herbert J. Skuhra" To: Warner Losh Cc: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: Re: git: 80b069913d49 - stable/14 - mpi3mr: Divert large WriteSame IOs to firmware if unmap and ndob bits are set In-Reply-To: <202504301721.53UHLjlw095104@gitrepo.freebsd.org> References: <202504301721.53UHLjlw095104@gitrepo.freebsd.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) Emacs/30.1 Mule/6.0 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII X-Rspamd-Queue-Id: 4Zsvyk37jjz3tbJ X-Spamd-Bar: / X-Spamd-Result: default: False [-0.52 / 15.00]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_SHORT(-0.99)[-0.994]; NEURAL_HAM_MEDIUM(-0.76)[-0.756]; NEURAL_SPAM_LONG(0.73)[0.727]; R_SPF_ALLOW(-0.20)[+ip6:2a01:4f8:13b:240c::25]; R_DKIM_ALLOW(-0.20)[gojira.at:s=mail202005]; MIME_GOOD(-0.10)[text/plain]; ARC_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:24940, ipnet:2a01:4f8::/32, country:DE]; TO_DN_SOME(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_COUNT_ZERO(0.00)[0]; DMARC_NA(0.00)[gojira.at]; FROM_EQ_ENVFROM(0.00)[]; RCPT_COUNT_THREE(0.00)[4]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MLMMJ_DEST(0.00)[dev-commits-src-all@FreeBSD.org,dev-commits-src-branches@FreeBSD.org]; DKIM_TRACE(0.00)[gojira.at:+] On Wed, 30 Apr 2025 19:21:45 +0200, Warner Losh wrote: > > The branch stable/14 has been updated by imp: > > URL: https://cgit.FreeBSD.org/src/commit/?id=80b069913d496bd73b0ea8e515b6bf3706530ea1 > > commit 80b069913d496bd73b0ea8e515b6bf3706530ea1 > Author: Chandrakanth patil > AuthorDate: 2024-06-06 08:38:52 +0000 > Commit: Warner Losh > CommitDate: 2025-04-30 17:05:52 +0000 > > mpi3mr: Divert large WriteSame IOs to firmware if unmap and ndob bits are set > > Firmware advertises the transfer lenght for writesame commands to driver during init. > So for any writesame IOs with ndob and unmap bit set and transfer lengh is greater > than the max write same length specified by the firmware, then direct those commands > to firmware instead of hardware otherwise hardware will break. > > Reviewed by: imp > Approved by: imp > Differential revision: https://reviews.freebsd.org/D44452 > > (cherry picked from commit 3f3a15543a6721100dda0e4219eb48ecbe35731a) > --- > sys/dev/mpi3mr/mpi3mr.c | 16 ++++++++++++++++ > sys/dev/mpi3mr/mpi3mr.h | 2 ++ > sys/dev/mpi3mr/mpi3mr_cam.c | 35 +++++++++++++++++++++++++++++++++++ > sys/dev/mpi3mr/mpi3mr_cam.h | 1 + > sys/modules/mpi3mr/Makefile | 3 +++ > 5 files changed, 57 insertions(+) > > diff --git a/sys/dev/mpi3mr/mpi3mr.c b/sys/dev/mpi3mr/mpi3mr.c > index 03fea4bdfcc7..a7bc459c1db8 100644 > --- a/sys/dev/mpi3mr/mpi3mr.c > +++ b/sys/dev/mpi3mr/mpi3mr.c > @@ -2177,6 +2177,8 @@ static int mpi3mr_issue_iocinit(struct mpi3mr_softc *sc) > time_in_msec = (now.tv_sec * 1000 + now.tv_usec/1000); > iocinit_req.TimeStamp = htole64(time_in_msec); > > + iocinit_req.MsgFlags |= MPI3_IOCINIT_MSGFLAGS_WRITESAMEDIVERT_SUPPORTED; > + > init_completion(&sc->init_cmds.completion); > retval = mpi3mr_submit_admin_cmd(sc, &iocinit_req, > sizeof(iocinit_req)); > @@ -3340,6 +3342,19 @@ void mpi3mr_update_device(struct mpi3mr_softc *sc, > break; > } > > + switch (flags & MPI3_DEVICE0_FLAGS_MAX_WRITE_SAME_MASK) { > + case MPI3_DEVICE0_FLAGS_MAX_WRITE_SAME_256_LB: > + tgtdev->ws_len = 256; > + break; > + case MPI3_DEVICE0_FLAGS_MAX_WRITE_SAME_2048_LB: > + tgtdev->ws_len = 2048; > + break; > + case MPI3_DEVICE0_FLAGS_MAX_WRITE_SAME_NO_LIMIT: > + default: > + tgtdev->ws_len = 0; > + break; > + } > + > switch (tgtdev->dev_type) { > case MPI3_DEVICE_DEVFORM_SAS_SATA: > { > @@ -5649,6 +5664,7 @@ static void mpi3mr_invalidate_devhandles(struct mpi3mr_softc *sc) > target->io_throttle_enabled = 0; > target->io_divert = 0; > target->throttle_group = NULL; > + target->ws_len = 0; > } > } > mtx_unlock_spin(&sc->target_lock); > diff --git a/sys/dev/mpi3mr/mpi3mr.h b/sys/dev/mpi3mr/mpi3mr.h > index 2f91b0b702dd..fa50ed035fc2 100644 > --- a/sys/dev/mpi3mr/mpi3mr.h > +++ b/sys/dev/mpi3mr/mpi3mr.h > @@ -232,6 +232,8 @@ extern char fmt_os_ver[16]; > > #define MPI3MR_PERIODIC_DELAY 1 /* 1 second heartbeat/watchdog check */ > > +#define WRITE_SAME_32 0x0d > + > struct completion { > unsigned int done; > struct mtx lock; > diff --git a/sys/dev/mpi3mr/mpi3mr_cam.c b/sys/dev/mpi3mr/mpi3mr_cam.c > index d4cb7e9265dd..dca194a5c8cd 100644 > --- a/sys/dev/mpi3mr/mpi3mr_cam.c > +++ b/sys/dev/mpi3mr/mpi3mr_cam.c > @@ -83,6 +83,7 @@ > #include "mpi3mr.h" > #include /* XXX for pcpu.h */ > #include /* XXX for PCPU_GET */ > +#include > > #define smp_processor_id() PCPU_GET(cpuid) > > @@ -102,6 +103,37 @@ extern void mpi3mr_add_sg_single(void *paddr, U8 flags, U32 length, > > static U32 event_count; > > +static > +inline void mpi3mr_divert_ws(Mpi3SCSIIORequest_t *req, > + struct ccb_scsiio *csio, > + U16 ws_len) > +{ > + U8 unmap = 0, ndob = 0; > + U32 num_blocks = 0; > + U8 opcode = scsiio_cdb_ptr(csio)[0]; > + U16 service_action = ((scsiio_cdb_ptr(csio)[8] << 8) | scsiio_cdb_ptr(csio)[9]); > + > + > + if (opcode == WRITE_SAME_16 || > + (opcode == VARIABLE_LEN_CDB && > + service_action == WRITE_SAME_32)) { > + > + int unmap_ndob_index = (opcode == WRITE_SAME_16) ? 1 : 10; > + > + unmap = scsiio_cdb_ptr(csio)[unmap_ndob_index] & 0x08; > + ndob = scsiio_cdb_ptr(csio)[unmap_ndob_index] & 0x01; > + num_blocks = get_unaligned_be32(scsiio_cdb_ptr(csio) + > + ((opcode == WRITE_SAME_16) ? 10 : 28)); > + > + /* Check conditions for diversion to firmware */ > + if (unmap && ndob && num_blocks > ws_len) { > + req->MsgFlags |= MPI3_SCSIIO_MSGFLAGS_DIVERT_TO_FIRMWARE; > + req->Flags = htole32(le32toh(req->Flags) | > + MPI3_SCSIIO_FLAGS_DIVERT_REASON_WRITE_SAME_TOO_LARGE); > + } > + } > +} > + > static void mpi3mr_prepare_sgls(void *arg, > bus_dma_segment_t *segs, int nsegs, int error) > { > @@ -1080,6 +1112,9 @@ mpi3mr_action_scsiio(struct mpi3mr_cam_softc *cam_sc, union ccb *ccb) > break; > } > > + if (targ->ws_len) > + mpi3mr_divert_ws(req, csio, targ->ws_len); > + > req->Flags = htole32(mpi_control); > > if (csio->ccb_h.flags & CAM_CDB_POINTER) > diff --git a/sys/dev/mpi3mr/mpi3mr_cam.h b/sys/dev/mpi3mr/mpi3mr_cam.h > index 3a0526217f86..115ce0c4b8d7 100644 > --- a/sys/dev/mpi3mr/mpi3mr_cam.h > +++ b/sys/dev/mpi3mr/mpi3mr_cam.h > @@ -121,6 +121,7 @@ struct mpi3mr_target { > struct mpi3mr_throttle_group_info *throttle_group; > uint64_t q_depth; > enum mpi3mr_target_state state; > + uint16_t ws_len; > }; > > struct mpi3mr_cam_softc { > diff --git a/sys/modules/mpi3mr/Makefile b/sys/modules/mpi3mr/Makefile > index 3f1f63a94ac3..39aa2e3f0ddd 100644 > --- a/sys/modules/mpi3mr/Makefile > +++ b/sys/modules/mpi3mr/Makefile > @@ -6,6 +6,9 @@ SRCS= mpi3mr_pci.c mpi3mr.c mpi3mr_cam.c mpi3mr_app.c > SRCS+= opt_cam.h > SRCS+= device_if.h bus_if.h pci_if.h > > +CFLAGS+= -I${SRCTOP}/sys/compat/linuxkpi/common/include > +DEBUG_FLAGS= -g ^^^^^^^^^^^^^^^^ > + > .include > > CWARNFLAGS.mpi3mr_sas.c= ${NO_WUNNEEDED_INTERNAL_DECL} https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=249068#c2 -- Herbert