nsm
static int fill_req_raw(struct nsm *nsm, struct nsm_data_req *req,
static int parse_resp_raw(struct nsm *nsm, struct nsm_data_resp *resp,
struct nsm *nsm = vq->vdev->priv;
complete(&nsm->cmd_done);
static int nsm_sendrecv_msg_locked(struct nsm *nsm)
struct device *dev = &nsm->vdev->dev;
struct nsm_msg *msg = &nsm->msg;
struct virtqueue *vq = nsm->vq;
init_completion(&nsm->cmd_done);
if (!wait_for_completion_io_timeout(&nsm->cmd_done,
static int fill_req_get_random(struct nsm *nsm, struct nsm_data_req *req)
static int parse_resp_get_random(struct nsm *nsm, struct nsm_data_resp *resp,
struct device *dev = &nsm->vdev->dev;
struct nsm *nsm = hwrng_to_nsm(rng);
struct device *dev = &nsm->vdev->dev;
mutex_lock(&nsm->lock);
rc = fill_req_get_random(nsm, &nsm->msg.req);
rc = nsm_sendrecv_msg_locked(nsm);
rc = parse_resp_get_random(nsm, &nsm->msg.resp, data, max);
mutex_unlock(&nsm->lock);
struct nsm *nsm = file_to_nsm(file);
mutex_lock(&nsm->lock);
r = fill_req_raw(nsm, &nsm->msg.req, &raw);
r = nsm_sendrecv_msg_locked(nsm);
r = parse_resp_raw(nsm, &nsm->msg.resp, &raw);
mutex_unlock(&nsm->lock);
struct nsm *nsm = vdev->priv;
nsm->vq = vq;
struct nsm *nsm;
nsm = devm_kzalloc(&vdev->dev, sizeof(*nsm), GFP_KERNEL);
if (!nsm)
vdev->priv = nsm;
nsm->vdev = vdev;
mutex_init(&nsm->lock);
nsm->hwrng = (struct hwrng) {
rc = hwrng_register(&nsm->hwrng);
nsm->misc = (struct miscdevice) {
rc = misc_register(&nsm->misc);
hwrng_unregister(&nsm->hwrng);
struct nsm *nsm = vdev->priv;
hwrng_unregister(&nsm->hwrng);
misc_deregister(&nsm->misc);
static struct nsm *file_to_nsm(struct file *file)
return container_of(file->private_data, struct nsm, misc);
static struct nsm *hwrng_to_nsm(struct hwrng *rng)
return container_of(rng, struct nsm, hwrng);
struct rpmsg_ns_msg nsm;
strscpy_pad(nsm.name, rpdev->id.name, sizeof(nsm.name));
nsm.addr = cpu_to_rpmsg32(rpdev, rpdev->ept->addr);
nsm.flags = cpu_to_rpmsg32(rpdev, RPMSG_NS_CREATE);
err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR);
struct rpmsg_ns_msg nsm;
strscpy_pad(nsm.name, rpdev->id.name, sizeof(nsm.name));
nsm.addr = cpu_to_rpmsg32(rpdev, rpdev->ept->addr);
nsm.flags = cpu_to_rpmsg32(rpdev, RPMSG_NS_DESTROY);
err = rpmsg_sendto(rpdev->ept, &nsm, sizeof(nsm), RPMSG_NS_ADDR);
struct nsm_handle *nsm)
if (nsm != NULL)
refcount_inc(&nsm->sm_count);
nsm = nsm_get_handle(ni->net, ni->sap, ni->salen,
if (unlikely(nsm == NULL)) {
nsm_release(nsm);
host->h_name = nsm->sm_name;
host->h_nsmhandle = nsm;
host->h_addrbuf = nsm->sm_addrbuf;
struct nsm_handle *nsm = NULL;
if (nsm == NULL)
nsm = host->h_nsmhandle;
host = nlm_alloc_host(&ni, nsm);
struct nsm_handle *nsm = NULL;
if (nsm == NULL)
nsm = host->h_nsmhandle;
host = nlm_alloc_host(&ni, nsm);
struct nsm_handle *nsm,
if (host->h_nsmhandle == nsm
struct nsm_handle *nsm;
nsm = nsm_reboot_lookup(net, info);
if (unlikely(nsm == NULL))
while ((host = next_host_state(nlm_server_hosts, nsm, info)) != NULL) {
while ((host = next_host_state(nlm_client_hosts, nsm, info)) != NULL) {
nsm_release(nsm);
.mon_name = nsm->sm_mon_name,
struct nsm_handle *nsm = host->h_nsmhandle;
dprintk("lockd: nsm_monitor(%s)\n", nsm->sm_name);
if (nsm->sm_monitored)
nsm->sm_mon_name = nsm_use_hostnames ? nsm->sm_name : nsm->sm_addrbuf;
status = nsm_mon_unmon(nsm, NSMPROC_MON, &res, host);
pr_notice_ratelimited("lockd: cannot monitor %s\n", nsm->sm_name);
nsm->sm_monitored = 1;
struct nsm_handle *nsm = host->h_nsmhandle;
if (refcount_read(&nsm->sm_count) == 1
&& nsm->sm_monitored && !nsm->sm_sticky) {
dprintk("lockd: nsm_unmonitor(%s)\n", nsm->sm_name);
status = nsm_mon_unmon(nsm, NSMPROC_UNMON, &res, host);
nsm->sm_name);
nsm->sm_monitored = 0;
struct nsm_handle *nsm;
list_for_each_entry(nsm, nsm_handles, sm_link)
if (strlen(nsm->sm_name) == len &&
memcmp(nsm->sm_name, hostname, len) == 0)
return nsm;
struct nsm_handle *nsm;
list_for_each_entry(nsm, nsm_handles, sm_link)
if (rpc_cmp_addr(nsm_addr(nsm), sap))
return nsm;
struct nsm_handle *nsm;
list_for_each_entry(nsm, nsm_handles, sm_link)
if (memcmp(nsm->sm_priv.data, priv->data,
return nsm;
static void nsm_init_private(struct nsm_handle *nsm)
u64 *p = (u64 *)&nsm->sm_priv.data;
put_unaligned((unsigned long)nsm, p + 1);
void nsm_release(struct nsm_handle *nsm)
if (refcount_dec_and_lock(&nsm->sm_count, &nsm_lock)) {
list_del(&nsm->sm_link);
nsm->sm_name, nsm->sm_addrbuf);
kfree(nsm);
static inline struct sockaddr *nsm_addr(const struct nsm_handle *nsm)
return (struct sockaddr *)&nsm->sm_addr;
static int nsm_mon_unmon(struct nsm_handle *nsm, u32 proc, struct nsm_res *res,
.priv = &nsm->sm_priv,
void nsm_release(struct nsm_handle *nsm);