From owner-svn-src-projects@freebsd.org Tue Jan 24 19:59:28 2017 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 84C00CC0B0B for ; Tue, 24 Jan 2017 19:59:28 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2121E1CAE; Tue, 24 Jan 2017 19:59:28 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v0OJxRjx090682; Tue, 24 Jan 2017 19:59:27 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v0OJxPp9090667; Tue, 24 Jan 2017 19:59:25 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201701241959.v0OJxPp9090667@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Tue, 24 Jan 2017 19:59:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r312720 - in projects/clang400-import: etc/devd lib/libc/aarch64/sys sbin/restore share/man/man4 share/man/man5 sys/amd64/linux sys/arm/freescale/imx sys/arm/ti/cpsw sys/arm64/arm64 sys... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Jan 2017 19:59:28 -0000 Author: dim Date: Tue Jan 24 19:59:25 2017 New Revision: 312720 URL: https://svnweb.freebsd.org/changeset/base/312720 Log: Merge ^/head r312624 through r312719. Added: projects/clang400-import/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu - copied unchanged from r312719, head/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_llt.c - copied unchanged from r312719, head/sys/dev/rtwn/rtl8192c/r92c_llt.c projects/clang400-import/sys/dev/rtwn/rtl8192e/ - copied from r312719, head/sys/dev/rtwn/rtl8192e/ projects/clang400-import/sys/modules/rtwnfw/rtwnrtl8192eu/ - copied from r312719, head/sys/modules/rtwnfw/rtwnrtl8192eu/ projects/clang400-import/usr.bin/truss/riscv64-freebsd.c - copied unchanged from r312719, head/usr.bin/truss/riscv64-freebsd.c Modified: projects/clang400-import/etc/devd/usb.conf projects/clang400-import/lib/libc/aarch64/sys/cerror.S projects/clang400-import/sbin/restore/restore.8 projects/clang400-import/share/man/man4/rtwn.4 projects/clang400-import/share/man/man4/rtwn_usb.4 projects/clang400-import/share/man/man4/rtwnfw.4 projects/clang400-import/share/man/man5/tmpfs.5 projects/clang400-import/sys/amd64/linux/linux_sysvec.c projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h projects/clang400-import/sys/arm64/arm64/mp_machdep.c projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c projects/clang400-import/sys/cam/ctl/ctl_frontend.h projects/clang400-import/sys/cam/ctl/ctl_frontend_cam_sim.c projects/clang400-import/sys/cam/ctl/ctl_frontend_ioctl.c projects/clang400-import/sys/cam/ctl/ctl_frontend_iscsi.c projects/clang400-import/sys/cam/ctl/ctl_tpc_local.c projects/clang400-import/sys/cam/ctl/scsi_ctl.c projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h projects/clang400-import/sys/cddl/dev/dtrace/dtrace_ioctl.c projects/clang400-import/sys/conf/files projects/clang400-import/sys/dev/ath/if_ath.c projects/clang400-import/sys/dev/ath/if_ath_tx.c projects/clang400-import/sys/dev/ath/if_ath_tx_edma.c projects/clang400-import/sys/dev/e1000/em_txrx.c projects/clang400-import/sys/dev/e1000/if_em.c projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.c projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.h projects/clang400-import/sys/dev/hyperv/netvsc/if_hn.c projects/clang400-import/sys/dev/hyperv/netvsc/if_hnreg.h projects/clang400-import/sys/dev/hyperv/netvsc/if_hnvar.h projects/clang400-import/sys/dev/mrsas/mrsas_linux.c projects/clang400-import/sys/dev/rtwn/if_rtwn.c projects/clang400-import/sys/dev/rtwn/if_rtwnvar.h projects/clang400-import/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c projects/clang400-import/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c.h projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_init.c projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_reg.h projects/clang400-import/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_beacon.c projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_fw.c projects/clang400-import/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c projects/clang400-import/sys/dev/rtwn/rtl8821a/r21a_init.c projects/clang400-import/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c projects/clang400-import/sys/dev/rtwn/usb/rtwn_usb_attach.h projects/clang400-import/sys/dev/usb/usbdevs projects/clang400-import/sys/kern/kern_switch.c projects/clang400-import/sys/kern/kern_time.c projects/clang400-import/sys/kern/subr_clock.c projects/clang400-import/sys/kern/subr_gtaskqueue.c projects/clang400-import/sys/kern/vfs_lookup.c projects/clang400-import/sys/kern/vfs_vnops.c projects/clang400-import/sys/libkern/bcd.c projects/clang400-import/sys/modules/rtwn/Makefile projects/clang400-import/sys/modules/rtwn_usb/Makefile projects/clang400-import/sys/modules/rtwnfw/Makefile projects/clang400-import/sys/net/ieee8023ad_lacp.c projects/clang400-import/sys/net/if.c projects/clang400-import/sys/net/iflib.c projects/clang400-import/sys/net80211/ieee80211.c projects/clang400-import/sys/powerpc/powerpc/db_trace.c projects/clang400-import/sys/riscv/include/frame.h projects/clang400-import/sys/riscv/riscv/trap.c projects/clang400-import/sys/sys/eventhandler.h projects/clang400-import/sys/sys/gtaskqueue.h projects/clang400-import/sys/sys/libkern.h projects/clang400-import/usr.bin/find/find.1 projects/clang400-import/usr.bin/iscsictl/iscsictl.c projects/clang400-import/usr.bin/mail/popen.c projects/clang400-import/usr.bin/mail/send.c projects/clang400-import/usr.bin/sort/radixsort.c projects/clang400-import/usr.sbin/ctladm/ctladm.8 projects/clang400-import/usr.sbin/pw/psdate.c projects/clang400-import/usr.sbin/pw/pw_user.c projects/clang400-import/usr.sbin/pw/tests/pw_usermod.sh projects/clang400-import/usr.sbin/wpa/wpa_cli/wpa_cli.8 Directory Properties: projects/clang400-import/ (props changed) projects/clang400-import/sys/cddl/contrib/opensolaris/ (props changed) Modified: projects/clang400-import/etc/devd/usb.conf ============================================================================== --- projects/clang400-import/etc/devd/usb.conf Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/etc/devd/usb.conf Tue Jan 24 19:59:25 2017 (r312720) @@ -2753,7 +2753,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x0bda"; - match "product" "(0x818a|0x8191)"; + match "product" "(0x818a|0x818b|0x8191)"; action "kldload -n if_rtwn_usb"; }; @@ -3793,7 +3793,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x1199"; - match "product" "(0x68aa|0x68c0|0x9041)"; + match "product" "(0x68aa|0x68c0|0x9041|0x9071)"; action "kldload -n u3g"; }; @@ -3905,7 +3905,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x12d1"; - match "product" "(0x1573|0x1803|0x1c05|0x1c0b)"; + match "product" "(0x1573|0x15c1|0x1803|0x1c05|0x1c0b)"; action "kldload -n u3g"; }; @@ -5025,7 +5025,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x2001"; - match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318)"; + match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318|0x3319)"; action "kldload -n if_rtwn_usb"; }; @@ -5297,7 +5297,7 @@ nomatch 32 { match "bus" "uhub[0-9]+"; match "mode" "host"; match "vendor" "0x2357"; - match "product" "0x0101"; + match "product" "(0x0101|0x0108|0x0109)"; action "kldload -n if_rtwn_usb"; }; @@ -5889,5 +5889,5 @@ nomatch 32 { action "kldload -n umass"; }; -# 2743 USB entries processed +# 2751 USB entries processed Modified: projects/clang400-import/lib/libc/aarch64/sys/cerror.S ============================================================================== --- projects/clang400-import/lib/libc/aarch64/sys/cerror.S Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/lib/libc/aarch64/sys/cerror.S Tue Jan 24 19:59:25 2017 (r312720) @@ -34,7 +34,7 @@ ENTRY(cerror) stp x0, lr, [sp] bl _C_LABEL(__error) ldp x1, lr, [sp] - str x1, [x0] + str w1, [x0] movn x0, #0 movn x1, #0 add sp, sp, #16 Modified: projects/clang400-import/sbin/restore/restore.8 ============================================================================== --- projects/clang400-import/sbin/restore/restore.8 Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sbin/restore/restore.8 Tue Jan 24 19:59:25 2017 (r312720) @@ -349,6 +349,8 @@ To prevent this, the .Fl u (unlink) flag causes restore to remove old entries before attempting to create new ones. +This flag is recommended when using extended attributes +to avoid improperly accumulating attributes on pre-existing files. .It Fl v Normally .Nm Modified: projects/clang400-import/share/man/man4/rtwn.4 ============================================================================== --- projects/clang400-import/share/man/man4/rtwn.4 Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/share/man/man4/rtwn.4 Tue Jan 24 19:59:25 2017 (r312720) @@ -18,7 +18,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 17, 2016 +.Dd January 24, 2017 .Dt RTWN 4 .Os .Sh NAME @@ -52,9 +52,9 @@ if_rtwn_usb_load="YES" The .Nm driver provides support for wireless network devices based on -the Realtek RTL8192C, RTL8188E, RTL8812A and RTL8821A programming APIs. -These APIs are used by a wide variety of chips; most chips with USB -and some with PCI interface are supported. +the Realtek RTL8192C, RTL8188E, RTL8192E, RTL8812A and RTL8821A +programming APIs. These APIs are used by a wide variety of chips; +most chips with USB and some with PCI interface are supported. .Pp To enable use for PCI/PCIe systems, see the rtwn_pci(4) driver; for USB devices, use the rtwn_usb(4) driver. @@ -98,6 +98,7 @@ when an interface is brought up: .It Pa /boot/kernel/rtwn-rtl8192cfwE.ko .It Pa /boot/kernel/rtwn-rtl8192cfwT.ko .It Pa /boot/kernel/rtwn-rtl8192cfwU.ko +.It Pa /boot/kernel/rtwn-rtl8192eufw.ko .It Pa /boot/kernel/rtwn-rtl8812aufw.ko .It Pa /boot/kernel/rtwn-rtl8821aufw.ko .El Modified: projects/clang400-import/share/man/man4/rtwn_usb.4 ============================================================================== --- projects/clang400-import/share/man/man4/rtwn_usb.4 Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/share/man/man4/rtwn_usb.4 Tue Jan 24 19:59:25 2017 (r312720) @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\"/ -.Dd January 6, 2017 +.Dd January 24, 2017 .Dt RTWN_USB 4 .Os .Sh NAME @@ -56,7 +56,7 @@ driver. .Sh HARDWARE The .Nm -driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8812AU/RTL8821AU +driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8192EU/RTL8812AU/RTL8821AU based USB wireless network adapters, including: .Pp .Bl -column -compact "Belkin F7D1102 Surf Wireless Micro" "Bus" @@ -70,6 +70,7 @@ based USB wireless network adapters, inc .It "D-Link DWA-123 rev D1" Ta USB 2.0 .It "D-Link DWA-125 rev D1" Ta USB 2.0 .It "D-Link DWA-131" Ta USB 2.0 +.It "D-Link DWA-131 rev E1" Ta USB 2.0 .It "D-Link DWA-171 rev A1" Ta USB 2.0 .It "D-Link DWA-172 rev A1" Ta USB 2.0 .It "D-Link DWA-180 rev A1" Ta USB 2.0 @@ -94,7 +95,10 @@ based USB wireless network adapters, inc .It "TP-LINK TL-WN723N v3" Ta USB 2.0 .It "TP-LINK TL-WN725N v2" Ta USB 2.0 .It "TP-LINK TL-WN821N v4" Ta USB 2.0 +.It "TP-LINK TL-WN821N v5" Ta USB 2.0 +.It "TP-LINK TL-WN822N v4" Ta USB 2.0 .It "TP-LINK TL-WN823N v1" Ta USB 2.0 +.It "TP-LINK TL-WN823N v2" Ta USB 2.0 .It "TRENDnet TEW-805UB" Ta USB 3.0 .It "ZyXEL NWD6605" Ta USB 3.0 .El Modified: projects/clang400-import/share/man/man4/rtwnfw.4 ============================================================================== --- projects/clang400-import/share/man/man4/rtwnfw.4 Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/share/man/man4/rtwnfw.4 Tue Jan 24 19:59:25 2017 (r312720) @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 28, 2015 +.Dd January 24, 2017 .Dt RTWNFW 4 .Os .Sh NAME @@ -46,6 +46,7 @@ of the following: .Cd "device rtwn-rtl8192cfwE" .Cd "device rtwn-rtl8192cfwT" .Cd "device rtwn-rtl8192cfwU" +.Cd "device rtwn-rtl8192eufw" .Cd "device rtwn-rtl8812aufw" .Cd "device rtwn-rtl8821aufw" .Ed @@ -59,6 +60,7 @@ rtwn-rtl8192cfwE_B_load="YES" rtwn-rtl8192cfwE_load="YES" rtwn-rtl8192cfwT_load="YES" rtwn-rtl8192cfwU_load="YES" +rtwn-rtl8192eufw_load="YES" rtwn-rtl8812aufw_load="YES" rtwn-rtl8821aufw_load="YES" .Ed @@ -66,8 +68,8 @@ rtwn-rtl8821aufw_load="YES" rtwn-rtl8192cfwE and rtl8192cfwE_B modules provide access to firmware sets for the Realtek RTL8188CE chip based PCIe adapters. Other modules provide access to firmware sets for the Realtek RTL8188CUS, -RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8812AU and RTL8821AU -chip based USB WiFi adapters. +RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8192EU, RTL8812AU and +RTL8821AU chip based USB WiFi adapters. They may be statically linked into the kernel, or loaded as a modules. .Pp Modified: projects/clang400-import/share/man/man5/tmpfs.5 ============================================================================== --- projects/clang400-import/share/man/man5/tmpfs.5 Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/share/man/man5/tmpfs.5 Tue Jan 24 19:59:25 2017 (r312720) @@ -54,7 +54,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 17, 2017 +.Dd January 20, 2017 .Dt TMPFS 5 .Os .Sh NAME @@ -77,7 +77,7 @@ tmpfs_load="YES" .Sh DESCRIPTION The .Nm -driver implements in-memory, or +driver implements an in-memory, or .Tn tmpfs file system. The filesystem stores both file metadata and data in main memory. @@ -85,22 +85,22 @@ This allows very fast and low latency ac The data is volatile. An umount or system reboot invalidates it. These properties make the filesystem's mounts suitable for fast -scratch storage, e.g. +scratch storage, like .Pa /tmp . .Pp If the system becomes low on memory and swap is configured (see .Xr swapon 8 ), -file data may be written to the swap space, freeing memory +the system can transfer file data to swap space, freeing memory for other needs. -The current implementation never swaps out metadata, including -the directory content. +Metadata, including the directory content, is never swapped out by the +current implementation. Keep this in mind when planning the mount limits, especially when expecting to place many small files on a tmpfs mount. .Pp -When a file from a tmpfs mount is mmaped (see -.Xr mmap 2 ) -into the process address space, the swap VM object which manages the file -pages is used to implement mapping and to avoid double-copying of +When +.Xr mmap 2 +is used on a file from a tmpfs mount, the swap VM object managing the +file pages is used to implement mapping and avoid double-copying of the file data. This quirk causes process inspection tools, like .Xr procstat 1 , @@ -120,6 +120,10 @@ Defaults to the mount point's UID. .It Cm mode Specifies the mode (in octal notation) of the root inode of the file system. Defaults to the mount point's mode. +.It Cm nonc +Do not use namecache to resolve names to files for the created mount. +This saves memory, but currently might impair scalability for highly +used mounts on large machines. .It Cm inodes Specifies the maximum number of nodes available to the file system. If not specified, the file system chooses a reasonable maximum based on Modified: projects/clang400-import/sys/amd64/linux/linux_sysvec.c ============================================================================== --- projects/clang400-import/sys/amd64/linux/linux_sysvec.c Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/amd64/linux/linux_sysvec.c Tue Jan 24 19:59:25 2017 (r312720) @@ -718,7 +718,7 @@ exec_linux_imgact_try(struct image_param { const char *head = (const char *)imgp->image_header; char *rpath; - int error = -1, len; + int error = -1; /* * The interpreter for shell scripts run from a linux binary needs @@ -736,17 +736,12 @@ exec_linux_imgact_try(struct image_param linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc), imgp->interpreter_name, UIO_SYSSPACE, &rpath, 0, AT_FDCWD); - if (rpath != NULL) { - len = strlen(rpath) + 1; - - if (len <= MAXSHELLCMDLEN) - memcpy(imgp->interpreter_name, - rpath, len); - free(rpath, M_TEMP); - } + if (rpath != NULL) + imgp->args->fname_buf = + imgp->interpreter_name = rpath; } } - return(error); + return (error); } #define LINUX_VSYSCALL_START (-10UL << 20) Modified: projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c ============================================================================== --- projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c Tue Jan 24 19:59:25 2017 (r312720) @@ -69,11 +69,18 @@ imx_wdog_cpu_reset(vm_offset_t wdcr_phys * Trigger an immediate reset by clearing the SRS bit in the watchdog * control register. The reset happens on the next cycle of the wdog * 32KHz clock, so hang out in a spin loop until the reset takes effect. + * + * Imx6 erratum ERR004346 says the SRS bit has to be cleared twice + * within the same cycle of the 32khz clock to reliably trigger the + * reset. Writing it 3 times in a row ensures at least 2 of the writes + * happen in the same 32k clock cycle. */ if ((pcr = devmap_ptov(wdcr_physaddr, sizeof(*pcr))) == NULL) { printf("cpu_reset() can't find its control register... locking up now."); } else { *pcr &= ~WDOG_CR_SRS; + *pcr &= ~WDOG_CR_SRS; + *pcr &= ~WDOG_CR_SRS; } for (;;) continue; Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c ============================================================================== --- projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c Tue Jan 24 19:59:25 2017 (r312720) @@ -1582,14 +1582,19 @@ cpsw_intr_rx(void *arg) static struct mbuf * cpsw_rx_dequeue(struct cpsw_softc *sc) { + int nsegs, port, removed; struct cpsw_cpdma_bd bd; struct cpsw_slot *last, *slot; struct cpswp_softc *psc; - struct mbuf *mb_head, *mb_tail; - int port, removed = 0; + struct mbuf *m, *m0, *mb_head, *mb_tail; + uint16_t m0_flags; + nsegs = 0; + m0 = NULL; last = NULL; - mb_head = mb_tail = NULL; + mb_head = NULL; + mb_tail = NULL; + removed = 0; /* Pull completed packets off hardware RX queue. */ while ((slot = STAILQ_FIRST(&sc->rx.active)) != NULL) { @@ -1612,10 +1617,12 @@ cpsw_rx_dequeue(struct cpsw_softc *sc) bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->mbuf_dtag, slot->dmamap); + m = slot->mbuf; + slot->mbuf = NULL; + if (bd.flags & CPDMA_BD_TDOWNCMPLT) { CPSW_DEBUGF(sc, ("RX teardown is complete")); - m_freem(slot->mbuf); - slot->mbuf = NULL; + m_freem(m); sc->rx.running = 0; sc->rx.teardown = 0; break; @@ -1627,28 +1634,36 @@ cpsw_rx_dequeue(struct cpsw_softc *sc) psc = device_get_softc(sc->port[port].dev); /* Set up mbuf */ - /* TODO: track SOP/EOP bits to assemble a full mbuf - out of received fragments. */ - slot->mbuf->m_data += bd.bufoff; - slot->mbuf->m_len = bd.buflen; + m->m_data += bd.bufoff; + m->m_len = bd.buflen; if (bd.flags & CPDMA_BD_SOP) { - slot->mbuf->m_pkthdr.len = bd.pktlen; - slot->mbuf->m_pkthdr.rcvif = psc->ifp; - slot->mbuf->m_flags |= M_PKTHDR; - } - slot->mbuf->m_next = NULL; - slot->mbuf->m_nextpkt = NULL; - if (bd.flags & CPDMA_BD_PASS_CRC) - m_adj(slot->mbuf, -ETHER_CRC_LEN); + m->m_pkthdr.len = bd.pktlen; + m->m_pkthdr.rcvif = psc->ifp; + m->m_flags |= M_PKTHDR; + m0_flags = bd.flags; + m0 = m; + } + nsegs++; + m->m_next = NULL; + m->m_nextpkt = NULL; + if (bd.flags & CPDMA_BD_EOP && m0 != NULL) { + if (m0_flags & CPDMA_BD_PASS_CRC) + m_adj(m0, -ETHER_CRC_LEN); + m0_flags = 0; + m0 = NULL; + if (nsegs > sc->rx.longest_chain) + sc->rx.longest_chain = nsegs; + nsegs = 0; + } if ((psc->ifp->if_capenable & IFCAP_RXCSUM) != 0) { /* check for valid CRC by looking into pkt_err[5:4] */ if ((bd.flags & (CPDMA_BD_SOP | CPDMA_BD_PKT_ERR_MASK)) == CPDMA_BD_SOP) { - slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; - slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID; - slot->mbuf->m_pkthdr.csum_data = 0xffff; + m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; + m->m_pkthdr.csum_flags |= CSUM_IP_VALID; + m->m_pkthdr.csum_data = 0xffff; } } @@ -1661,15 +1676,21 @@ cpsw_rx_dequeue(struct cpsw_softc *sc) } /* Add mbuf to packet list to be returned. */ - if (mb_tail) { - mb_tail->m_nextpkt = slot->mbuf; + if (mb_tail != NULL && (bd.flags & CPDMA_BD_SOP)) { + mb_tail->m_nextpkt = m; + } else if (mb_tail != NULL) { + mb_tail->m_next = m; + } else if (mb_tail == NULL && (bd.flags & CPDMA_BD_SOP) == 0) { + if (bootverbose) + printf( + "%s: %s: discanding fragment packet w/o header\n", + __func__, psc->ifp->if_xname); + m_freem(m); + continue; } else { - mb_head = slot->mbuf; + mb_head = m; } - mb_tail = slot->mbuf; - slot->mbuf = NULL; - if (sc->rx_batch > 0 && sc->rx_batch == removed) - break; + mb_tail = m; } if (removed != 0) { @@ -1960,7 +1981,8 @@ cpsw_tx_dequeue(struct cpsw_softc *sc) sc->tx.teardown = 1; } - if ((flags & CPDMA_BD_OWNER) != 0 && sc->tx.teardown == 0) + if ((flags & (CPDMA_BD_SOP | CPDMA_BD_OWNER)) == + (CPDMA_BD_SOP | CPDMA_BD_OWNER) && sc->tx.teardown == 0) break; /* Hardware is still using this packet. */ bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTWRITE); @@ -2686,9 +2708,6 @@ cpsw_add_sysctls(struct cpsw_softc *sc) SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "debug", CTLFLAG_RW, &sc->debug, 0, "Enable switch debug messages"); - SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "rx_batch", - CTLFLAG_RW, &sc->rx_batch, 0, "Set the rx batch size"); - SYSCTL_ADD_PROC(ctx, parent, OID_AUTO, "attachedSecs", CTLTYPE_UINT | CTLFLAG_RD, sc, 0, cpsw_stat_attached, "IU", "Time since driver attach"); Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h ============================================================================== --- projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h Tue Jan 24 19:59:25 2017 (r312720) @@ -89,7 +89,6 @@ struct cpsw_softc { int active_slave; int debug; int dualemac; - int rx_batch; phandle_t node; struct bintime attach_uptime; /* system uptime when attach happened. */ struct cpsw_port port[2]; Modified: projects/clang400-import/sys/arm64/arm64/mp_machdep.c ============================================================================== --- projects/clang400-import/sys/arm64/arm64/mp_machdep.c Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/arm64/arm64/mp_machdep.c Tue Jan 24 19:59:25 2017 (r312720) @@ -105,8 +105,6 @@ static void ipi_preempt(void *); static void ipi_rendezvous(void *); static void ipi_stop(void *); -static int ipi_handler(void *arg); - struct mtx ap_boot_mtx; struct pcb stoppcbs[MAXCPU]; Modified: projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts ============================================================================== --- projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts Tue Jan 24 19:59:25 2017 (r312720) @@ -50,13 +50,7 @@ }; &i2c0 { - tda998x: hdmi-encoder { - compatible = "nxp,tda998x"; - reg = <0x70>; - - pinctrl-names = "default", "off"; - pinctrl-0 = <&nxp_hdmi_bonelt_pins>; - pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>; + tda998x: tda19988 { status = "okay"; }; }; Modified: projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c ============================================================================== --- projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c Tue Jan 24 19:56:22 2017 (r312719) +++ projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c Tue Jan 24 19:59:25 2017 (r312720) @@ -1,7 +1,7 @@ /*- * Copyright (c) 2003, 2008 Silicon Graphics International Corp. * Copyright (c) 2012 The FreeBSD Foundation - * Copyright (c) 2014-2015 Alexander Motin + * Copyright (c) 2014-2017 Alexander Motin * All rights reserved. * * Portions of this software were developed by Edward Tomasz Napierala @@ -35,7 +35,7 @@ * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_backend_ramdisk.c#3 $ */ /* - * CAM Target Layer backend for a "fake" ramdisk. + * CAM Target Layer black hole and RAM disk backend. * * Author: Ken Merry */ @@ -48,9 +48,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include +#include #include #include #include @@ -71,6 +73,29 @@ __FBSDID("$FreeBSD$"); #include #include +#define PRIV(io) \ + ((struct ctl_ptr_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_BACKEND]) +#define ARGS(io) \ + ((struct ctl_lba_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN]) + +#define PPP (PAGE_SIZE / sizeof(uint8_t **)) +#ifdef __LP64__ +#define PPPS (PAGE_SHIFT - 3) +#else +#define PPPS (PAGE_SHIFT - 2) +#endif +#define SGPP (PAGE_SIZE / sizeof(struct ctl_sg_entry)) + +#define P_UNMAPPED NULL /* Page is unmapped. */ +#define P_ANCHORED ((void *)(uintptr_t)1) /* Page is anchored. */ + +typedef enum { + GP_READ, /* Return data page or zero page. */ + GP_WRITE, /* Return data page, try allocate if none. */ + GP_ANCHOR, /* Return data page, try anchor if none. */ + GP_OTHER, /* Return what present, do not allocate/anchor. */ +} getpage_op_t; + typedef enum { CTL_BE_RAMDISK_LUN_UNCONFIGURED = 0x01, CTL_BE_RAMDISK_LUN_CONFIG_ERR = 0x02, @@ -79,28 +104,29 @@ typedef enum { struct ctl_be_ramdisk_lun { struct ctl_lun_create_params params; - char lunname[32]; - uint64_t size_bytes; - uint64_t size_blocks; + char lunname[32]; + int indir; + uint8_t **pages; + uint8_t *zero_page; + struct sx page_lock; + u_int pblocksize; + u_int pblockmul; + uint64_t size_bytes; + uint64_t size_blocks; + uint64_t cap_bytes; + uint64_t cap_used; struct ctl_be_ramdisk_softc *softc; ctl_be_ramdisk_lun_flags flags; STAILQ_ENTRY(ctl_be_ramdisk_lun) links; - struct ctl_be_lun cbe_lun; - struct taskqueue *io_taskqueue; - struct task io_task; + struct ctl_be_lun cbe_lun; + struct taskqueue *io_taskqueue; + struct task io_task; STAILQ_HEAD(, ctl_io_hdr) cont_queue; - struct mtx_padalign queue_lock; + struct mtx_padalign queue_lock; }; struct ctl_be_ramdisk_softc { struct mtx lock; - int rd_size; -#ifdef CTL_RAMDISK_PAGES - uint8_t **ramdisk_pages; - int num_pages; -#else - uint8_t *ramdisk_buffer; -#endif int num_luns; STAILQ_HEAD(, ctl_be_ramdisk_lun) lun_list; }; @@ -111,8 +137,13 @@ extern struct ctl_softc *control_softc; static int ctl_backend_ramdisk_init(void); static int ctl_backend_ramdisk_shutdown(void); static int ctl_backend_ramdisk_move_done(union ctl_io *io); +static void ctl_backend_ramdisk_compare(union ctl_io *io); +static void ctl_backend_ramdisk_rw(union ctl_io *io); static int ctl_backend_ramdisk_submit(union ctl_io *io); -static void ctl_backend_ramdisk_continue(union ctl_io *io); +static void ctl_backend_ramdisk_worker(void *context, int pending); +static int ctl_backend_ramdisk_config_read(union ctl_io *io); +static int ctl_backend_ramdisk_config_write(union ctl_io *io); +static uint64_t ctl_backend_ramdisk_lun_attr(void *be_lun, const char *attrname); static int ctl_backend_ramdisk_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td); static int ctl_backend_ramdisk_rm(struct ctl_be_ramdisk_softc *softc, @@ -121,12 +152,9 @@ static int ctl_backend_ramdisk_create(st struct ctl_lun_req *req); static int ctl_backend_ramdisk_modify(struct ctl_be_ramdisk_softc *softc, struct ctl_lun_req *req); -static void ctl_backend_ramdisk_worker(void *context, int pending); static void ctl_backend_ramdisk_lun_shutdown(void *be_lun); static void ctl_backend_ramdisk_lun_config_status(void *be_lun, ctl_lun_config_status status); -static int ctl_backend_ramdisk_config_write(union ctl_io *io); -static int ctl_backend_ramdisk_config_read(union ctl_io *io); static struct ctl_backend_driver ctl_be_ramdisk_driver = { @@ -138,36 +166,21 @@ static struct ctl_backend_driver ctl_be_ .data_move_done = ctl_backend_ramdisk_move_done, .config_read = ctl_backend_ramdisk_config_read, .config_write = ctl_backend_ramdisk_config_write, - .ioctl = ctl_backend_ramdisk_ioctl + .ioctl = ctl_backend_ramdisk_ioctl, + .lun_attr = ctl_backend_ramdisk_lun_attr, }; MALLOC_DEFINE(M_RAMDISK, "ramdisk", "Memory used for CTL RAMdisk"); CTL_BACKEND_DECLARE(cbr, ctl_be_ramdisk_driver); -int +static int ctl_backend_ramdisk_init(void) { struct ctl_be_ramdisk_softc *softc = &rd_softc; -#ifdef CTL_RAMDISK_PAGES - int i; -#endif memset(softc, 0, sizeof(*softc)); mtx_init(&softc->lock, "ctlramdisk", NULL, MTX_DEF); STAILQ_INIT(&softc->lun_list); - softc->rd_size = 1024 * 1024; -#ifdef CTL_RAMDISK_PAGES - softc->num_pages = softc->rd_size / PAGE_SIZE; - softc->ramdisk_pages = (uint8_t **)malloc(sizeof(uint8_t *) * - softc->num_pages, M_RAMDISK, - M_WAITOK); - for (i = 0; i < softc->num_pages; i++) - softc->ramdisk_pages[i] = malloc(PAGE_SIZE, M_RAMDISK,M_WAITOK); -#else - softc->ramdisk_buffer = (uint8_t *)malloc(softc->rd_size, M_RAMDISK, - M_WAITOK); -#endif - return (0); } @@ -176,9 +189,6 @@ ctl_backend_ramdisk_shutdown(void) { struct ctl_be_ramdisk_softc *softc = &rd_softc; struct ctl_be_ramdisk_lun *lun, *next_lun; -#ifdef CTL_RAMDISK_PAGES - int i; -#endif mtx_lock(&softc->lock); STAILQ_FOREACH_SAFE(lun, &softc->lun_list, links, next_lun) { @@ -193,30 +203,210 @@ ctl_backend_ramdisk_shutdown(void) mtx_lock(&softc->lock); } mtx_unlock(&softc->lock); - -#ifdef CTL_RAMDISK_PAGES - for (i = 0; i < softc->num_pages; i++) - free(softc->ramdisk_pages[i], M_RAMDISK); - free(softc->ramdisk_pages, M_RAMDISK); -#else - free(softc->ramdisk_buffer, M_RAMDISK); -#endif mtx_destroy(&softc->lock); return (0); } +static uint8_t * +ctl_backend_ramdisk_getpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn, + getpage_op_t op) +{ + uint8_t **p, ***pp; + off_t i; + int s; + + if (be_lun->cap_bytes == 0) { + switch (op) { + case GP_READ: + return (be_lun->zero_page); + case GP_WRITE: + return ((uint8_t *)be_lun->pages); + case GP_ANCHOR: + return (P_ANCHORED); + default: + return (P_UNMAPPED); + } + } + if (op == GP_WRITE || op == GP_ANCHOR) { + sx_xlock(&be_lun->page_lock); + pp = &be_lun->pages; + for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { + if (*pp == NULL) { + *pp = malloc(PAGE_SIZE, M_RAMDISK, + M_WAITOK|M_ZERO); + } + i = pn >> s; + pp = (uint8_t ***)&(*pp)[i]; + pn -= i << s; + } + if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) { + if (op == GP_WRITE) { + *pp = malloc(be_lun->pblocksize, M_RAMDISK, + M_WAITOK|M_ZERO); + } else + *pp = P_ANCHORED; + be_lun->cap_used += be_lun->pblocksize; + } else if (*pp == P_ANCHORED && op == GP_WRITE) { + *pp = malloc(be_lun->pblocksize, M_RAMDISK, + M_WAITOK|M_ZERO); + } + sx_xunlock(&be_lun->page_lock); + return ((uint8_t *)*pp); + } else { + sx_slock(&be_lun->page_lock); + p = be_lun->pages; + for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { + if (p == NULL) + break; + i = pn >> s; + p = (uint8_t **)p[i]; + pn -= i << s; + } + sx_sunlock(&be_lun->page_lock); + if ((p == P_UNMAPPED || p == P_ANCHORED) && op == GP_READ) + return (be_lun->zero_page); + return ((uint8_t *)p); + } +}; + +static void +ctl_backend_ramdisk_unmappage(struct ctl_be_ramdisk_lun *be_lun, off_t pn) +{ + uint8_t ***pp; + off_t i; + int s; + + if (be_lun->cap_bytes == 0) + return; + sx_xlock(&be_lun->page_lock); + pp = &be_lun->pages; + for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { + if (*pp == NULL) + goto noindir; + i = pn >> s; + pp = (uint8_t ***)&(*pp)[i]; + pn -= i << s; + } + if (*pp == P_ANCHORED) { + be_lun->cap_used -= be_lun->pblocksize; + *pp = P_UNMAPPED; + } else if (*pp != P_UNMAPPED) { + free(*pp, M_RAMDISK); + be_lun->cap_used -= be_lun->pblocksize; + *pp = P_UNMAPPED; + } +noindir: + sx_xunlock(&be_lun->page_lock); +}; + +static void +ctl_backend_ramdisk_anchorpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn) +{ + uint8_t ***pp; + off_t i; + int s; + + if (be_lun->cap_bytes == 0) + return; + sx_xlock(&be_lun->page_lock); + pp = &be_lun->pages; + for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { + if (*pp == NULL) + goto noindir; + i = pn >> s; + pp = (uint8_t ***)&(*pp)[i]; + pn -= i << s; + } + if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) { + be_lun->cap_used += be_lun->pblocksize; + *pp = P_ANCHORED; + } else if (*pp != P_ANCHORED) { + free(*pp, M_RAMDISK); + *pp = P_ANCHORED; + } +noindir: + sx_xunlock(&be_lun->page_lock); +}; + +static void +ctl_backend_ramdisk_freeallpages(uint8_t **p, int indir) +{ + int i; + + if (p == NULL) + return; + if (indir == 0) { + free(p, M_RAMDISK); + return; + } + for (i = 0; i < PPP; i++) { + if (p[i] == NULL) + continue; + ctl_backend_ramdisk_freeallpages((uint8_t **)p[i], indir - 1); + } + free(p, M_RAMDISK); +}; + +static size_t +cmp(uint8_t *a, uint8_t *b, size_t size) +{ + size_t i; + + for (i = 0; i < size; i++) { + if (a[i] != b[i]) + break; + } + return (i); +} + +static int +ctl_backend_ramdisk_cmp(union ctl_io *io) +{ + struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); + struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun; + uint8_t *page; + uint8_t info[8]; + uint64_t lba; + u_int lbaoff, lbas, res, off; + + lbas = io->scsiio.kern_data_len / cbe_lun->blocksize; + lba = ARGS(io)->lba + PRIV(io)->len - lbas; + off = 0; + for (; lbas > 0; lbas--, lba++) { + page = ctl_backend_ramdisk_getpage(be_lun, + lba >> cbe_lun->pblockexp, GP_READ); + lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp); + page += lbaoff * cbe_lun->blocksize; + res = cmp(io->scsiio.kern_data_ptr + off, page, + cbe_lun->blocksize); + off += res; + if (res < cbe_lun->blocksize) + break; + } + if (lbas > 0) { + off += io->scsiio.kern_rel_offset - io->scsiio.kern_data_len; + scsi_u64to8b(off, info); + ctl_set_sense(&io->scsiio, /*current_error*/ 1, + /*sense_key*/ SSD_KEY_MISCOMPARE, + /*asc*/ 0x1D, /*ascq*/ 0x00, + /*type*/ SSD_ELEM_INFO, + /*size*/ sizeof(info), /*data*/ &info, + /*type*/ SSD_ELEM_NONE); + return (1); + } + return (0); +} + static int ctl_backend_ramdisk_move_done(union ctl_io *io) { - struct ctl_be_lun *cbe_lun; - struct ctl_be_ramdisk_lun *be_lun; + struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); + struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun; #ifdef CTL_TIME_IO struct bintime cur_bt; #endif CTL_DEBUG_PRINT(("ctl_backend_ramdisk_move_done\n")); - cbe_lun = CTL_BACKEND_LUN(io); - be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun->be_lun; #ifdef CTL_TIME_IO getbinuptime(&cur_bt); bintime_sub(&cur_bt, &io->io_hdr.dma_start_bt); @@ -240,7 +430,12 @@ ctl_backend_ramdisk_move_done(union ctl_ ctl_set_invalid_field_ciu(&io->scsiio); } else if ((io->io_hdr.port_status == 0) && ((io->io_hdr.status & CTL_STATUS_MASK) == CTL_STATUS_NONE)) { - if (io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer > 0) { + if (ARGS(io)->flags & CTL_LLF_COMPARE) { + /* We have data block ready for comparison. */ + if (ctl_backend_ramdisk_cmp(io)) + goto done; + } + if (ARGS(io)->len > PRIV(io)->len) { mtx_lock(&be_lun->queue_lock); STAILQ_INSERT_TAIL(&be_lun->cont_queue, &io->io_hdr, links); @@ -251,75 +446,109 @@ ctl_backend_ramdisk_move_done(union ctl_ } ctl_set_success(&io->scsiio); } +done: ctl_data_submit_done(io); return(0); } -static int -ctl_backend_ramdisk_submit(union ctl_io *io) +static void +ctl_backend_ramdisk_compare(union ctl_io *io) { - struct ctl_be_lun *cbe_lun; - struct ctl_lba_len_flags *lbalen; + struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); + u_int lbas, len; - cbe_lun = CTL_BACKEND_LUN(io); - lbalen = (struct ctl_lba_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN]; - if (lbalen->flags & CTL_LLF_VERIFY) { - ctl_set_success(&io->scsiio); - ctl_data_submit_done(io); - return (CTL_RETVAL_COMPLETE); - } - io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer = - lbalen->len * cbe_lun->blocksize; - ctl_backend_ramdisk_continue(io); - return (CTL_RETVAL_COMPLETE); + lbas = ARGS(io)->len - PRIV(io)->len; + lbas = MIN(lbas, 131072 / cbe_lun->blocksize); + len = lbas * cbe_lun->blocksize; + + io->scsiio.be_move_done = ctl_backend_ramdisk_move_done; + io->scsiio.kern_data_ptr = malloc(len, M_RAMDISK, M_WAITOK); + io->scsiio.kern_data_len = len; + io->scsiio.kern_sg_entries = 0; + io->io_hdr.flags |= CTL_FLAG_ALLOCATED; + PRIV(io)->len += lbas; +#ifdef CTL_TIME_IO + getbinuptime(&io->io_hdr.dma_start_bt); +#endif + ctl_datamove(io); } static void -ctl_backend_ramdisk_continue(union ctl_io *io) +ctl_backend_ramdisk_rw(union ctl_io *io) { - struct ctl_be_ramdisk_softc *softc; - int len, len_filled, sg_filled; -#ifdef CTL_RAMDISK_PAGES + struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); + struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun; struct ctl_sg_entry *sg_entries; - int i; -#endif - - softc = &rd_softc; - len = io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer; -#ifdef CTL_RAMDISK_PAGES - sg_filled = min(btoc(len), softc->num_pages); - if (sg_filled > 1) { + uint8_t *page; + uint64_t lba; + u_int i, len, lbaoff, lbas, sgs, off; + getpage_op_t op; + + lba = ARGS(io)->lba + PRIV(io)->len; + lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp); + lbas = ARGS(io)->len - PRIV(io)->len; + lbas = MIN(lbas, (SGPP << cbe_lun->pblockexp) - lbaoff); + sgs = (lbas + lbaoff + be_lun->pblockmul - 1) >> cbe_lun->pblockexp; + off = lbaoff * cbe_lun->blocksize; + op = (ARGS(io)->flags & CTL_LLF_WRITE) ? GP_WRITE : GP_READ; + if (sgs > 1) { io->scsiio.kern_data_ptr = malloc(sizeof(struct ctl_sg_entry) * - sg_filled, M_RAMDISK, - M_WAITOK); + sgs, M_RAMDISK, M_WAITOK); sg_entries = (struct ctl_sg_entry *)io->scsiio.kern_data_ptr; - for (i = 0, len_filled = 0; i < sg_filled; i++) { - sg_entries[i].addr = softc->ramdisk_pages[i]; - sg_entries[i].len = MIN(PAGE_SIZE, len - len_filled); - len_filled += sg_entries[i].len; + len = lbas * cbe_lun->blocksize; + for (i = 0; i < sgs; i++) { + page = ctl_backend_ramdisk_getpage(be_lun, + (lba >> cbe_lun->pblockexp) + i, op); + if (page == P_UNMAPPED || page == P_ANCHORED) { + free(io->scsiio.kern_data_ptr, M_RAMDISK); +nospc: + ctl_set_space_alloc_fail(&io->scsiio); + ctl_data_submit_done(io); + return; + } + sg_entries[i].addr = page + off; + sg_entries[i].len = MIN(len, be_lun->pblocksize - off); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***