Merge branch 'osd-devel' into nfs-for-next
Этот коммит содержится в:
@@ -122,7 +122,7 @@ gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx)
|
||||
if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
|
||||
return;
|
||||
gss_get_ctx(ctx);
|
||||
rcu_assign_pointer(gss_cred->gc_ctx, ctx);
|
||||
RCU_INIT_POINTER(gss_cred->gc_ctx, ctx);
|
||||
set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
|
||||
smp_mb__before_clear_bit();
|
||||
clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags);
|
||||
@@ -950,7 +950,7 @@ gss_destroy_nullcred(struct rpc_cred *cred)
|
||||
struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth);
|
||||
struct gss_cl_ctx *ctx = gss_cred->gc_ctx;
|
||||
|
||||
rcu_assign_pointer(gss_cred->gc_ctx, NULL);
|
||||
RCU_INIT_POINTER(gss_cred->gc_ctx, NULL);
|
||||
call_rcu(&cred->cr_rcu, gss_free_cred_callback);
|
||||
if (ctx)
|
||||
gss_put_ctx(ctx);
|
||||
|
@@ -1104,3 +1104,6 @@ void unregister_rpc_pipefs(void)
|
||||
kmem_cache_destroy(rpc_inode_cachep);
|
||||
unregister_filesystem(&rpc_pipe_fs_type);
|
||||
}
|
||||
|
||||
/* Make 'mount -t rpc_pipefs ...' autoload this module. */
|
||||
MODULE_ALIAS("rpc_pipefs");
|
||||
|
@@ -295,6 +295,18 @@ svc_pool_map_put(void)
|
||||
}
|
||||
|
||||
|
||||
static int svc_pool_map_get_node(unsigned int pidx)
|
||||
{
|
||||
const struct svc_pool_map *m = &svc_pool_map;
|
||||
|
||||
if (m->count) {
|
||||
if (m->mode == SVC_POOL_PERCPU)
|
||||
return cpu_to_node(m->pool_to[pidx]);
|
||||
if (m->mode == SVC_POOL_PERNODE)
|
||||
return m->pool_to[pidx];
|
||||
}
|
||||
return NUMA_NO_NODE;
|
||||
}
|
||||
/*
|
||||
* Set the given thread's cpus_allowed mask so that it
|
||||
* will only run on cpus in the given pool.
|
||||
@@ -541,7 +553,7 @@ EXPORT_SYMBOL_GPL(svc_destroy);
|
||||
* We allocate pages and place them in rq_argpages.
|
||||
*/
|
||||
static int
|
||||
svc_init_buffer(struct svc_rqst *rqstp, unsigned int size)
|
||||
svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node)
|
||||
{
|
||||
unsigned int pages, arghi;
|
||||
|
||||
@@ -555,7 +567,7 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size)
|
||||
arghi = 0;
|
||||
BUG_ON(pages > RPCSVC_MAXPAGES);
|
||||
while (pages) {
|
||||
struct page *p = alloc_page(GFP_KERNEL);
|
||||
struct page *p = alloc_pages_node(node, GFP_KERNEL, 0);
|
||||
if (!p)
|
||||
break;
|
||||
rqstp->rq_pages[arghi++] = p;
|
||||
@@ -578,11 +590,11 @@ svc_release_buffer(struct svc_rqst *rqstp)
|
||||
}
|
||||
|
||||
struct svc_rqst *
|
||||
svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool)
|
||||
svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
|
||||
{
|
||||
struct svc_rqst *rqstp;
|
||||
|
||||
rqstp = kzalloc(sizeof(*rqstp), GFP_KERNEL);
|
||||
rqstp = kzalloc_node(sizeof(*rqstp), GFP_KERNEL, node);
|
||||
if (!rqstp)
|
||||
goto out_enomem;
|
||||
|
||||
@@ -596,15 +608,15 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool)
|
||||
rqstp->rq_server = serv;
|
||||
rqstp->rq_pool = pool;
|
||||
|
||||
rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL);
|
||||
rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
|
||||
if (!rqstp->rq_argp)
|
||||
goto out_thread;
|
||||
|
||||
rqstp->rq_resp = kmalloc(serv->sv_xdrsize, GFP_KERNEL);
|
||||
rqstp->rq_resp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
|
||||
if (!rqstp->rq_resp)
|
||||
goto out_thread;
|
||||
|
||||
if (!svc_init_buffer(rqstp, serv->sv_max_mesg))
|
||||
if (!svc_init_buffer(rqstp, serv->sv_max_mesg, node))
|
||||
goto out_thread;
|
||||
|
||||
return rqstp;
|
||||
@@ -689,6 +701,7 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||
struct svc_pool *chosen_pool;
|
||||
int error = 0;
|
||||
unsigned int state = serv->sv_nrthreads-1;
|
||||
int node;
|
||||
|
||||
if (pool == NULL) {
|
||||
/* The -1 assumes caller has done a svc_get() */
|
||||
@@ -704,14 +717,16 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||
nrservs--;
|
||||
chosen_pool = choose_pool(serv, pool, &state);
|
||||
|
||||
rqstp = svc_prepare_thread(serv, chosen_pool);
|
||||
node = svc_pool_map_get_node(chosen_pool->sp_id);
|
||||
rqstp = svc_prepare_thread(serv, chosen_pool, node);
|
||||
if (IS_ERR(rqstp)) {
|
||||
error = PTR_ERR(rqstp);
|
||||
break;
|
||||
}
|
||||
|
||||
__module_get(serv->sv_module);
|
||||
task = kthread_create(serv->sv_function, rqstp, serv->sv_name);
|
||||
task = kthread_create_on_node(serv->sv_function, rqstp,
|
||||
node, serv->sv_name);
|
||||
if (IS_ERR(task)) {
|
||||
error = PTR_ERR(task);
|
||||
module_put(serv->sv_module);
|
||||
@@ -998,9 +1013,8 @@ static void svc_unregister(const struct svc_serv *serv)
|
||||
/*
|
||||
* Printk the given error with the address of the client that caused it.
|
||||
*/
|
||||
static int
|
||||
__attribute__ ((format (printf, 2, 3)))
|
||||
svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
|
||||
static __printf(2, 3)
|
||||
int svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
int r;
|
||||
|
@@ -254,8 +254,6 @@ EXPORT_SYMBOL_GPL(svc_create_xprt);
|
||||
*/
|
||||
void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt)
|
||||
{
|
||||
struct sockaddr *sin;
|
||||
|
||||
memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen);
|
||||
rqstp->rq_addrlen = xprt->xpt_remotelen;
|
||||
|
||||
@@ -263,15 +261,8 @@ void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt)
|
||||
* Destination address in request is needed for binding the
|
||||
* source address in RPC replies/callbacks later.
|
||||
*/
|
||||
sin = (struct sockaddr *)&xprt->xpt_local;
|
||||
switch (sin->sa_family) {
|
||||
case AF_INET:
|
||||
rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr;
|
||||
break;
|
||||
case AF_INET6:
|
||||
rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr;
|
||||
break;
|
||||
}
|
||||
memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen);
|
||||
rqstp->rq_daddrlen = xprt->xpt_locallen;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs);
|
||||
|
||||
|
@@ -143,19 +143,20 @@ static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh)
|
||||
cmh->cmsg_level = SOL_IP;
|
||||
cmh->cmsg_type = IP_PKTINFO;
|
||||
pki->ipi_ifindex = 0;
|
||||
pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;
|
||||
pki->ipi_spec_dst.s_addr =
|
||||
svc_daddr_in(rqstp)->sin_addr.s_addr;
|
||||
cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
|
||||
}
|
||||
break;
|
||||
|
||||
case AF_INET6: {
|
||||
struct in6_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp);
|
||||
|
||||
cmh->cmsg_level = SOL_IPV6;
|
||||
cmh->cmsg_type = IPV6_PKTINFO;
|
||||
pki->ipi6_ifindex = 0;
|
||||
ipv6_addr_copy(&pki->ipi6_addr,
|
||||
&rqstp->rq_daddr.addr6);
|
||||
pki->ipi6_ifindex = daddr->sin6_scope_id;
|
||||
ipv6_addr_copy(&pki->ipi6_addr, &daddr->sin6_addr);
|
||||
cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
|
||||
}
|
||||
break;
|
||||
@@ -498,9 +499,13 @@ static int svc_udp_get_dest_address4(struct svc_rqst *rqstp,
|
||||
struct cmsghdr *cmh)
|
||||
{
|
||||
struct in_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in *daddr = svc_daddr_in(rqstp);
|
||||
|
||||
if (cmh->cmsg_type != IP_PKTINFO)
|
||||
return 0;
|
||||
rqstp->rq_daddr.addr.s_addr = pki->ipi_spec_dst.s_addr;
|
||||
|
||||
daddr->sin_family = AF_INET;
|
||||
daddr->sin_addr.s_addr = pki->ipi_spec_dst.s_addr;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -511,9 +516,14 @@ static int svc_udp_get_dest_address6(struct svc_rqst *rqstp,
|
||||
struct cmsghdr *cmh)
|
||||
{
|
||||
struct in6_pktinfo *pki = CMSG_DATA(cmh);
|
||||
struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp);
|
||||
|
||||
if (cmh->cmsg_type != IPV6_PKTINFO)
|
||||
return 0;
|
||||
ipv6_addr_copy(&rqstp->rq_daddr.addr6, &pki->ipi6_addr);
|
||||
|
||||
daddr->sin6_family = AF_INET6;
|
||||
ipv6_addr_copy(&daddr->sin6_addr, &pki->ipi6_addr);
|
||||
daddr->sin6_scope_id = pki->ipi6_ifindex;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -614,6 +624,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
rqstp->rq_daddrlen = svc_addr_len(svc_daddr(rqstp));
|
||||
|
||||
if (skb_is_nonlinear(skb)) {
|
||||
/* we have to copy */
|
||||
|
Ссылка в новой задаче
Block a user