2021-03-16 07:07:11 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright ( C ) 2019 Samsung Electronics Co . , Ltd .
*/
# include <linux/list.h>
# include <linux/mm.h>
# include <linux/slab.h>
# include <linux/workqueue.h>
# include "server.h"
# include "connection.h"
# include "ksmbd_work.h"
# include "mgmt/ksmbd_ida.h"
static struct kmem_cache * work_cache ;
static struct workqueue_struct * ksmbd_wq ;
struct ksmbd_work * ksmbd_alloc_work_struct ( void )
{
struct ksmbd_work * work = kmem_cache_zalloc ( work_cache , GFP_KERNEL ) ;
if ( work ) {
work - > compound_fid = KSMBD_NO_FID ;
work - > compound_pfid = KSMBD_NO_FID ;
INIT_LIST_HEAD ( & work - > request_entry ) ;
INIT_LIST_HEAD ( & work - > async_request_entry ) ;
INIT_LIST_HEAD ( & work - > fp_entry ) ;
INIT_LIST_HEAD ( & work - > interim_entry ) ;
}
return work ;
}
void ksmbd_free_work_struct ( struct ksmbd_work * work )
{
WARN_ON ( work - > saved_cred ! = NULL ) ;
2021-06-18 04:17:37 +03:00
kvfree ( work - > response_buf ) ;
kvfree ( work - > aux_payload_buf ) ;
2021-04-02 06:47:14 +03:00
kfree ( work - > tr_buf ) ;
kvfree ( work - > request_buf ) ;
2021-03-16 07:07:11 +03:00
if ( work - > async_id )
2021-04-13 07:06:30 +03:00
ksmbd_release_id ( & work - > conn - > async_ida , work - > async_id ) ;
2021-03-16 07:07:11 +03:00
kmem_cache_free ( work_cache , work ) ;
}
void ksmbd_work_pool_destroy ( void )
{
kmem_cache_destroy ( work_cache ) ;
}
int ksmbd_work_pool_init ( void )
{
work_cache = kmem_cache_create ( " ksmbd_work_cache " ,
2021-05-26 11:57:12 +03:00
sizeof ( struct ksmbd_work ) , 0 ,
SLAB_HWCACHE_ALIGN , NULL ) ;
2021-03-16 07:07:11 +03:00
if ( ! work_cache )
return - ENOMEM ;
return 0 ;
}
int ksmbd_workqueue_init ( void )
{
ksmbd_wq = alloc_workqueue ( " ksmbd-io " , 0 , 0 ) ;
if ( ! ksmbd_wq )
return - ENOMEM ;
return 0 ;
}
void ksmbd_workqueue_destroy ( void )
{
destroy_workqueue ( ksmbd_wq ) ;
ksmbd_wq = NULL ;
}
bool ksmbd_queue_work ( struct ksmbd_work * work )
{
return queue_work ( ksmbd_wq , & work - > work ) ;
}