summaryrefslogtreecommitdiffstats
path: root/sys/rpc
Commit message (Collapse)AuthorAgeFilesLines
* Add facility to stop all userspace processes. The supposed use of thekib2014-12-131-1/+2
| | | | | | | | | | | | | | | | | | | | | feature is to quisce the system before suspend. Stop is implemented by reusing the thread_single(9) with the special mode SINGLE_ALLPROC. SINGLE_ALLPROC differs from the existing single-threading modes by allowing (requiring) caller to operate on other process. Interruptible sleeps for !TDF_SBDRY threads are suspended like SIGSTOP does it, instead of aborting the sleep, like SINGLE_NO_EXIT, to avoid spurious EINTRs on resume. Provide debugging sysctl debug.stop_all_proc, which causes total stop and suspends syncer, while waiting for variable reset for resume. It is used for debugging; should be removed after the real use of the interface is added. In collaboration with: pho Discussed with: avg Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
* Current reaction of the nfsd worker threads to any signal is exit.kib2014-12-081-4/+16
| | | | | | | | | This is not correct at least for the stop requests. Check for stop conditions and suspend threads if requested. Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week
* In preparation of merging projects/sendfile, transform bare access toglebius2014-11-122-3/+3
| | | | | | | | | | | | sb_cc member of struct sockbuf to a couple of inline functions: sbavail() and sbused() Right now they are equal, but once notion of "not ready socket buffer data", will be checked in, they are going to be different. Sponsored by: Netflix Sponsored by: Nginx, Inc.
* Merge the NFSv4.1 server code in projects/nfsv4.1-server overrmacklem2014-07-014-1/+632
| | | | | | | | | into head. The code is not believed to have any effect on the semantics of non-NFSv4.1 server behaviour. It is a rather large merge, but I am hoping that there will not be any regressions for the NFS server. MFC after: 1 month
* Fix race in r267221.mav2014-06-091-2/+4
| | | | MFC after: 2 weeks
* Split RPC pool threads into number of smaller semi-isolated groups.mav2014-06-083-182/+250
| | | | | | | | | | | | | | Old design with unified thread pool was good from the point of thread utilization. But single pool-wide mutex became huge congestion point for systems with many CPUs. To reduce the congestion create several thread groups within a pool (one group for every 6 CPUs and 12 threads), each group with own mutex. Each connection during its registration is assigned to one of the groups in round-robin fashion. File affinify code may still move requests between the groups, but otherwise groups are self-contained. MFC after: 2 weeks Sponsored by: iXsystems, Inc.
* Remove st_idle variable, duplicating st_xprt.mav2014-06-082-6/+1
| | | | MFC after: 2 weeks
* Introduce new per-thread lock to protect the list of requests.mav2014-06-082-78/+54
| | | | | | | This allows to slightly simplify svc_run_internal() code: if we processed all the requests in a queue, then we know that new one will not appear. MFC after: 2 weeks
* Properly free resources in case of error.brueffer2014-05-021-7/+5
| | | | | | CID: 1007032 Found with: Coverity Prevent(tm) MFC after: 2 weeks
* Fix lock acquisition in case no request space available, missed in r260097.mav2014-02-041-1/+1
| | | | MFC after: 3 days
* Don't expose svc_loss_reg / _unreg to userland as they're kernel-onlypeter2014-01-081-0/+2
| | | | additions from r260229 and the SVCPOOL type doesn't exist in userland.
* Fix NULL dereference panic on UDP requests introduced in r260229.mav2014-01-061-1/+1
|
* Replace locks added in r260229 to protect sequence counters with atomics.mav2014-01-042-15/+9
| | | | | | | | | | | New algorithm does not create additional lock congestion, while some races it includes should not be a problem. Those races may keep requests in DRC cache for some more time by returning ACK position smaller then actual, but it still should be able to drop thems when proper ACK finally read. Races of the original algorithm based on TCP seq number were worse because they happened when reply sequence number were recorded. After that even correctly read ACKs could not clean DRC sometimes.
* Rework NFS Duplicate Request Cache cleanup logic.mav2014-01-034-20/+148
| | | | | | | | | | | | | | | | | | | | | | | | | | | | - Introduce additional hash to group requests by hash of sockref. This allows to process TCP acknowledgements without looping though all the cache, and as result allows to do it every time. - Indroduce additional callbacks to notify application layer about sockets disconnection. Without this last few requests processed just before socket disconnection never processed their ACKs and stuck in cache for many hours. - Implement transport-specific method for tracking reply acknowledgements. New implementation does not cross multiple stack layers to get the data and does not have race conditions that previously made some requests stuck in cache. This could be done more efficiently at sockbuf layer, but that would broke some KBIs, while I don't know other consumers for it aside NFS. - Instead of traversing all DRC twice per request, run cleaning only once per request, and except in some conditions traverse only single hash slot at a time. Together this limits NFS DRC growth only to situations of real connectivity problems. If network is working well, and so all replies are acknowledged, cache remains almost empty even after hours of heavy load. Without this change on the same test cache was growing to many thousand requests even with perfectly working local network. As another result this reduces CPU time spent on the DRC handling during SPEC NFS benchmark from about 10% to 0.5%. Sponsored by: iXsystems, Inc.
* Move most of NFS file handle affinity code out of the heavily congestedmav2013-12-302-53/+54
| | | | | | global RPC thread pool lock and protect it with own set of locks. On synthetic benchmarks this improves peak NFS request rate by 40%.
* Introduce xprt_inactive_self() -- variant for use when sure that portmav2013-12-294-11/+25
| | | | | is assigned to thread. For example, withing receive handlers. In that case the function reduces to single assignment and can avoid locking.
* In addition to r259632 completely block receive upcalls if we have moremav2013-12-291-1/+9
| | | | data than we need. This reduces lock pressure from xprt_active() side.
* Move a static const variable to the #if 0 part where it is only used.dim2013-12-241-1/+1
| | | | | | | (Note the #if 0 part has been inactive since the initial commit, r177633, so maybe it should be removed altogether). MFC after: 3 days
* Remove some unused static const strings under sys/rpc, which have neverdim2013-12-242-7/+0
| | | | | | been used since the initial commit (r177633). MFC after: 3 days
* Fix a bug introduced at r259632, triggering infinite loop in some cases.mav2013-12-241-4/+7
|
* Fix build.glebius2013-12-201-3/+3
|
* Remove several linear list traversals per request from RPC server code.mav2013-12-202-41/+46
| | | | | | | | | | | Do not insert active ports into pool->sp_active list if they are success- fully assigned to some thread. This makes that list include only ports that really require attention, and so traversal can be reduced to simple taking the first one. Remove idle thread from pool->sp_idlethreads list when assigning some work (port of requests) to it. That again makes possible to replace list traversals with simple taking the first element.
* Rework flow control for connection-oriented (TCP) RPC server.mav2013-12-191-128/+115
| | | | | | | | | | | | | | | | | | | When processing receive buffer, write the amount of data, expected in present request record, into socket's so_rcv.sb_lowat to make stack aware about our needs. When processing following upcalls, ignore them until socket collect enough data to be read and processed in one turn. This change reduces number of context switches and other operations in RPC stack during large NFS writes (especially via non-Jumbo networks) by order of magnitude. After precessing current packet, take another look into the pending buffer to find out whether the next packet had been already received. If not, deactivate this port right there without making RPC code to push this port to another thread just to find that there is nothing. If the next packet is received partially, also deactivate the port, but also update socket's so_rcv.sb_lowat to not be woken up prematurely. This change additionally reduces number of context switches per NFS request about in half.
* Replace Sun Industry Standards Source License for Sun RPC code with ahrs2013-11-251-42/+24
| | | | | | 3-clause BSD license as specified by Oracle America, Inc. in 2010. This license change was approved by Wim Coekaerts, Senior Vice President, Linux and Virtualization at Oracle Corporation.
* Replace Sun RPC license in TI-RPC library with a 3-clause BSD license,hrs2013-11-251-26/+25
| | | | with the explicit permission of Sun Microsystems in 2009.
* Replace Sun RPC license in TI-RPC library with a 3-clause BSD license,hrs2013-11-2528-744/+699
| | | | with the explicit permission of Sun Microsystems in 2009.
* Some minor tuning to rpc/svc.c:mav2013-11-141-21/+27
| | | | | | | - close cosmetic race in svc_exit(); - do not set wait timeout for idle threads if we have no use for wakeups; - create new requested thread sooner, not only after some another thread wakeup, that may happen later under constant load.
* It was reported via email that the cu_sent field used by thermacklem2013-09-061-0/+2
| | | | | | | | | | | | | | | krpc client side UDP was observed as way out of range and caused the rpc.lockd daemon to hang trying to do an RPC. Inspection of the code found two places where the RPC request is re-queued, but the value of cu_sent was not incremented. Since cu_sent is always decremented when the RPC request is dequeued, I think this could have caused cu_sent to go out of range. This patch adds lines to increment cu_sent for these two cases. Reported by: dwhite@ixsystems.com Discussed with: dwhite@ixsystems.com MFC after: 2 weeks
* Add support for host-based (Kerberos 5 service principal) initiatorrmacklem2013-07-092-18/+127
| | | | | | | | credentials to the kernel rpc. Modify the NFSv4 client to add support for the gssname and allgssname mount options to use this capability. Requires the gssd daemon to be running with the "-h" option. Reviewed by: jhb
* Fix a potential socket leak in the NFS server. If a client closes itsjhb2013-04-081-1/+4
| | | | | | | | | | | | | | connection after it was accepted by the userland nfsd process but before it was handled off to svc_vc_create() in the kernel, then svc_vc_create() would see it as a new listen socket and try to listen on it leaving a dangling reference to the socket. Instead, check for disconnected sockets and treat them like a connected socket. The call to pru_getaddr() should fail and cause svc_vc_create() to fail. Note that we need to lock the socket to get a consistent snapshot of so_state since there is a window in soisdisconnected() where both flags are clear. Reviewed by: dfr, rmacklem MFC after: 1 week
* Improve error handling when unwrapping received data.gnn2013-04-041-1/+16
| | | | | Submitted by: Rick Macklem MFC after: 1 week
* Revert 195703 and 195821 as this special stop handling in NFS is nowjhb2013-03-132-5/+3
| | | | | implemented via VFCF_SBDRY rather than passing PBDRY to individual sleep calls.
* Use m_get(), m_gethdr() and m_getcl() instead of historic macros.glebius2013-03-127-15/+8
| | | | Sponsored by: Nginx, Inc.
* Add support for backchannels to the kernel RPC. Backchannelsrmacklem2012-12-086-98/+405
| | | | | | | | | | | | are used by NFSv4.1 for callbacks. A backchannel is a connection established by the client, but used for RPCs done by the server on the client (callbacks). As a result, this patch mixes some client side calls in the server side and vice versa. Some definitions in the .c files were extracted out into a file called krpc.h, so that they could be included in multiple .c files. This code has been in projects/nfsv4.1-client for some time. Although no one has given it a formal review, I believe kib@ has taken a look at it.
* Mechanically substitute flags from historic mbuf allocator withglebius2012-12-058-14/+14
| | | | | | | | | malloc(9) flags within sys. Exceptions: - sys/contrib not touched - sys/mbuf.h edited manually
* Modify the comment to take out the names and URL.rmacklem2012-10-251-6/+3
| | | | | Requested by: kib MFC after: 3 days
* Add a comment describing why r241097 was done.rmacklem2012-10-151-0/+11
| | | | | Suggested by: rwatson MFC after: 1 week
* rpc: convert all uid and gid variables to u_int.pfg2012-10-041-4/+4
| | | | | | | | | | | After further discussion, instead of pretending to use uid_t and gid_t as upstream Solaris and linux try to, we are better using u_int, which is in fact what the code can handle and best approaches the range of values used by uid and gid. Discussed with: bde Reviewed by: bde
* libtirpc: be sure to free cl_netid and cl_tppfg2012-10-021-0/+4
| | | | | | | | | | | | | When creating a client with clnt_tli_create, it uses strdup to copy strings for these fields if nconf is passed in. clnt_dg_destroy frees these strings already. Make sure clnt_vc_destroy frees them in the same way. This change matches the reference (OpenSolaris) implementation. Tested by: David Wolfskill Obtained from: Bull GNU/Linux NFSv4 Project (libtirpc) MFC after: 2 weeks
* RPC: Convert all uid and gid variables of the type uid_t and gid_t.pfg2012-10-021-5/+4
| | | | | | | | This matches what upstream (OpenSolaris) does. Tested by: David Wolfskill Obtained from: Bull GNU/Linux NFSv4 project (libtirpc) MFC after: 3 days
* Attila Bogar and Herbert Poeckl both reported similar problemsrmacklem2012-10-011-3/+4
| | | | | | | | | | | | | | w.r.t. a Linux NFS client doing a krb5 NFS mount against the FreeBSD server. We determined this was a Linux bug: http://www.spinics.net/lists/linux-nfs/msg32466.html, however the mount failed to work, because the Destroy operation with a bogus encrypted checksum destroyed the authenticator handle. This patch changes the rpcsec_gss code so that it doesn't Destroy the authenticator handle for this case and, as such, the Linux mount will work. Tested by: Attila Bogar and Herbert Poeckl MFC after: 2 weeks
* Complete revert of r239963:pfg2012-09-272-11/+5
| | | | | | | | | | | | | | | The attempt to merge changes from the linux libtirpc caused rpc.lockd to exit after startup under unclear conditions. After many hours of selective experiments and inconsistent results the conclusion is that it's better to just revert everything and restart in a future time with a much smaller subset of the changes. ____ MFC after: 3 days Reported by: David Wolfskill Tested by: David Wolfskill
* Partial revert of r239963:pfg2012-09-241-4/+0
| | | | | | | | | | | | | | | | | The following change caused rpc.lockd to exit after startup: ____ libtirpc: be sure to free cl_netid and cl_tp When creating a client with clnt_tli_create, it uses strdup to copy strings for these fields if nconf is passed in. clnt_dg_destroy frees these strings already. Make sure clnt_vc_destroy frees them in the same way. ____ MFC after: 3 days Reported by: David Wolfskill Tested by: David Wolfskill
* Fix RPC headers for C++pfg2012-09-022-12/+12
| | | | | | | | | C++ mangling will cause trouble with variables like __rpc_xdr in xdr.h so rename this to XDR. While here add proper C++ guards to RPC headers. PR: 137443 MFC after: 2 weeks
* Bring some changes from Bull's NFSv4 libtirpc implementation.pfg2012-09-013-5/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We especifically ignored the glibc compatibility changes but this should help interaction with Solaris and Linux. ____ Fixed infinite loop in svc_run() author Steve Dickson Tue, 10 Jun 2008 12:35:52 -0500 (13:35 -0400) Fixed infinite loop in svc_run() ____ __rpc_taddr2uaddr_af() assumes the netbuf to always have a non-zero data. This is a bad assumption and can lead to a seg-fault. This patch adds a check for zero length and returns NULL when found. author Steve Dickson Mon, 27 Oct 2008 11:46:54 -0500 (12:46 -0400) ____ Changed clnt_spcreateerror() to return clearer and more concise error messages. author Steve Dickson Thu, 20 Nov 2008 08:55:31 -0500 (08:55 -0500) ____ Converted all uid and gid variables of the type uid_t and gid_t. author Steve Dickson Wed, 28 Jan 2009 12:44:46 -0500 (12:44 -0500) ____ libtirpc: set r_netid and r_owner in __rpcb_findaddr_timed These fields in the rpcbind GETADDR call are being passed uninitialized to CLNT_CALL. In the case of x86_64 at least, this usually leads to a segfault. On x86, it sometimes causes segfaults and other times causes garbage to be sent on the wire. rpcbind generally ignores the r_owner field for calls that come in over the wire, so it really doesn't matter what we send in that slot. We just need to send something. The reference implementation from Sun seems to send a blank string. Have ours follow suit. author Jeff Layton Fri, 13 Mar 2009 11:44:16 -0500 (12:44 -0400) ____ libtirpc: be sure to free cl_netid and cl_tp When creating a client with clnt_tli_create, it uses strdup to copy strings for these fields if nconf is passed in. clnt_dg_destroy frees these strings already. Make sure clnt_vc_destroy frees them in the same way. author Jeff Layton Fri, 13 Mar 2009 11:47:36 -0500 (12:47 -0400) Obtained from: Bull GNU/Linux NFSv4 Project MFC after: 3 weeks
* Both a crash reported on freebsd-current on Oct. 18 under thermacklem2011-11-031-1/+2
| | | | | | | | | | | | | | | | | | | | | | | subject heading "mtx_lock() of destroyed mutex on NFS" and PR# 156168 appear to be caused by clnt_dg_destroy() closing down the socket prematurely. When to close down the socket is controlled by a reference count (cs_refs), but clnt_dg_create() checks for sb_upcall being non-NULL to decide if a new socket is needed. I believe the crashes were caused by the following race: clnt_dg_destroy() finds cs_refs == 0 and decides to delete socket clnt_dg_destroy() then loses race with clnt_dg_create() for acquisition of the SOCKBUF_LOCK() clnt_dg_create() finds sb_upcall != NULL and increments cs_refs to 1 clnt_dg_destroy() then acquires SOCKBUF_LOCK(), sets sb_upcall to NULL and destroys socket This patch fixes the above race by changing clnt_dg_destroy() so that it acquires SOCKBUF_LOCK() before testing cs_refs. Tested by: bz PR: 156168 Reviewed by: dfr MFC after: 2 weeks
* Remove an extraneous "already" from a comment introduced by r226081.rmacklem2011-10-071-1/+1
| | | | | Submitted by: bf1783 at googlemail.com MFC after: 3 days
* A crash reported on freebsd-fs@ on Sep. 23, 2011 under the subjectrmacklem2011-10-071-10/+48
| | | | | | | | | | | | | | | | | | | | | heading "kernel panics with RPCSEC_GSS" appears to be caused by a corrupted tailq list for the client structure. Looking at the code, calls to the function svc_rpc_gss_forget_client() were done in an SMP unsafe manner, with the svc_rpc_gss_lock only being acquired in the function and not before it. As such, when multiple threads called svc_rpc_gss_forget_client() concurrently, it could try and remove the same client structure from the tailq lists multiple times. The patch fixes this by moving the critical code into a separate function called svc_rpc_gss_forget_client_locked(), which must be called with the lock held. For the one case where the caller would have no interest in the lock, svc_rpc_gss_forget_client() was retained, but a loop was added to check that the client structure is still in the tailq lists before removing it, to make it safe for multiple concurrent calls. Tested by: clinton.adams at gmail.com (earlier version) Reviewed by: zkirsch MFC after: 3 days
* Make sure RPC calls over UDP return RPC_INTR status is the process hasart2011-08-281-2/+5
| | | | | | | | | | been interrupted in a restartable syscall. Otherwise we could end up in an (almost) endless loop in clnt_reconnect_call(). PR: kern/160198 Reviewed by: rmacklem Approved by: re (kib), avg (mentor) MFC after: 1 week
* Fix the kgssapi so that it can be loaded as a module. Currentlyrmacklem2011-06-192-0/+269
| | | | | | | | | | | | | the NFS subsystems use five of the rpcsec_gss/kgssapi entry points, but since it was not obvious which others might be useful, all nineteen were included. Basically the nineteen entry points are set in a structure called rpc_gss_entries and inline functions defined in sys/rpc/rpcsec_gss.h check for the entry points being non-NULL and then call them. A default value is returned otherwise. Requested by rwatson. Reviewed by: jhb MFC after: 2 weeks
OpenPOWER on IntegriCloud