mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-19 19:51:27 +00:00
an external module. When applying the SCST kernel patch to the mainstream kernel tree with debugging and/or tracing enabled however, the resulting code triggers a compiler error. This is because the symbols DEBUG and TRACING conflict with symbols with the same named defined in unrelated kernel headers. The patch below resolves these conflicts by renaming the following preprocessor symbols: - DEBUG into CONFIG_SCST_DEBUG. - DEBUG_DIGEST_FAILURES into CONFIG_SCST_ISCSI_DEBUG_DIGEST_FAILURES. - DEBUG_OOM into CONFIG_SCST_DEBUG_OOM. - DEBUG_RETRY into CONFIG_SCST_DEBUG_RETRY. - DEBUG_SN into CONFIG_SCST_DEBUG_SN. - DEBUG_TM into CONFIG_SCST_DEBUG_TM. - EXTRACHECKS into CONFIG_SCST_EXTRACHECKS. - SCST_HIGHMEM into CONFIG_SCST_HIGHMEM. - STRICT_SERIALIZING into CONFIG_SCST_STRICT_SERIALIZING. - TM_DBG_GO_OFFLINE into CONFIG_SCST_TM_DBG_GO_OFFLINE. Mapped 0/1 values into macro undefined / macro defined. - TRACING into CONFIG_SCST_TRACING. - USE_EXPECTED_VALUES into CONFIG_SCST_USE_EXPECTED_VALUES. - In qla_isp/linux/isp_scst.c, renamed DEBUG into DEBUG_ISP_SCST. - In qla_isp/..., renamed SCSI_TARGET in SCST_SCSI_TARGET. - In qla_isp/..., renamed SCSI_TARGET_DEV in SCST_SCSI_TARGET_DEV. Additionally, all CONFIG_SCSI_TARGET* macro's are renamed into CONFIG_SCST* in order to avoid confusion between the STGT CONFIG-symbols and the SCST CONFIG- symbols. The following additional options are now configurable through Kconfig: - CONFIG_SCST_ISCSI_DEBUG_DIGEST_FAILURES - CONFIG_SCST_STRICT_SERIALIZING - CONFIG_SCST_STRICT_SECURITY - CONFIG_SCST_ALLOW_PASSTHROUGH_IO_SUBMIT_IN_SIRQ - CONFIG_SCST_ABORT_CONSIDER_FINISHED_TASKS_AS_NOT_EXISTING - CONFIG_SCST_USE_EXPECTED_VALUES - CONFIG_SCST_DEBUG_OOM - CONFIG_SCST_DEBUG_RETRY - CONFIG_SCST_DEBUG_SN - CONFIG_SCST_DEBUG_TM - CONFIG_SCST_TM_DBG_GO_OFFLINE The patch below has been verified as follows: - Verified that the following command does not print any new warning messages: make -s clean && make -C srpt -s clean && make -s scst iscsi-scst && make -C srpt -s - Verified as follows that the internal SCST patches still apply cleanly: for p in *patch; do patch -p0 --dry-run -f -s <$p; done - Checked that the patch generated by generate-kernel-patch still applies cleanly to the 2.6.25.7 kernel, and that the patched kernel tree still compiles, installs and boots fine, that the iscsi-scst, ib_srpt, scst_disk and scst_vdisk modules still load, and that iSCSI communication still works fine. All SCST kernel configuration options that could be enabled have been enabled during this test. Signed-off-by: Bart Van Assche <bart.vanassche@gmail.com> git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@453 d57e44dd-8a1f-0410-8b47-8ef2f437770f
iSCSI SCST target driver ======================== Version 1.0.1/0.4.16r155, XX XXXX 2008 -------------------------------------- This driver is a forked with all respects version of iSCSI Enterprise Target (IET) (http://iscsitarget.sourceforge.net/) with updates to work over SCST as well as with many improvements and bugfixes (see ChangeLog file). The reason of fork is that the necessary changes are intrusive and with the current IET merge policy, where only simple bugfix-like patches, which doesn't touch the core code, could be merged, it is very unlikely that they will be merged in the main IET trunk. To let it be installed and work at the same host together with IET simultaneously all the driver's modules and files were renamed: * ietd.conf -> iscsi-scstd.conf * ietadm -> iscsi-scst-adm * ietd -> iscsi-scstd * iscsi-target -> iscsi-scst * iscsi-target.ko -> iscsi-scst.ko This version is compatible with SCST version 1.0.0 and higher. Tested on 2.6.21.1 kernel, but it should also work on other versions, starting from 2.6.16.x. Installation ------------ Basically as in README-IET, where file names are changed as specified above. Only vanilla kernels from kernel.org are supported, but it should work on vendors' kernels, if you manage to successfully compile on them. The main problem with vendor's kernels is that they often contain patches, which will appear only in the next version of the vanilla kernel, therefore it's quite hard to track such changes. Thus, if during compilation for some vendor kernel your compiler complains about redefinition of some symbol, you should either switch to vanilla kernel, or change as necessary the corresponding to that symbol "#if LINUX_VERSION_CODE" statement. If during compilation you see message like "*** No rule to make target `xxx.h', needed by `yyy.o'. Stop.", then your autogenerated dependencies don't match your compiler configuration anymore. You should run "make extraclean" to remove them. On the next compilation they will be regenerated. If you experience problems during kernel module load or running, check your system and/or kernel logs (or run dmesg command for the few most recent kernel messages). To use full power of TCP zero-copy transmit functions, especially dealing with user space supplied via scst_user module memory, iSCSI-SCST needs to be notified when Linux networking finished data transmission. Patch put_page_callback-<kernel-version>.patch provides such functionality. The corresponding version of it should be applied on your kernel. This is highly recommended, but not required. Basically, you should consider using of this patch as some optimization, which IET doesn't have, so if you don't use it, you will just revert to the original IET behavior, when for data transmission: - For in-kernel allocated memory (scst_vdisk and pass-through handlers) usage of SGV cache on transmit path (READ-type commands) will be disabled. The performance hit will be not big, but performance will still remain better, than for IET, because SGV cache will remain used on receive path while IET doesn't have such feature. - For user space allocated memory (scst_user handler) all transmitted data will be additionally copied into temporary TCP buffers. The performance hit will be quite noticeable. Note, that if your network hardware does not support TX offload functions of has them disabled, then TCP zero-copy transmit functions on your system will not be used by Linux networking in any case, so put_page_callback patch will not be able to improve performance for you. You can check your network hardware offload capabilities by command "ethtool -k ethX", where X is the network device number. At least "tx-checksumming" and "scatter-gather" should be enabled. If you have in your kernel log error messages like: iscsi-scst: ***ERROR*** net_priv isn't NULL and != ref_cmd with the corresponding kernel BUG dump, then put_page_callback patch you use isn't sufficient for your kernel. This might be because the kernel you use has some additional patches applied, which affect the functionality, which put_page_callback patch provides. For example, Fedora or Gentoo use kernels, which, although have version number like 2.6.18, are greatly differ from the "vanilla" kernel 2.6.18, maintained by Linus Torvalds for that the put_page_callback patch was created. In this case I would recommend you either: - Search net/ in your kernel source for "put_page" and "get_page" functions. If you find any in some place, except in net/sunrpc/svc.c and net/core/pktgen.c, then, most likely, you found the reason of your problem. Replace them by "net_put_page" and "net_get_page" correspondingly and try again. If the problem is solved, then please prepare a new put_page_callback patch and send it to the SCST mailing list scst-devel@lists.sourceforge.net. or - Unapply this patch and use iSCSI-SCST without it. Also report this problem to the SCST mailing list scst-devel@lists.sourceforge.net. Usage ----- See in doc/iscsi-scst-howto.txt examples how to configure iSCSI-SCST. ISCSI parameters like iSNS, CHAP and target parameters are configured in iscsi-scstd.conf. All LUN information is configured using the regular SCST interface. It is highly recommended to use scstadmin utility for that purpose. The LUN information in iscsi-scstd.conf will be ignored. This is because now responsibilities are divided (as it should be) between the target driver (iSCSI-SCST) and the SCST core as it logically should be: the target driver is responsible for handling targets and their parameters, SCST core is responsible for handling backstorage. If you need to configure different LUs for different targets you should create for each target group "Default_target_name", where "target_name" means name of the target, for example: "Default_iqn.2007-05.com.example:storage.disk1.sys1.xyz", and add there all necessary LUNs. Check SCST README file for details. Check SCST README file how to tune for the best performance. If under high load you experience I/O stalls or see in the kernel log abort or reset messages, then try to reduce QueuedCommands parameter in iscsi-scstd.conf file for the corresponding target to some lower value, like 8 (default is 32). See also SCST README file for more details about that issue. CAUTION: Working of target and initiator on the same host isn't ======== supported. See SCST README file for details. Known issues ------------ Currently iscsi-scst-adm utility is broken, hence not built. But, in contrast to IET, in iSCSI-SCST it isn't needed so much, since all devices/LUNs management is done using SCST's /proc interface, e.g. using scstadmin utility. What's remained for iscsi-scst-adm is manage of iSCSI targets and their parameters. In case of changing any negotiable iSCSI parameters renegotiation in all corresponding sessions is required by iSCSI standard, i.e. they all must be restarted, which, basically, means iSCSI-SCST restart. So, for parameters changing as well as for adding/removing targets, the recommended way is to change iscsi-scst.conf, then restart iSCSI-SCST. In contrast to IET, this operation is safe. Also, as a side effect, your iscsi-scst.conf will always be in sync with the running system. But, if you decide to fix iscsi-scst-adm, your patches will be appreciated. Compilation options ------------------- There are the following compilation options, that could be commented in/out in the kernel's module Makefile: - CONFIG_SCST_DEBUG - turns on some debugging code, including some logging. Makes the driver considerably bigger and slower, producing large amount of log data. - CONFIG_SCST_TRACING - turns on ability to log events. Makes the driver considerably bigger and leads to some performance loss. - CONFIG_SCST_EXTRACHECKS - adds extra validity checks in the various places. - CONFIG_SCST_ISCSI_DEBUG_DIGEST_FAILURES - simulates digest failures in random places. Creating version of put_page_callback patch for your kernel ----------------------------------------------------------- If you need your own version of put_page_callback patch for your custom kernel, for which there is no prepared version, you can create it yourself. This is pretty mechanical work, you don't need to understand how it works, you only need to do the following two steps: 1. Apply the closest version of put_page_callback-<kernel-version>.patch on your kernel. Resolve only failed hunks from include/ and net/core/utils.c, ignore other failures. 2. Search net/ in your kernel source for "put_page" and "get_page" functions. Replace them by "net_put_page" and "net_get_page" correspondingly. That's all. Then please send your new put_page_callback-<kernel-version>.patch to the SCST mailing list scst-devel@lists.sourceforge.net. Credits ------- Thanks to: * IET developers for IET * Ming Zhang <blackmagic02881@gmail.com> for fixes * Krzysztof Blaszkowski <kb@sysmikro.com.pl> for many fixes * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> for comments and help in debugging * Tomasz Chmielewski <mangoo@wpkg.org> for testing and suggestions * Bart Van Assche <bart.vanassche@gmail.com> for a lot of help Vladislav Bolkhovitin <vst@vlnb.net>, http://scst.sourceforge.net